Symfony框架之FOSUserBundle挂载到控制器

原文地址http://symfony.com/doc/current/bundles/FOSUserBundle/controller_events.html

通过FOSUserBundle包装过的控制器提供了一些能够满足一般需要的功能. 不过你可能需要在你的应用中扩展这些功能, 并且加入你自己的业务逻辑.

出于此目的, 控制器在他们的逻辑中的多个地方触发了一些事件. 所有的事件都能在FOS\UserBundle\FOSUserEvents类中的常量找到.

所有的控制器都遵循一个约定: 他们会在表单验证之后保存用户数据之前触发一个SUCCESS事件, 并且在保存用户数据之后触发一个COMPLETED事件.因此你不想使用默认的重定向, 你可以在所有的SUCCESS事件之后你可以设置一个响应. 所有的COMPLETED事件允许你在控制器返回之前设置一个响应.

带表单的控制器在实体加载完毕之后通常会触发一个INITIALIZE事件, 而不是在表单创建之后.

例如,下面这个监听器会在重置密码之后跳转到homepage, 而不是profile页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// src/Acme/UserBundle/EventListener/PasswordResettingListener.php

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\Routing\Generator\UrlGeneratorInterface;

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

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

/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::RESETTING_RESET_SUCCESS => 'onPasswordResettingSuccess',
);
}

public function onPasswordResettingSuccess(FormEvent $event)
{
$url = $this->router->generate('homepage');

$event->setResponse(new RedirectResponse($url));
}
}

然后你可以在配置中注册这个监听器:

1
2
3
4
5
6
7
# src/Acme/UserBundle/Resources/config/services.yml
services:
acme_user.password_resetting:
class: Acme\UserBundle\EventListener\PasswordResettingListener
arguments: ['@router']
tags:
- { name: kernel.event_subscriber }