【问题标题】:Symfony2: force stop code execution after sendiing Response headersSymfony2:发送响应标头后强制停止代码执行
【发布时间】:2015-07-23 10:12:25
【问题描述】:

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

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

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

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

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

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

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

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


编辑:

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

【问题讨论】:

    标签: php symfony symfony-http-foundation


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上该服务是在任何控制器之前的事件中使用的,所以我想在任何控制器执行之前进行重定向。我只是想让这个问题更笼统。
    • 更新了问题。
    • 好的,知道了!在同一页面上,您甚至可以找到请求事件。它应该是你正在寻找的东西。 symfony.com/doc/current/components/http_kernel/…
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多