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.