Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Doctrine Odm Mongodb Bridge Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup for Laravel + Doctrine ODM

  1. Install Dependencies

    composer require bengor-user/doctrine-odm-mongodb-bridge doctrine/mongodb-odm
    
  2. 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',
                    ],
                ],
            ],
        ],
    ],
    
  3. 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
    }
    
  4. First Query

    $dm = \Doctrine\ODM\MongoDB\DocumentManager::create($config);
    $user = $dm->getRepository('AppUser')->find(1);
    

Implementation Patterns

Repository Integration

  • 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();
        }
    }
    

Event Listeners

  • Hook into User Events Register listeners for prePersist, preUpdate, etc.:
    $dm->getEventManager()->addEventListener(
        \Doctrine\ODM\MongoDB\Events::prePersist,
        function ($event) {
            $user = $event->getDocument();
            if (!$user->getPassword()) {
                $user->setPassword('default');
            }
        }
    );
    

Hybrid ORM Workflows

  • Combine Eloquent + ODM Use the bridge for authentication while keeping Eloquent for other models:
    // 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();
    

Gotchas and Tips

Common Pitfalls

  1. Field Mapping Conflicts

    • Doctrine ODM uses @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; }
      
  2. Outdated Interface

    • The bridge targets BenGorUser v0.8. If using a newer version, check for breaking changes in:
      • UserRepository methods (e.g., findOneByEmail signature).
      • Event names (e.g., prePersist vs. preSave).
  3. MongoDB Schema Validation

    • ODM enforces schema validation. If a field is missing in the document but exists in the User model, queries will fail. Use @ODM\Field(required: false) for optional fields.

Debugging Tips

  • 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.

Extension Points

  1. 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',
        ],
    ],
    
  2. 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; }
    
  3. Bulk Operations Use ODM’s bulk API for performance-critical operations:

    $bulk = $dm->createBulkOperation();
    $bulk->update()->field('status')->set('active')->getQuery()->execute();
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
nasirkhan/laravel-sharekit
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony