在发送响应标头后停止代码执行的正确方法是什么,但没有使用exit()
?
我知道脚本应该返回一个Response,但是如何强制它从Controller外部返回,例如从服务中返回?
假设我的服务方法确实以这种方式返回响应:
return RedirectResponse($url)->send();
但在另一个地方,它可以归还其他东西。所以我能做的就是检查它实际返回的内容:
$result = $myService->doSomething();
if ($result instanceof RedirectResponse) {
return $result;
}
我想要实现的是避免在我使用我的服务的每个地方检查结果类型,但我想在Profiler / logs中看到返回的响应(如果我使用exit()我不能)。< / p>
有没有办法强制内核终止?
修改
实际上该服务在任何控制器之前的事件中使用,所以我想在任何控制器执行之前进行重定向。那么也许省略控制器执行的方法呢?
答案 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();
如果有人会找到更好的方法,请回答,以便我可以切换标记。