ZF2使用重定向控制器之外(ZF2 Use Redirect in outside of contr

2019-08-07 21:18发布

我的工作被称为在Module.php并连接到引导的ACL。

显然,ACL限制访问的网站,这带来了重定向需要的某些区域。 但是,试图利用控制器插件重定向当它不作为插件似乎需要一个控制器工作。

什么是从控制器之外之外重定向的最佳方法? 香草header()函数是不适合作为我需要使用定义的路由。

任何帮助将是巨大的!

干杯-

Answer 1:

在一般情况下,要短路通过返回的响应调度过程。 在routedispatch您可以返回响应,停止常规码流停止,并直接完成的结果。 在ACL的情况下检查它很可能要提前返回该响应并重定向到用户的登录页面。

你要么构建控制器的响应或者您检查插件的返回值和重定向时,它的响应。 注意第二种方法是一样的PRG插件是如何工作的 。

第一种方法的一个例子:

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;
        }
    }
}

在你的问题你说:

[...]不作为插件似乎需要一个控制器工作。

当你想要做这可能是控制器插件中的一个问题$this->getController()的插件。 你要么必须扩展Zend\Mvc\Controller\Plugin\AbstractPlugin或实施Zend\Mvc\Controller\Plugin\PluginInterface ,以确保您的ACL插件被注入控制器。

如果你不希望这样,有你直接返回自己创建一个响应的替代品。 这是一个有点不太灵活,你创建一个响应对象,而已经有一个响应对象(导致可能的冲突都响应),但该插件的代码会改变这样的:

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;
        }
    }
}


文章来源: ZF2 Use Redirect in outside of controller