Installation:
composer require sonata-project/user-bundle
Add to config/bundles.php:
return [
// ...
Sonata\UserBundle\SonataUserBundle::class => ['all' => true],
];
Database Migration: Run the default schema migration:
php bin/console doctrine:schema:update --force
(Or customize via sonata_user.doctrine.orm.entity_manager config.)
First Use Case:
Register a new user via the built-in admin interface (accessible at /admin after enabling SonataAdminBundle):
php bin/console sonata:easy-extends:generate SonataUserBundle
config/packages/sonata_user.yaml (auto-generated)./admin (for CRUD operations).5.x branch for Laravel/Symfony 6+ compatibility).templates/SonataUserBundle/ (e.g., registration.html.twig).User Registration:
SonataUserBundle:Registration:register.html.twig.sonata_user.registration.form.type config:
sonata_user:
registration:
form:
type: App\Form\RegistrationType
Authentication:
auth facade) with Sonata’s user provider:
// config/packages/security.yaml
providers:
sonata_user:
entity:
class: App\Entity\User
property: email
Admin Integration:
composer require sonata-project/admin-bundle
php bin/console sonata:easy-extends:generate SonataUserBundle
src/Entity/UserAdmin.php).API Integration:
// src/Serializer/UserNormalizer.php
use Sonata\UserBundle\Model\UserInterface;
class UserNormalizer implements NormalizerInterface { ... }
Laravel-Specific:
php artisan make:auth for basic auth, then extend Sonata’s templates.lexik/jwt-auth-bundle:
sonata_user:
security:
encoder:
algorithm: auto
options:
jwt: true
Custom User Fields:
Add fields to the User entity (e.g., phoneNumber) and update the form type:
// src/Form/RegistrationType.php
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('phoneNumber');
}
Event Listeners: Listen to user events (e.g., post-registration):
// src/EventListener/UserListener.php
public function onUserRegistered(UserEvent $event) {
$user = $event->getUser();
// Send welcome email, etc.
}
Register in services.yaml:
services:
App\EventListener\UserListener:
tags:
- { name: 'kernel.event_listener', event: 'sonata.user.register', method: 'onUserRegistered' }
Doctrine Migrations:
sonata_user tables (e.g., user, group). Use Sonata’s migration tools:
php bin/console sonata:user:manager:create
Security:
{{ csrf_token() }}.auto encoder. For Laravel, configure in security.yaml:
security:
encoders:
App\Entity\User:
algorithm: argon2id
Template Overrides:
php bin/console cache:clear
Admin Route Conflicts:
_route in Twig:
{{ path('_sonata_admin_dashboard') }}
Common Issues:
/admin: Ensure SonataAdminBundle is installed and routes are dumped:
php bin/console debug:router | grep sonata_admin
sonata_user.registration.form.type config and template paths.Logging:
Enable Sonata’s debug mode in config/packages/sonata_user.yaml:
sonata_user:
debug: true
Custom User Model:
Extend Sonata\UserBundle\Model\UserInterface:
// src/Entity/User.php
class User extends BaseUser implements UserInterface { ... }
Update sonata_user.class.user in config.
Dynamic Groups:
Use sonata.user.group.loader to load groups dynamically:
sonata_user:
group:
loader: App\Loader\GroupLoader
API Resources: Create custom API resources for Sonata’s entities:
// src/ApiResource/UserResource.php
class UserResource extends JsonResource { ... }
Email Templates:
Override email templates in templates/SonataUserBundle/Email/ (e.g., registration.html.twig).
Service Container:
Sonata uses Symfony’s DI. For Laravel, bind Sonata services in config/services.php:
'sonata.user.manager' => \Sonata\UserBundle\Model\UserManagerInterface::class,
Blade vs. Twig:
Sonata templates use Twig. For Blade, create a Twig loader or use symfony/twig-bridge:
composer require symfony/twig-bridge
Artisan Commands:
Sonata commands (e.g., sonata:user:create) may not work out-of-the-box. Alias them in console/commands.php:
$commands[] = \Sonata\UserBundle\Command\UserCommand::class;
How can I help you explore Laravel packages today?