Installation:
composer require friendsofsymfony/user-bundle
Add to config/bundles.php:
return [
// ...
FriendsOfSymfony\UserBundle\FOSUserBundle::class => ['all' => true],
];
Configure Database:
Update config/packages/fos_user.yaml (auto-generated) to match your Doctrine setup:
fos_user:
db_driver: orm # or 'mongodb' if using ODM
firewall_name: main
user_class: App\Entity\User
Generate User Entity:
php bin/console make:user
(Follow prompts to customize fields like email, roles, etc.)
First Use Case: Register a new user via the built-in controller:
php bin/console fos:user:register john doe john@example.com password123
User Registration:
FOS\UserBundle\Form\Type\RegistrationFormType to add custom fields.templates/FOSUserBundle/Registration/register.html.twig).// src/Form/RegistrationFormTypeExtension.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('custom_field', TextType::class);
}
Password Reset:
FOS\UserBundle\Controller\ResetPasswordController.fos_user:
reset_token_ttl: 86400 # 1 day in seconds
Authentication Integration:
security.yaml to use FOSUser’s provider:
security:
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
main:
form_login:
provider: fos_userbundle
Profile Management:
FOS\UserBundle\Form\Type\ProfileFormType for custom profile fields.UserManager:
// src/EventListener/UserEvents.php
public function onUserUpdated(UserEvent $event)
{
$event->getUser()->setLastLogin(new \DateTime());
}
Doctrine Lifecycle Callbacks:
// src/Entity/User.php
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: UserRepository::class)]
class User implements UserInterface
{
#[ORM\PrePersist]
public function setCreatedAt(): void
{
$this->createdAt = new \DateTime();
}
}
Event Subscribers:
Listen to FOSUserEvents::REGISTRATION_COMPLETED to send welcome emails:
// src/EventListener/RegistrationListener.php
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_COMPLETED => 'onRegistrationCompleted',
];
}
public function onRegistrationCompleted(FilterUserResponseEvent $event)
{
$user = $event->getUser();
// Send email via MailerInterface
}
Deprecation Warnings:
SecurityBundle + custom User entity instead (e.g., via make:auth).Configuration Overrides:
fos_user.yaml must merge with defaults. Example:
# Incorrect (overwrites entirely)
fos_user:
user_class: App\Entity\CustomUser
# Correct (extends defaults)
fos_user:
user_class: App\Entity\CustomUser
from_email:
address: no-reply@example.com
Token Service Quirks:
$user->setResetToken($userManager->generateResetToken());
$userManager->updateUser($user);
ORM vs. ODM:
Check User Events:
Enable debug logging for fos_user events:
# config/packages/dev/monolog.yaml
handlers:
fos_user:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.fos_user.log"
level: debug
channels: ["fos_user"]
Token Validation:
fos_user.reset_token_ttl. Test with:
php bin/console fos:user:reset-password john@example.com
Form Validation:
User entity:
#[Assert\NotBlank]
#[Assert\Email]
private ?string $email = null;
Custom User Fields:
User entity and extend forms:
// src/Form/Type/UserType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('avatar', FileType::class);
}
Override Controllers:
FOS\UserBundle\Controller\RegistrationController for custom logic:
// src/Controller/CustomRegistrationController.php
class CustomRegistrationController extends RegistrationController
{
public function registerAction()
{
// Custom logic before/after registration
return parent::registerAction();
}
}
API Integration:
UserManager in API controllers:
public function updateProfile(UserManagerInterface $userManager, Request $request)
{
$user = $userManager->findUserBy(['id' => $request->attributes->get('id')]);
// Update user data
$userManager->updateUser($user);
}
Testing:
UserManager in tests:
$userManager = $this->createMock(UserManagerInterface::class);
$userManager->expects($this->once())
->method('createUser')
->willReturn($user);
How can I help you explore Laravel packages today?