Installation:
composer require awaresoft/sonata-user-bundle
(Note: Due to symlinking requirements, follow the README's local setup guide if modifying the bundle.)
Enable the Bundle:
Add to config/bundles.php:
return [
// ...
Awaresoft\SonataUserBundle\SonataUserBundle::class => ['all' => true],
];
First Use Case: Extend the default SonataUserBundle functionality (e.g., custom user fields or workflows). Example:
php bin/console sonata:user:create --role=ROLE_ADMIN
config/packages/sonata_user.yaml (if auto-generated).src/Entity/User.php (default user model).templates/SonataUserBundle/ (override defaults via config/packages/twig.yaml).User Management:
php bin/console sonata:admin:generate) for user management UI.User entity:
// src/Entity/User.php
use Awaresoft\SonataUserBundle\Model\UserInterface;
class User extends BaseUser implements UserInterface {
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $customField;
}
Authentication:
templates/SonataUserBundle/security/login.html.twig.// src/EventListener/LoginListener.php
use Awaresoft\SonataUserBundle\Event\LoginEvent;
class LoginListener {
public function onLogin(LoginEvent $event) {
$user = $event->getUser();
// Custom logic (e.g., log activity)
}
}
Register in services.yaml:
services:
App\EventListener\LoginListener:
tags:
- { name: 'kernel.event_listener', event: 'sonata.user.login', method: 'onLogin' }
Roles & Permissions:
security.yaml:
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN]
Laravel-Specific:
HttpFoundation components (e.g., Request, Response) via Laravel’s bridge.// src/Models/User.php
class User extends Model implements UserInterface {
protected $fillable = ['email', 'username', 'customField'];
}
config/packages/sonata_user.yaml to inject Laravel dependencies.APIs:
// src/Controller/UserController.php
use Awaresoft\SonataUserBundle\Model\UserManagerInterface;
class UserController extends AbstractController {
public function __construct(private UserManagerInterface $userManager) {}
public function getUser() {
return $this->userManager->findUserBy(['id' => 1]);
}
}
Symlinking Issues:
/src/Awaresoft exists. Clear cache after changes:
php bin/console cache:clear
vendor/composer/autoload_psr4.php for duplicate entries.Entity Mismatches:
BaseUser entity. If extending, ensure:
UserInterface.@ORM\Table(name="users")).php bin/console doctrine:schema:update --force
Template Overrides:
templates/SonataUserBundle/ must match the original template structure.{{ dump(app.request.attributes) }} in templates to inspect request data.Event System:
sonata.user.login or sonata.user.register may not fire if the bundle isn’t properly bootstrapped.bundles.php and dependencies are loaded.config/packages/dev/sonata_user.yaml:
sonata_user:
debug: true
doctrine:query to inspect queries:
php bin/console doctrine:query:sql "SELECT * FROM users"
Custom Providers:
UserProviderInterface for custom user lookups:
class CustomUserProvider implements UserProviderInterface {
public function loadUserByUsername($username) {
// Custom logic
}
}
services.yaml:
services:
App\Security\User\CustomUserProvider:
tags: ['sonata.user.provider']
Workflow Extensions:
UserManager service to add pre/post hooks:
// src/Service/CustomUserManager.php
class CustomUserManager extends UserManager {
public function createUser(array $data) {
$user = parent::createUser($data);
// Custom logic (e.g., send welcome email)
return $user;
}
}
config/packages/sonata_user.yaml:
sonata_user:
user_manager: App\Service\CustomUserManager
API Tokens:
lexik/jwt-authentication-bundle:
# config/packages/security.yaml
security:
firewalls:
api:
pattern: ^/api
stateless: true
jwt: ~
How can I help you explore Laravel packages today?