2013-06-11 3 views
6

Мне было интересно, есть ли возможность вызвать функцию после входа пользователя.Вызов метода после входа пользователя

Вот код, который я хочу, чтобы позвонить:

$point = $this->container->get('process_points'); 
$point->ProcessPoints(1 , $this->container); 
+1

В настоящее время GitHub недоступен, поэтому я не могу предоставить полный ответ, но способ сделать это - переопределить контроллер FOSUserBundle, отвечающий за регистрацию. –

ответ

26

Вы можете найти события FOSUserBundle пожаров в FOSUserEvents class. Более конкретно, это то, который вы ищете:

/** 
* The SECURITY_IMPLICIT_LOGIN event occurs when the user is logged in programmatically. 
* 
* This event allows you to access the response which will be sent. 
* The event listener method receives a FOS\UserBundle\Event\UserEvent instance. 
*/ 
const SECURITY_IMPLICIT_LOGIN = 'fos_user.security.implicit_login'; 

документацию для подключения в эти события можно найти на странице Hooking into the controllers дока. В вашем случае, вам нужно будет реализовать что-то вроде этого:

namespace Acme\UserBundle\EventListener; 

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\FormEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Security\Http\SecurityEvents; 
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 

/** 
* Listener responsible to change the redirection at the end of the password resetting 
*/ 
class LoginListener implements EventSubscriberInterface 
{ 
    private $container; 

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

    /** 
    * {@inheritDoc} 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(
      FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onLogin', 
      SecurityEvents::INTERACTIVE_LOGIN => 'onLogin', 
     ); 
    } 

    public function onLogin($event) 
    { 
     // FYI 
     // if ($event instanceof UserEvent) { 
     // $user = $event->getUser(); 
     // } 
     // if ($event instanceof InteractiveLoginEvent) { 
     // $user = $event->getAuthenticationToken()->getUser(); 
     // } 

     $point = $this->container->get('process_points'); 
     $point->ProcessPoints(1 , $this->container); 
    } 
} 

Затем вы должны определить слушателя в качестве сервиса и ввести контейнер. В качестве альтернативы вы можете ввести только тот сервис, который вам нужен, а не весь контейнер.

services: 
    acme_user.login: 
     class: Acme\UserBundle\EventListener\LoginListener 
     arguments: [@container] 
     tags: 
      - { name: kernel.event_subscriber } 

Существует еще один метод, который включает в себя overriding the controller, но, как указано в документации, вы должны дублировать их код так, это не совсем чистые и неизбежно сломается, если (или, вернее, когда) FOSUserBundle изменяется.

+0

спасибо, очень спасибо ... я бы не подумал об этом! –

+1

И есть ли способ прослушать «автоматический вход»? Вместо прослушивания, только когда пользователь нажимает на логин. Пример: пользователь входит в систему (помнит меня), и в следующий раз, когда он посетит эту страницу, он войдет в систему уже, но я хотел бы послушать это. Я знаю, что могу слушать контроллер и проверять, существует ли пользователь из контекста безопасности, но я хотел бы прослушать что-то из «безопасности» части Symfony. – EnchanterIO

+0

Нет, потому что нет фактического входа в систему, поскольку он просто использует cookie для аутентификации пользователя. –

Смежные вопросы