Symfony EventListener它是如何工作的

时间:2015-07-24 00:40:20

标签: php symfony

我试图了解如何在Symfony中构建事件监听器以及它是如何工作的。

所以我查看了Symfony Docs的示例calss。

<?php

// src/AppBundle/EventListener/AcmeExceptionListener.php
namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

class AcmeExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
// You get the exception object from the received event
        $exception = $event->getException();
        $message = sprintf(
            'My Error says: %s with code: %s',
            $exception->getMessage(),
            $exception->getCode()
        );

// Customize your response object to display the exception details
        $response = new Response();
        $response->setContent($message);

// HttpExceptionInterface is a special type of exception that
// holds status code and header details
        if ($exception instanceof HttpExceptionInterface) {
            $response->setStatusCode($exception->getStatusCode());
            $response->headers->replace($exception->getHeaders());
        } else {
            $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
        }

// Send the modified response object to the event
        $event->setResponse($response);
    }
}

我理解GetResponseForExceptionEvent类中的$event->getException()在我的应用程序中选择一个事件抛出

我不明白的是,为什么$exception可以使用getMessage() and getCode()。 有人可以简单地向我解释这些,也许可以更多地了解Symfony事件监听器。

3 个答案:

答案 0 :(得分:2)

这是一个很大的话题,当我通过Symfony文档和其他在线博客学习它时,我发现很难理解。我建议你查看KNP大学的this教程,相信我你会对它有一个非常清楚的认识。

答案 1 :(得分:1)

这与Symfony事件无关,当您使用$event->getException获取类Exception的实例时,此类已定义了这些方法。

答案 2 :(得分:0)

最后一个问题。

  

为什么$exception可以使用getMessage()getCode()

Symfony是一个使用严格的Objcet Oriented范例的框架。通常是一个功能:

  • 有一个对象类型参数,
  • 还返回一个对象
  • 并且对象也可以拥有它自己的功能和属性

在简单的示例中,我们可以认为$exception是一个Exception对象,其属性可以在here中看到。

同样要了解听众的工作方式,如果您对“观察者设计模式”有了一些了解,那将会有所帮助。这是一个小小的解释。

  • 有一个名为dispatcher(EventDispatcher)的对象
  • 此对象有一个包含许多侦听器对象的数组
  • 内核告诉调度员发送
  • 并且调度员告诉所有侦听器执行函数(如果存在)

为了理解您的代码,您可以创建一个在任何地方抛出 <{strong> Exception时激活的侦听器。因此,您可以选择是否显示错误消息。