3

发送响应标头后停止代码执行但不使用的正确方法是什么exit()

我知道脚本应该返回一个响应,但是如何强制它从控制器外部返回,例如从服务中返回?

可以说我的服务方法确实以这种方式返回响应:

return RedirectResponse($url)->send();

但在另一个地方它可以返回其他东西。所以我能做的是检查它实际返回的内容:

$result = $myService->doSomething();
if ($result instanceof RedirectResponse) {
    return $result;
}

我想要实现的是避免在我使用我的服务的每个地方检查结果类型,但我想在 Profiler/logs 中查看返回的响应(如果我使用 exit() 我不能)。

有没有办法强制内核终止?


编辑:

实际上,该服务在任何控制器之前的事件中使用,所以我想在任何控制器执行之前进行重定向。那么也许是一种省略控制器执行的方法?

4

2 回答 2

1

控制器是您创建的 PHP 可调用对象,它从 HTTP 请求中获取信息并创建并返回 HTTP 响应(作为 Symfony 响应对象)。

Controller 唯一关心的是处理请求并返回响应。让服务处理响应对象可能是一个糟糕的设计选择。

在任何情况下,您都可以直接退出/退出您的控制器并使用内核事件来挂钩请求/响应流并检查返回的响应。可能终止事件是正确的选择http://symfony.com/doc/current/components/http_kernel/introduction.html

于 2015-07-23T10:23:28.433 回答
1

好的,我找到了一种方法。我所要做的就是在退出之前终止内核——它确实调度了所有响应后事件(如分析、日志记录等)。

$response = new RedirectResponse($url);
$response->send();
$kernel->terminate($request, $response);
exit();

如果有人能找到更好的方法,请回答,以便我可以切换标记。

于 2015-07-23T13:57:35.287 回答