Installation:
composer require ibexa/user
Ensure your config/packages/ibexa_user.yaml is properly configured (default config is auto-loaded).
First Use Case:
config/packages/ibexa_user.yaml:
ibexa_user:
user_registration:
form:
allowed_field_definitions_identifiers: ['email', 'full_name', 'custom_field']
php bin/console ibexa:user:invite --email=test@example.com --role=editor
Key Classes to Explore:
Ibexa\User\API\Permission\PermissionResolver (for role-based access checks).Ibexa\User\API\Service\UserService (core user CRUD operations).Ibexa\User\API\Service\InvitationService (invitation workflows).Twig Integration: Fetch the current user in templates:
{{ ibexa_user_current()|raw }}
use Ibexa\User\API\Form\Type\UserRegistrationType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class CustomUserRegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('custom_field', TextType::class);
}
public function getParent()
{
return UserRegistrationType::class;
}
}
ibexa_user:
user_registration:
form:
type: App\Form\Type\CustomUserRegistrationType
use Ibexa\User\API\Permission\PermissionResolverInterface;
public function __construct(private PermissionResolverInterface $permissionResolver) {}
public function isAllowed(string $permission, string $userId): bool
{
return $this->permissionResolver->hasPermission($permission, $userId);
}
ibexa.user.update (edit user profile).ibexa.user.settings (access user settings).use Ibexa\User\API\Service\InvitationServiceInterface;
public function inviteUser(InvitationServiceInterface $invitationService, string $email, string $role)
{
$invitation = $invitationService->createInvitation($email, $role);
$invitationService->sendInvitationEmail($invitation);
}
php bin/console ibexa:user:invitation:refresh --id=123
ibexa_user:
user_settings:
form:
allowed_field_definitions_identifiers: ['email', 'full_name', 'custom_field']
templates/ibexa_user/ (e.g., registration.html.twig).use Ibexa\User\API\Event\UserEvents;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener(event: UserEvents::USER_REGISTERED)]
public function onUserRegistered(UserRegisteredEvent $event)
{
// Send welcome email or log the event
}
Service Container Binding:
Bind Ibexa services to Laravel’s container in AppServiceProvider:
public function register()
{
$this->app->bind(
Ibexa\User\API\Service\UserServiceInterface::class,
Ibexa\User\API\Service\UserService::class
);
}
Route Prefixing: Use Laravel’s route model binding for user routes:
Route::get('/users/{user}', [UserController::class, 'show'])
->name('users.show');
Authentication:
Integrate with Laravel’s auth system by extending Ibexa\User\API\Service\UserService to return Laravel User models:
public function getUserById(string $userId): ?User
{
$ibexaUser = parent::getUserById($userId);
return $ibexaUser ? new LaravelUser($ibexaUser) : null;
}
Migrations:
Ibexa’s user tables are auto-created. For custom fields, extend the ibexa_user table via Laravel migrations:
Schema::table('ibexa_user', function (Blueprint $table) {
$table->string('custom_field')->nullable();
});
Field Definition Configuration:
allowed_field_definitions_identifiers in ibexa_user.yaml may hide all custom fields from forms.ibexa_user:
user_registration:
form:
allowed_field_definitions_identifiers: ['email', 'full_name']
Permission Overrides:
PermissionResolver for consistency:
$this->permissionResolver->hasPermission('ibexa.user.update', $userId);
Invitation Expiry:
Invitation entity’s isExpired() method or adjust the TTL in config:
ibexa_user:
invitation:
ttl: 14400 # 4 hours in seconds
Template Overrides:
templates/ibexa_user/ may not load if the ibexa_user namespace is missing.registration.html.twig) and the ibexa_user bundle is enabled.Database Schema Changes:
php bin/console doctrine:migrations:migrate
php bin/console ibexa:install:upgrade
Enable Debug Mode:
Set IBEXA_DEBUG=1 in your environment to log Ibexa-specific errors.
Check Event Dispatcher: Use Laravel’s event listener debugging:
php artisan event:list
Invitation Debugging: Dump invitation data to verify expiry or sending status:
$invitation = $invitationService->findInvitationById($id);
dump($invitation->isExpired(), $invitation->getEmail());
Permission Issues: Log permission checks for troubleshooting:
try {
$this->permissionResolver->hasPermission('ibexa.user.update', $userId);
} catch (\Ibexa\Core\Base\Exceptions\UnauthorizedException $e) {
\Log::error('Permission denied: ' . $e->getMessage());
}
Custom User Providers:
Implement Ibexa\User\API\Service\UserProviderInterface for alternative user sources (e.g., LDAP).
Email Templates:
Override Twig templates for emails in templates/ibexa_user/email/ (e.g., registration.html.twig).
CLI Commands:
Extend Ibexa’s commands by creating custom commands that use InvitationService or UserService.
Field Types:
Add custom field types for user profiles by implementing Ibexa\Core\FieldType\FieldType and registering them in Ibexa’s field type registry.
Notifications:
Extend the UserRegister and UserPasswordReset notifications by creating custom event subscribers:
#[AsEventListener(UserEvents::USER_REGISTERED)]
public function onUserRegistered(UserRegisteredEvent $event)
{
// Send custom notification
}
How can I help you explore Laravel packages today?