Installation:
composer require friendsofsymfony/user-bundle
Ensure Symfony\Bundle\FrameworkBundle\FrameworkBundle and Symfony\Bundle\SecurityBundle\SecurityBundle are installed.
Enable the Bundle:
Add to config/bundles.php:
return [
// ...
FriendsOfSymfony\UserBundle\FOSUserBundle::class => ['all' => true],
];
Configure Database & Security:
Update config/packages/security.yaml to include:
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
logout: true
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
First Use Case: Generate a user registration form and controller:
php bin/console fos:user:create-form
php bin/console fos:user:create-controller
User Registration:
FOS\UserBundle\Model\User to add custom fields (e.g., Profile entity).FOS\UserBundle\Form\Type\RegistrationFormType) or override it:
// src/Form/RegistrationFormType.php
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
class RegistrationFormType extends BaseType {
public function buildForm(FormBuilderInterface $builder, array $options) {
parent::buildForm($builder, $options);
$builder->add('custom_field', TextType::class);
}
}
Password Reset:
FOS\UserBundle\Event\GetResponseUserEvent to customize reset emails.templates/FOSUserBundle/Registration/reset.html.twig).Authentication:
fos_user.user_provider in security.yaml for user loading.security.yaml:
form_login:
login_path: /login
check_path: /login_check
default_target_path: /dashboard
Profile Management:
ProfileController to add custom actions (e.g., avatar upload):
// src/Controller/ProfileController.php
use FOS\UserBundle\Controller\ProfileController as BaseController;
class ProfileController extends BaseController {
public function uploadAvatarAction() {
// Custom logic
}
}
User entity extends FOS\UserBundle\Model\User and uses ORM\Mapping as ORM:
use FOS\UserBundle\Model\User as BaseUser;
class User extends BaseUser {
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $customField;
}
fos_user helpers in templates:
{{ fos_user.has_role('ROLE_ADMIN') ? 'Admin' : 'User' }}
FOS\UserBundle\Event\FormEvent to modify form behavior:
// src/EventListener/UserListener.php
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\FormEventInterface;
class UserListener {
public function onUserForm(FormEvent $event) {
$form = $event->getForm();
$form->add('custom_field');
}
}
Register in services.yaml:
services:
App\EventListener\UserListener:
tags:
- { name: kernel.event_listener, event: fos_user.registration.form.initialized, method: onUserForm }
Missing Configuration:
fos_user in config/packages/security.yaml or config/packages/fos_user.yaml will break authentication.php bin/console fos:user:setup to generate default configs.Entity Inheritance Issues:
User entity doesn’t extend BaseUser or lacks required annotations (e.g., @ORM\Entity), migrations fail.User entity matches the official example.CSRF Token Mismatches:
csrf_token_generator isn’t configured.{{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
{{ form_row(form._token) }}
Email Confirmation Delays:
swiftmailer or mailer isn’t configured.MAILER_DSN in .env or config/packages/mailer.yaml.Route Conflicts:
/register, /resetting) may conflict with custom routes.config/routes.yaml:
fos_user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
prefix: /auth
Enable Debug Mode:
php bin/console debug:config fos_user
Check for misconfigurations in security.yaml or fos_user.yaml.
Log Events:
Subscribe to FOS\UserBundle\Event\FilterUserResponseEvent to log user actions:
public function onUserResponse(FilterUserResponseEvent $event) {
\Log::info('User action:', ['user' => $event->getUser(), 'response' => $event->getResponse()]);
}
Test with fos:user:fixtures:
Load test users via:
php bin/console fos:user:create --super-admin
Custom User Classes:
FOS\UserBundle\Model\UserInterface for custom logic (e.g., soft deletes):
class CustomUser extends BaseUser implements UserInterface {
public function isActive() {
return $this->deletedAt === null;
}
}
Dynamic Forms:
FormEvent to add/remove fields dynamically:
public function onRegistrationForm(FormEvent $event) {
$form = $event->getForm();
if ($event->getRequest()->get('is_admin')) {
$form->add('admin_field');
}
}
API Integration:
firewalls:
api:
pattern: ^/api
stateless: true
anonymous: true
form_login:
provider: fos_userbundle
check_path: /api/login_check
username_parameter: _username
password_parameter: _password
Multi-Tenant Support:
UserManager to scope users by tenant:
class TenantUserManager extends UserManager {
public function findUserBy(array $criteria) {
$criteria['tenantId'] = $this->tenantId;
return parent::findUserBy($criteria);
}
}
services:
fos_user.user_manager.tenant:
class: App\Service\TenantUserManager
parent: fos_user.user_manager.default
arguments: ['@fos_user.user_manager.default.orm', '@tenant.context']
How can I help you explore Laravel packages today?