coosos/user-role-type-bundle
Installation:
composer require coosos/user-role-type-bundle "^2.0"
Ensure your project uses Symfony 3.4, 4.0, or 5.0 and PHP 7.1+.
Enable the Bundle:
Add to config/bundles.php (Symfony 4/5) or AppKernel.php (Symfony 3):
Coosos\UserRoleTypeBundle\CoososUserRoleTypeBundle::class => ['all' => true],
First Use Case:
In a form builder (e.g., UserType), add the role field:
use Coosos\UserRoleTypeBundle\Form\Type\UserRoleType;
$builder->add('roles', UserRoleType::class, [
'coosos_security_checked' => 'strict', // or 'loose'
]);
Template Integration: Use the default Twig template or override it (see Implementation Patterns).
Role Assignment in Forms:
UserRoleType for role selection in user creation/editing forms.$builder->add('roles', UserRoleType::class, [
'multiple' => true, // Allow multi-role assignment
'expanded' => true, // Checkbox layout (default: dropdown)
'choices' => $roleManager->getRoles(), // Customize available roles
]);
Dynamic Role Sources:
RoleManager (e.g., from Symfony’s security.role_hierarchy) to fetch roles dynamically:
$builder->add('roles', UserRoleType::class, [
'role_manager' => $this->roleManager, // Service ID or instance
]);
Validation Integration:
@Assert\All, @Assert\Count) on the roles field:
# config/validation.yaml
App\Entity\User:
properties:
roles:
- All: { type: string }
- Count: { min: 1, max: 5 }
Twig Overrides:
{# templates/CoososUserRoleTypeBundle/fields.html.twig #}
<div class="custom-role-field">
{% for role in roles %}
<label>
<input type="checkbox" name="roles[]" value="{{ role }}">
{{ role }}
</label>
{% endfor %}
</div>
Event Listeners:
PRE_SET_DATA):
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$user = $event->getData();
if ($user && $user->hasRole('ROLE_ADMIN')) {
$event->getForm()->add('roles', UserRoleType::class, ['disabled' => true]);
}
});
Strict vs. Loose Mode:
'strict' enforces hierarchical roles (e.g., ROLE_ADMIN implies ROLE_USER). Use 'loose' for flat role sets.$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
dump($form->getData()->getRoles());
}
Role Hierarchy Conflicts:
security.yaml, the bundle may render unexpected options. Validate with:
php bin/console debug:security
Template Caching:
php bin/console cache:clear
Deprecated Symfony Features:
Stof\DoctrineExtensionsBundle or custom form types.Performance:
$builder->add('roles', UserRoleType::class, [
'role_manager' => $cachedRoleManager, // Service with cached roles
]);
Localization:
{{ role|trans({'domain': 'messages'}, 'roles.' ~ role) }}
Testing:
RoleManager in PHPUnit:
$roleManager = $this->createMock(RoleManagerInterface::class);
$roleManager->method('getRoles')->willReturn(['ROLE_USER', 'ROLE_ADMIN']);
$form = $this->factory->create(UserType::class, null, [
'role_manager' => $roleManager,
]);
Extension Points:
class CustomUserRoleType extends AbstractType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'custom_option' => false,
]);
}
}
Then use:
$builder->add('roles', CustomUserRoleType::class);
Debugging:
config/packages/dev/debug.yaml:
framework:
form: { enabled_types: [Coosos\UserRoleTypeBundle\Form\Type\UserRoleType] }
How can I help you explore Laravel packages today?