Installation
composer require atoomstudio/user-bundle
Add to config/bundles.php:
return [
// ...
AtoomStudio\UserBundle\AtoomStudioUserBundle::class => ['all' => true],
];
Database Migration
Run the provided migration (located in vendor/atoomstudio/user-bundle/migrations/) or manually create the fos_user and sonata_user tables:
php bin/console doctrine:migrations:execute --query="CREATE TABLE fos_user..."
First Use Case: Basic User Registration
Enable the registration controller in config/routes.yaml:
sonata_user_register:
resource: "@AtoomStudioUserBundle/Resources/config/routing/registration.xml"
prefix: /register
Test registration at /register.
config/packages/atoomstudio_user.yaml (auto-generated; override as needed).vendor/atoomstudio/user-bundle/Resources/views/ (extend via Symfony’s template inheritance)./admin (if SonataAdminBundle is configured).sonata_user.google_authenticator config (see below).Leverage SonataAdmin for user management:
// src/Admin/UserAdmin.php
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
class UserAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('username')
->add('email')
->add('plainPassword', 'repeated', ['type' => 'password']);
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper->add('username');
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('username')
->add('email')
->add('enabled', 'boolean');
}
}
Register the admin in config/packages/sonata_admin.yaml:
sonata_admin:
options:
models:
AtoomStudio\UserBundle\Entity\User: ~
Extend the User entity (located at vendor/atoomstudio/user-bundle/Entity/User.php):
// src/Entity/UserExtension.php
use Doctrine\ORM\Mapping as ORM;
use AtoomStudio\UserBundle\Entity\User as BaseUser;
class User extends BaseUser
{
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $customField;
// Getters/setters...
}
Update the migration and rebuild the form in UserAdmin.
Configure in config/packages/security.yaml:
security:
firewalls:
main:
form_login:
login_path: sonata_user_security_login
check_path: sonata_user_security_check
Enable in config/packages/atoomstudio_user.yaml:
sonata_user:
google_authenticator:
enabled: true
secret_length: 32
Trigger 2FA setup in a controller:
use Sonata\UserBundle\Model\UserInterface;
use Sonata\UserBundle\GoogleAuthenticator\GoogleAuthenticator;
public function enable2FA(UserInterface $user)
{
$authenticator = $this->container->get('sonata.user.google_authenticator');
$secret = $authenticator->generateSecret();
$user->setGoogleAuthenticatorSecret($secret);
$user->setGoogleAuthenticatorEnabled(true);
$entityManager->persist($user);
$entityManager->flush();
return $authenticator->getQRContent($user->getEmail(), $secret);
}
Use FOSRestBundle (dev dependency) to expose user endpoints:
# config/routes/api.yaml
sonata_user_api:
resource: "@AtoomStudioUserBundle/Resources/config/routing/api.xml"
prefix: /api
Example endpoint: /api/users (GET/POST/PUT/DELETE).
sonata-project/admin-bundle and friendsofsymfony/user-bundle are installed./register, /login, etc. Avoid naming conflicts in your app.fos_user, sonata_user). Customize via Doctrine extensions if needed.Debugging Tip:
php bin/console debug:container sonata.user
Lists all available services (e.g., sonata.user.manager, sonata.user.google_authenticator).
var/log/dev.log and enable debug mode:
# config/packages/dev/atoomstudio_user.yaml
sonata_user:
debug: true
google_authenticator_secret and google_authenticator_enabled fields exist in the User entity.UserAdmin registration or ACL permissions.php bin/console sonata:admin:generate
Then register the admin as shown in Implementation Patterns.Override the default fos_user.user_provider:
# config/packages/security.yaml
security:
providers:
my_user_provider:
id: my.custom.user_provider
Example Provider:
// src/Security/MyUserProvider.php
use Sonata\UserBundle\SonataUserProvider;
class MyUserProvider extends SonataUserProvider
{
public function loadUserByUsername($username)
{
// Custom logic...
}
}
Listen to user events (e.g., sonata.user.register):
// src/EventListener/UserListener.php
use Sonata\UserBundle\Event\UserEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
UserEvent::REGISTER => 'onUserRegister',
];
}
public function onUserRegister(UserEvent $event)
{
$user = $event->getUser();
// Send welcome email, etc.
}
}
$user = $this->container->get('sonata.user.manager')->findUserBy(['username' => 'john']);
$this->container->get('cache')->set('user:john', $user, 3600);
BATCH_SIZE for large user exports:
# config/packages/doctrine.yaml
doctrine:
orm:
dql:
string_functions:
GROUP_CONCAT: AtoomStudio\UserBundle\Doctrine\GroupConcat
How can I help you explore Laravel packages today?