我试图了解如何在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事件监听器。
答案 0 :(得分:2)
这是一个很大的话题,当我通过Symfony文档和其他在线博客学习它时,我发现很难理解。我建议你查看KNP大学的this教程,相信我你会对它有一个非常清楚的认识。
答案 1 :(得分:1)
这与Symfony事件无关,当您使用$event->getException
获取类Exception的实例时,此类已定义了这些方法。
答案 2 :(得分:0)
最后一个问题。
为什么
$exception
可以使用getMessage()
和getCode()
Symfony是一个使用严格的Objcet Oriented范例的框架。通常是一个功能:
在简单的示例中,我们可以认为$exception
是一个Exception
对象,其属性可以在here中看到。
同样要了解听众的工作方式,如果您对“观察者设计模式”有了一些了解,那将会有所帮助。这是一个小小的解释。
为了理解您的代码,您可以创建一个在任何地方抛出> <{strong> Exception
时激活的侦听器。因此,您可以选择是否显示错误消息。