Symfony2:在发送响应头后强制停止代码执行

时间:2015-07-23 10:12:26

标签: php symfony symfony-http-foundation

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

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

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

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

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

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

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

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

修改

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:1)

好的,我找到了办法。我所要做的就是在退出之前终止内核 - 它会调度所有响应后的事件(比如分析,记录等)。

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

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