bengor-user/doctrine-odm-mongodb-bridge
Doctrine ODM MongoDB bridge for BenGorUser, providing adapters to persist and query User domain models with Doctrine ODM. Install via Composer; fully tested with PHPSpec. Documentation lives in the main BenGorUser/User repository.
Install Dependencies
composer require bengor-user/doctrine-odm-mongodb-bridge doctrine/mongodb-odm
Configure Doctrine ODM
Add to config/doctrine.php (or equivalent):
'odm' => [
'connections' => [
'default' => [
'servers' => ['mongodb://localhost:27017'],
'options' => [],
'document_managers' => ['default'],
],
],
'document_managers' => [
'default' => [
'connection' => 'default',
'mappings' => [
'App' => [
'type' => 'annotation',
'prefix' => 'App\\Models',
'bridge' => 'BenGorUser\DoctrineODMMongoDBBridge\Bridge',
],
],
],
],
],
Extend User Model
use BenGorUser\UserBundle\Model\User;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
#[ODM\Document]
class AppUser extends User
{
// Custom fields here
}
First Query
$dm = \Doctrine\ODM\MongoDB\DocumentManager::create($config);
$user = $dm->getRepository('AppUser')->find(1);
Use UserRepository Interface
The bridge implements BenGorUser\UserBundle\Repository\UserRepository, so leverage its methods:
$users = $dm->getRepository('AppUser')->all(); // Uses bridge's `all()` method
$user = $dm->getRepository('AppUser')->findOneByEmail('test@example.com');
Custom Query Methods Extend the repository for MongoDB-specific queries:
use Doctrine\ODM\MongoDB\Query\Builder;
class AppUserRepository extends \BenGorUser\DoctrineODMMongoDBBridge\Repository\UserRepository
{
public function findByRole(string $role)
{
$query = $this->createQueryBuilder('u')
->field('roles')->equals($role)
->getQuery();
return $query->execute();
}
}
prePersist, preUpdate, etc.:
$dm->getEventManager()->addEventListener(
\Doctrine\ODM\MongoDB\Events::prePersist,
function ($event) {
$user = $event->getDocument();
if (!$user->getPassword()) {
$user->setPassword('default');
}
}
);
// Authenticate with ODM User
$dm = \Doctrine\ODM\MongoDB\DocumentManager::create($config);
$user = $dm->getRepository('AppUser')->findOneByEmail($email);
// Use Eloquent for other logic
$profile = new AppProfile();
$profile->user_id = $user->getId();
$profile->save();
Field Mapping Conflicts
@Field annotations, but BenGorUser expects getters/setters. Ensure consistency:
#[ODM\Field(type: 'string')]
private $email;
// Must match BenGorUser's expected method names
public function getEmail(): ?string { return $this->email; }
public function setEmail(string $email): void { $this->email = $email; }
Outdated Interface
BenGorUser v0.8. If using a newer version, check for breaking changes in:
UserRepository methods (e.g., findOneByEmail signature).prePersist vs. preSave).MongoDB Schema Validation
@ODM\Field(required: false) for optional fields.Enable ODM Logging
Add to config/doctrine.php:
'odm' => [
'document_managers' => [
'default' => [
'logging' => true,
'logging_level' => \Doctrine\ODM\MongoDB\Logging\Logger::DEBUG,
],
],
],
Check logs in storage/logs/laravel.log for query details.
Validate Document State
Use $dm->getUnitOfWork()->getDocumentState($document) to debug hydration issues.
Custom Document Hydration
Override BenGorUser\DoctrineODMMongoDBBridge\Bridge to modify how documents are hydrated:
class CustomBridge extends \BenGorUser\DoctrineODMMongoDBBridge\Bridge
{
public function hydrate(UserInterface $user, array $data)
{
parent::hydrate($user, $data);
// Custom logic (e.g., map legacy fields)
}
}
Register in config/doctrine.php:
'mappings' => [
'App' => [
'bridge' => 'App\CustomBridge',
],
],
Add MongoDB-Specific Fields Extend the User model with ODM annotations:
#[ODM\Field(type: 'date')]
private $lastLogin;
public function getLastLogin(): ?\DateTimeInterface { return $this->lastLogin; }
public function setLastLogin(?\DateTimeInterface $lastLogin): void { $this->lastLogin = $lastLogin; }
Bulk Operations Use ODM’s bulk API for performance-critical operations:
$bulk = $dm->createBulkOperation();
$bulk->update()->field('status')->set('active')->getQuery()->execute();
How can I help you explore Laravel packages today?