Contributed by 
            Roland Franssen 
            in #25275.
        
Symfony 4 程序中所推荐的 事件管理方式 是利用 subscribers 订阅器而不是使用 listeners 监听器,因为只有订阅器才能在使用 服务自动配置 时能够被自动配置。
然而,对于仍希望使用监听的人来说,在 Symfony 4.1 中我们改进了它们(译注:指服务自动配置),以便支持 __invoke() PHP 魔术方法。思考下列服务配置:
| 1 2 3 | # config/services.yaml
App\EventListener\UserListener:
    tags: [{ name: kernel.event_listener, event: kernel.request }] | 
当 kernel.event_listener 标签没有定义 method 属性时,Symfony 执行的是名为 on + CamelCased event name(on+驼峰化的事件名称)的方法。本例中,onKernelRequest() 方法会被执行。在 Symfony 4.1 中,如果监听器类没有定义那个方法,Symfony 会去寻找 __invoke() 方法并且执行它,如果找到的话。
实践中,Symfony 4.1 中的 UserListener 类将十分简单:
| 1 2 3 4 5 6 7 8 9 | use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 
class UserListener
{
    public function __invoke(GetResponseEvent $event)
    {
        // ...
    }
} | 
相关地,我们还在背地里对框架中其他部分的 __invoke() 进行了支持,诸如 TemplateController:
| 1 2 3 4 5 6 7 8 9 10 11 | # config/routes.yaml
index:
    path: /
    # before Symfony 4.1 you must add the 'templateAction' method name
    # 在 Symfony 4.1 之前你必须添加 'templateAction' 方法名
    controller: 'Symfony\Bundle\FrameworkBundle\Controller\TemplateController::templateAction'
    # starting from Symfony 4.1, TemplateController includes an __invoke() method
    # 从 Symfony 4.1 起,TemplateController 包括了一个 __invoke() 方法
    controller: 'Symfony\Bundle\FrameworkBundle\Controller\TemplateController'
    defaults:
      template: 'homepage.html.twig' | 
 4.2翻译中
                     4.2翻译中

 
                     
                    