redirect - ZF2 在 Controller 外部使用重定向

标签 redirect controller zend-framework2

我正在开发一个 ACL,它在 Module.php 中调用并附加到 Bootstrap 。

显然,ACL 限制了对站点某些区域的访问,这就需要重定向。但是,当尝试使用 Controller 插件进行重定向时,它不起作用,因为该插件似乎需要 Controller 。

从 Controller 外部重定向的最佳方法是什么?普通 header() 函数不适合,因为我需要使用定义的路由。

任何帮助都会很棒!

干杯-

最佳答案

通常,您希望通过返回响应来短路调度过程。在 routedispatch 期间,您可以返回响应来停止通常的代码流停止并直接完成结果。如果进行 ACL 检查,您很可能希望尽早返回该响应并重定向到用户的登录页面。

您可以在 Controller 中构造响应,也可以检查插件的返回值并在响应时进行重定向。请注意,第二种方法类似于 how the PRG plugin works .

第一种方法的示例:

use Zend\Mvc\Controller\AbstractActionController;

class MyController extends AbstractActionController
{
    public function fooAction()
    {
        if (!$this->aclAllowsAccess()) {
            // Use redirect plugin to redirect
            return $this->redirect('user/login');
        }

        // normal code flow
    }
}

像 PRG 插件这样的例子可以工作:

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Http\Response;

class MyController extends AbstractActionController
{
    public function fooAction()
    {
        $result = $this->aclCheck();

        if ($result instanceof Response) {
            // Use return value to short-circuit
            return $result
        }

        // normal code flow
    }
}

插件可能看起来像这样(在第二种情况下):

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class AclCheck extends AbstractPlugin
{
    public function __invoke()
    {
        // Check the ACL
        if (false === $result) {
            $controller = $this->getController();
            $redirector = $controller->getPluginManager()->get('Redirect');
            $response = $redirector->toRoute('user/login');

            return $response;
        }
    }
}

在你的问题中你说:

[...] it doesn't work as the plugin appears to require a controller.

当您想在插件中执行 $this->getController() 时,这可能是 Controller 插件内部的问题。您必须扩展 Zend\Mvc\Controller\Plugin\AbstractPlugin 或实现 Zend\Mvc\Controller\Plugin\PluginInterface 以确保您的 ACL 插件已注入(inject) Controller 。

如果您不希望这样做,还有另一种选择,您可以直接返回您自己创建的响应。它不太灵活,您在已经存在响应对象的情况下创建响应对象(可能导致两个响应发生冲突),但插件代码会像这样更改:

use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Http\PhpEnvironment\Response;

class AclCheck extends AbstractPlugin
{
    public function __invoke()
    {
        // Check the ACL
        if (false === $result) {
            $response = new Response;
            $response->setStatusCode(302);
            $response->getHeaders()
                     ->addHeaderLine('Location', '/user/login');

            return $response;
        }
    }
}

关于redirect - ZF2 在 Controller 外部使用重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14468200/

相关文章:

用于重定向文件的 Firefox 扩展

jquery nyromodal 关闭和重定向

javascript - 无法使用 AngularJS 显式 `$http` 语法注入(inject) `app.controller`?

java - 当我将 Controller 放入嵌套 FXML 文件中时出现 LoadException

php - 采埃孚 2 :Catchable fatal error: Argument 1 passed to Zend\View\HelperPluginManager

.htaccess - 如何在.htaccess上下文中阻止多次mod_rewrite传递(或无限循环)

redirect - DNS Gurus : How to forward www. domain.com 到 domain.com 仅使用 DNS?

java - 多个@Before 方法是否在 Controller 继承中起作用?

php - ZF1 的 quoteInto() 方法在 ZF2 中的等价物是什么?

forms - 仅当选择 radio 时才需要文本字段。 ZF2