bengor-user/doctrine-odm-mongodb-bridge-bundle
Install Dependencies:
composer require bengor-user/doctrine-odm-mongodb-bridge-bundle
composer require doctrine/mongodb-odm-bundle
composer require friendsofsymfony/user-bundle
Ensure doctrine/mongodb-odm-bundle and friendsofsymfony/user-bundle are also installed, as this bridge depends on them.
Enable Bundles in config/bundles.php:
return [
// ...
Doctrine\ODM\MongoDBBundle\DoctrineMongoDBBundle::class => ['all' => true],
FriendsOfSymfony\UserBundle\FriendsOfSymfonyUserBundle::class => ['all' => true],
BenGorUser\DoctrineODMMongoDBBridgeBundle\DoctrineODMMongoDBBridgeBundle::class => ['all' => true],
];
Configure MongoDB ODM in config/packages/doctrine_mongodb_odm.yaml:
doctrine_mongodb:
connections:
default:
server: "%env(MONGODB_URL)%"
options: {}
document_managers:
default:
auto_mapping: true
mappings:
App:
is_bundle: false
dir: "%kernel.project_dir%/src/Document"
prefix: "App\Document"
Extend User Document:
Create a User document in src/Document/User.php:
namespace App\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use FriendsOfSymfony\UserBundle\Model\User as BaseUser;
/**
* @ODM\Document(collection="users")
*/
class User extends BaseUser
{
// Custom fields or overrides
}
Update UserBundle Configuration in config/packages/fos_user.yaml:
fos_user:
db_driver: odm_mongodb
firewall_name: main
user_class: App\Document\User
Run Migrations:
php bin/console doctrine:mongodb:schema:update --force
Use the bundle to authenticate a user via MongoDB:
// In a controller or service
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use App\Document\User;
// Load user from MongoDB
$user = $entityManager->getRepository(User::class)->findOneBy(['username' => 'test']);
// Create token and authenticate
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
User Management:
$user = new User();
$user->setUsername('john_doe');
$user->setEmail('john@example.com');
$user->setPlainPassword('secure123');
$entityManager->persist($user);
$entityManager->flush();
$user = $entityManager->getRepository(User::class)->find($id);
$user->setEmail('new_email@example.com');
$entityManager->flush();
Authentication:
# config/packages/security.yaml
security:
providers:
fos_userbundle:
id: fos_user.user_provider.odm_mongodb
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
Role Management:
$user->addRole('ROLE_ADMIN');
$entityManager->flush();
Custom User Fields:
User document with custom fields (e.g., profilePicture):
/**
* @ODM\Field(type="string")
*/
private $profilePicture;
Event Listeners: Use Symfony events to react to user lifecycle (e.g., post-persist):
// src/EventListener/UserListener.php
namespace App\EventListener;
use Doctrine\ODM\MongoDB\Event\LifecycleEventArgs;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
LifecycleEventArgs::POST_PERSIST => 'onUserPersist',
];
}
public function onUserPersist(LifecycleEventArgs $args)
{
$user = $args->getDocument();
if ($user instanceof User) {
$user->setLastLogin(new \DateTime());
}
}
}
Doctrine Extensions: Integrate with DoctrineExtensions for behaviors like timestamps:
# config/packages/doctrine_mongodb_odm.yaml
doctrine_mongodb:
document_managers:
default:
mappings:
App:
type: annotation
prefix: App\Document
extensions:
- Gedmo\Timestampable\TimestampableListener
API Integration: Use Symfony’s serializers to expose user data:
// src/Serializer/UserNormalizer.php
namespace App\Serializer;
use App\Document\User;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class UserNormalizer implements NormalizerInterface
{
public function normalize($object, $format = null, array $context = [])
{
return [
'id' => $object->getId(),
'username' => $object->getUsername(),
'email' => $object->getEmail(),
'roles' => $object->getRoles(),
];
}
}
Outdated Dependencies:
stofl/user-bundle with MongoDB ODM.Missing Documentation:
UserBundle, which may not cover MongoDB-specific quirks._id fields, embedded documents).Schema Migrations:
doctrine/mongodb-odm-migrations.--force cautiously in development:
php bin/console doctrine:mongodb:schema:update --force
Authentication Edge Cases:
UserManager is configured correctly:
fos_user:
service:
user_manager: fos_user.user_manager.odm_mongodb
Performance with Large Datasets:
/**
* @ODM\Index(keys={"username"="text", "email"="text"})
*/
class User { ... }
Query Logging:
Enable ODM query logging in config/packages/dev/doctrine_mongodb_odm.yaml:
doctrine_mongodb:
document_managers:
default:
logging: true
Common Errors:
user_class in fos_user.yaml matches your document’s namespace.security.yaml provider and firewall configurations.@ODM\ReferenceOne or @ODM\EmbedMany carefully to avoid infinite loops.Testing:
MongoDB\Client in tests to mock the database:
// tests/Functional/UserTest.php
public function testUserCreation()
{
$client = new MongoDB\Client('mongodb://localhost:27017');
$db = $client->test;
$collection = $db->users;
$collection->insertOne([
'username' => 'test',
'email' => 'test@example.com',
'password' => '$2y$13$...', // Pre-hashed password
]);
}
// src/Security/UserProvider
How can I help you explore Laravel packages today?