2017-03-15 9 views
0

Wie kann ich nach Login des Benutzers Log in die Datei schreiben?Symfony - FOSUserBundle - nach dem Login in Datei schreiben

Ich habe dies:

<?php 
namespace Web\AdminBundle\EventListener; 

use FOS\UserBundle\Model\UserManagerInterface; 
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 

class LoginListener { 

    protected $userManager; 

    public function __construct(UserManagerInterface $userManager){ 
     $this->userManager = $userManager; 
    } 

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
    { 
     $user = $event->getAuthenticationToken()->getUser(); 
     $myfile = fopen("login.txt", "w"); 
     fwrite($myfile, 'some-text'); 
     fclose($myfile); 
    } 
} 

dann:

login_listener: 
    class: Web\AdminBundle\EventListener\LoginListener 
    arguments: 
     userManager: "@fos_user.user_manager" 
    tags: 
     - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin } 

Aber das funktioniert nicht, ist kein Fehler. Ich habe versucht, einfach den Würfel zu rufen ("Some-Text"), um sicher zu gehen, dass es funktioniert, bot es nichts.

Antwort

1

In Symfony 3.2 Sie müssen dies auf andere Weise tun.

//..src/YourBundle/EventListener/LoginListener.php 

namespace YourBundle\EventListener; 

use Symfony\Component\EventDispatcher\EventDispatcherInterface; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\Routing\Router; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; 
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 

class LoginListener 
{ 
/** @var Router */ 
protected $router; 

/** @var TokenStorage */ 
protected $token; 

/** @var EventDispatcherInterface */ 
protected $dispatcher; 

/** 
* @param Router $router 
* @param TokenStorage $token 
* @param EventDispatcherInterface $dispatcher 
*/ 
public function __construct(Router $router, TokenStorage $token, EventDispatcherInterface $dispatcher) 
{ 
    $this->router  = $router; 
    $this->token  = $token; 
    $this->dispatcher = $dispatcher; 
} 

/** 
* @param InteractiveLoginEvent $event 
*/ 
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
{ 
    $this->dispatcher->addListener(KernelEvents::RESPONSE, [$this, 'onKernelResponse']); 
} 

/** 
* @param FilterResponseEvent $event 
*/ 
public function onKernelResponse(FilterResponseEvent $event) 
{ 
    $user = $this->token->getToken()->getUser(); // here you have your user 


    //Let's write some thing to the file 
    $myfile = fopen("login.txt", "w"); 
    fwrite($myfile, 'some-text'); 
    fclose($myfile); 

    $event->getResponse()->headers->set('Location', $route); 
} 

`

Und Sie müssen diese in eventlistener services.yml

app.login.listener: 
    class: YourBundle\EventListener\LoginListener 
    arguments: 
     - "@router" 
     - "@security.token_storage" 
     - "@event_dispatcher" 
    tags: 
     - { name: kernel.event_listener, method: onSecurityInteractiveLogin, event: security.interactive_login} 

Jetzt registrieren Sie eine andere Logik zum onKernelResponse() Methode hinzufügen können

1

Ich sah vor kurzem ein ähnliches Problem. Ich musste bei jedem Login eine Datenbankanzahl erhöhen. Der Weg, den ich wählte, war ein Teilnehmer wie folgt zu registrieren:

class LoginSubscriber implements EventSubscriberInterface 
{ 
    public function handleLogin(InteractiveLoginEvent $event) 
    { 
     // Inser logic here 
    } 

    /** 
    * @return array 
    */ 
    public static function getSubscribedEvents() 
    { 
     return [ 
      SecurityEvents::INTERACTIVE_LOGIN => 'handleLogin' 
     ]; 
    } 

} 

Und dann die Registrierung der Teilnehmer als Dienstleistung, die Ereignisse in Ihrem services.yml auf Kernel hört (oder xml wenn das die Art und Weise Sie rollen ...) :

login.subscriber: 
    class: Your\Namespace\LoginSubscriber 
    tags: 
     - {name: kernel.event_subscriber } 

Das sollte den Trick tun.

Happy Coding!

PS:

Obwohl dieser Ansatz über aktuelle Version funktionieren sollte, lassen Sie mich darauf hinweisen, nur die spezifische Version, die ich verwendet:

  • friendsofsymfony/user-Bündel v1.3.6
  • symfony/symfony v2.8.7
+0

Danke, ich bin Symfony mit 3.2. Ich denke, es ist jetzt anders ... Aber ich werde es versuchen. Und fos 2.0 –

+0

Es sollte nicht sein. Der einzige Hauptunterschied in unseren beiden Ansätzen besteht darin, einen Listener zu verwenden oder einen Abonnenten zu verwenden. – Jan

+0

Falls es hilft, bitte als korrekt markieren – Jan

Verwandte Themen