【问题标题】:Zend Framework 2 - Redirecting from within a Controller Plugin without returningZend Framework 2 - 从控制器插件内重定向而不返回
【发布时间】:2012-11-08 18:18:02
【问题描述】:

是否可以从控制器插件中将用户重定向到新 URL,而无需向控制器返回响应对象?

具体来说,我想将用户重定向到当前 URL 的安全版本。所以在 ZF2 我有这个:

$url = 'https://'.$this->getURL();

$response = $this->getController()->redirect()->toUrl( $url );

return $response;

但是在 Zend Framework 1 中我能够做到:

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');

$url = 'https://'.$this->getURL();

$redirector->gotoUrlAndExit($url);

在 ZF2 中是否可以基本上“重定向然后退出”?

【问题讨论】:

  • 我知道您可能有理由在应用程序中执行此操作,但您可能会考虑在 Web 服务器级别处理此问题,并让应用程序不知道端口/协议。

标签: php zend-framework2


【解决方案1】:

假设您正在扩展 Zend\Mvc\Controller\Plugin\AbstractPlugin 那么您应该能够像这样重定向:

$this->getController()->plugin('redirect')->toUrl($url);
return FALSE;

如果你看一下 Zend\Mvc\Controller\Plugin\Redirect 中的 toUrl 方法,它看起来像这样:

/**
 * Redirect to the given URL
 *
 * @param  string $url
 * @return Response
 */
public function toUrl($url)
{
    $response = $this->getResponse();
    $response->getHeaders()->addHeaderLine('Location', $url);
    $response->setStatusCode(302);
    return $response;
}

很明显它返回响应对象,但它也已经添加了标头,并且您不必从控制器显式返回响应,所以从您的插件中您也不应该。我认为这通常是为了维护一个流畅的界面,但既然你知道你不需要它来做其他任何事情,你就不需要把它传回去。

注意:我没有在插件中对此进行测试,但我在控制器中进行了测试,它工作正常:

$this->plugin('redirect')->toUrl($url);
return FALSE;

【讨论】:

  • 你说得对;只需调用它最终会导致用户被重定向。然而,直到控制器操作中的所有其他内容都已执行,包括正在生成和发送的视图。我希望能尽快找到回复该回复的方法。
  • 哦,我明白你在说什么。我修改了上面示例中的插件调用,返回 FALSE;在我在控制器中测试的情况下,它仍然会重定向。我认为它应该在你的插件中工作。
  • 如果你希望做很多这样的事情,并且发现返回 FALSE 令人反感,你可以扩展 Redirect 插件,并创建一个新方法 toUrlAndExit($url);它的工作原理与本机 toUrl($url) 方法一样,但返回 FALSE。
  • 我的问题是当我返回 FALSE(如您的示例中)时,它返回 FALSE 控制器,而不是 来自控制器。如果他们已经在使用 SSL,我已经通过从插件返回 NULL 来解决这个问题,如果没有,则从 toUrl() 返回 Response 对象。然后在控制器中检查插件的返回值,如果它是一个响应对象,则返回它。否则我就继续。它不像 ZF1 允许的那样整洁,但我认为这样我至少可以更忠实于 ZF2 的模型。
【解决方案2】:

在你的插件中只返回动作:

return $this->getController()->getAction();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多