Ändern von Benutzer-Entität, wenn die Anmeldung über FOS-Benutzer-Bundle und Symfony2
Als viele Menschen wissen, die FOS-Benutzer-Bundle bieten nicht die Rollen automatisch, wenn sich ein Benutzer anmeldet. Die häufigste Lösung ist, entweder a) ändern der Entität "Benutzer" - Konstruktor automatisch eine Rolle zuweisen, oder b) überschreiben Sie die gesamte Registrierung-controller.
Keine dieser Lösungen scheint perfekt, und ich will, Gebrauch zu machen von den Ereignissen, die die FOS-Benutzer-bundle bietet.
Ich habe es geschafft, zu erfassen, die Veranstaltung, die ich will (FOSUserEvents::REGISTRATION_INITIALIZE
), aber ich habe Schwierigkeiten, herauszufinden, wie übergeben Sie die geänderte Entität "Benutzer" zurück zum Anmeldeformular.
Den code habe ich so weit ist wie folgt:
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
}
}
Den YML für die Ereignis-listener:
services:
hc_labs_user.reg_init:
class: HCLabs\UserBundle\EventListener\AutoRoleAssignmentListener
tags:
- { name: kernel.event_subscriber }
Wenn mehr code benötigt wird, bin ich gerne bereit es. Vielen Dank für Ihre Hilfe.
- möglich, Duplikat der FOSUserBundle: Holen Sie sich EntityManager-Instanz überschreiben Form-Handler
- nicht ein Duplikat ist, diese Frage ist in Bezug auf die übergeordneten controller. Mir war zu dem Einhängen in die Veranstaltung statt.
- aber soweit ich sehen kann, die Lösung war die gleiche.
- wenn ich wollte, um unnötigen code und ignorieren neue Funktionen, die speziell entwickelt, um die oben Korrektur obsolet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort ist sehr einfach - Sie haben zu tun nichts aktualisiert erhalten
User
Objekt im Anmeldeformular nach aktualisiertUser
im Ereignis-listener fürFOSUserEvents::REGISTRATION_INITIALIZE
Veranstaltung.Lassen Sie mich erklären.
FOSUserEvents::REGISTRATION_INITIALIZE
wird inRegistrationController
durch:Und, bevor dieser Versand im code (https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php#L43) neue
User
erstellt:Während der Disposition, standardmäßig PHP
call_user_func
(http://php.net/manual/en/function.call-user-func.php ) als eingesetzte event-name (Funktion in definierten Objekt) undEvent
Objekt. Nach, dass Ereignis-listener verfügt über die Möglichkeit zum ändern eingefügtEvent
Objekt - besonders Ereignis-Eigenschaft.In Ihrem Fall, Ihr Ereignis-listener ändern
User
Eigentum über:So, in der Tat, haben Sie nichts zu tun, übergeben die geänderte Entität "Benutzer" zurück zum Anmeldeformular.
$user
nach dem Ereignis ausgelöst, und dieroles
key ist immer noch leer.ROLE_USER
ist Standard Symfony2 registrierte Benutzer Rolle. Bitte versuchen Sie hinzufügen eine andere Rolle, wieROLE_USER_X
.$user->setName( 'Jack' );
gearbeitet. Wissen Sie, warum ich nicht verwenden können, eine Symfony2 Rolle? Macht nicht viel Sinn für mich. Aber vielen Dank, an Euch beide, ich werde markieren Sie diese als beantwortet.