fos events symfony service fosuserbundle

events - Modificación de la entidad de usuario cuando se registra utilizando FOS User Bundle y Symfony2



fosuserbundle symfony 4 (1)

La respuesta es muy simple: no tiene que hacer nada para obtener el objeto User actualizado en el formulario de registro después de la actualización del User en el detector de eventos para el evento FOSUserEvents::REGISTRATION_INITIALIZE .

Dejame explicar. FOSUserEvents::REGISTRATION_INITIALIZE se distribuye en RegistrationController por:

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request));

Y, antes de este envío en código ( https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php#L43 ) se crea un nuevo User :

$user = $userManager->createUser(); $user->setEnabled(true); $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request));

Durante el envío, de forma predeterminada se call_user_func PHP call_user_func ( http://php.net/manual/en/function.call-user-func.php ) con el nombre del evento pegado (función en el objeto definido) y el objeto Event . Después de eso, el detector de eventos tiene la posibilidad de modificar el objeto de Event pegado, particularmente la propiedad del evento.

En su caso, su oyente de eventos modifica User propiedad del User través de:

$user = $event->getUser(); $user->addRole( ''ROLE_USER'' );

De hecho, no tiene que hacer nada para pasar la entidad de Usuario modificada de vuelta al formulario de registro.

Como mucha gente sabe, el FOS User Bundle no proporciona roles automáticamente cuando un usuario se registra. La solución más común es a) modificar el constructor de la entidad de usuario para asignar automáticamente un rol, ob) anular todo el controlador de registro.

Ninguna de estas soluciones parece perfecta, y quiero hacer uso de los eventos que proporciona el paquete de usuario de FOS.

FOSUserEvents::REGISTRATION_INITIALIZE capturar el evento que deseo ( FOSUserEvents::REGISTRATION_INITIALIZE ), pero estoy teniendo problemas para averiguar cómo pasar la entidad de usuario modificada al formulario de registro.

El código que tengo hasta ahora es el siguiente:

namespace HCLabs/UserBundle/EventListener; use FOS/UserBundle/FOSUserEvents; use Symfony/Component/EventDispatcher/EventSubscriberInterface; use FOS/UserBundle/Event/UserEvent; use FOS/UserBundle/Model/UserInterface; class AutoRoleAssignmentListener implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ FOSUserEvents::REGISTRATION_INITIALIZE => ''onRegistrationInitialise'' ]; } public function onRegistrationInitialise( UserEvent $event ) { $user = $event->getUser(); $user->addRole( ''ROLE_USER'' ); // what do } }

El YML para el oyente del evento:

services: hc_labs_user.reg_init: class: HCLabs/UserBundle/EventListener/AutoRoleAssignmentListener tags: - { name: kernel.event_subscriber }

Si se necesita más código, me complace proporcionarlo. Gracias por tu ayuda.