Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend Framework 2:如何在应用程序到达控制器之前将重定向放入模块_Php_Redirect_Zend Framework2 - Fatal编程技术网

Php Zend Framework 2:如何在应用程序到达控制器之前将重定向放入模块

Php Zend Framework 2:如何在应用程序到达控制器之前将重定向放入模块,php,redirect,zend-framework2,Php,Redirect,Zend Framework2,假设我们有一个名为Cart的模块,如果满足某些条件,我们希望重定向用户。 我想在应用程序到达任何控制器之前,在模块引导阶段放置重定向 下面是模块代码: <?php namespace Cart; class Module { function onBootstrap() { if (somethingIsTrue()) { // redirect } } } ?> 我想使用Url控制器插件,但似乎控制器实

假设我们有一个名为Cart的模块,如果满足某些条件,我们希望重定向用户。 我想在应用程序到达任何控制器之前,在模块引导阶段放置重定向

下面是模块代码:

<?php
namespace Cart;

class Module
{
    function onBootstrap() {
        if (somethingIsTrue()) {
            // redirect
        }
    }
}
?>

我想使用Url控制器插件,但似乎控制器实例在这个阶段不可用,至少我不知道如何获得它

提前谢谢你能试试这个吗

$front = Zend_Controller_Front::getInstance();
$response = new Zend_Controller_Response_Http();
$response->setRedirect('/profile');
$front->setResponse($response);

这应该做必要的工作:

<?php
namespace Cart;

use Zend\Mvc\MvcEvent;

class Module
{
    function onBootstrap(MvcEvent $e) {
        if (somethingIsTrue()) {
            //  Assuming your login route has a name 'login', this will do the assembly
            // (you can also use directly $url=/path/to/login)
            $url = $e->getRouter()->assemble(array(), array('name' => 'login'));
            $response=$e->getResponse();
            $response->getHeaders()->addHeaderLine('Location', $url);
            $response->setStatusCode(302);
            $response->sendHeaders();
            // When an MvcEvent Listener returns a Response object,
            // It automatically short-circuit the Application running 
            // -> true only for Route Event propagation see Zend\Mvc\Application::run

            // To avoid additional processing
            // we can attach a listener for Event Route with a high priority
            $stopCallBack = function($event) use ($response){
                $event->stopPropagation();
                return $response;
            };
            //Attach the "break" as a listener with a high priority
            $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, $stopCallBack,-10000);
            return $response;
        }
    }
}
?>

当然,它会给您一个错误,因为您必须将侦听器连接到事件。在下面的示例中,我使用SharedManager并将侦听器附加到
AbstractActionController

当然,您可以将侦听器附加到另一个事件。下面只是一个工作示例,向您展示它是如何工作的。有关mor信息,请访问


出现错误时,页面未正确重定向

public function onBootstrap($e) {

        $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
        if(someCondition==true) {
           $controller->plugin('redirect')->toRoute('myroute');        
        }
}

谢谢你的回答。您的代码是针对Zend Framework 1的。我需要一个ZF2的解决方案。。对不起,我没注意到。我还没有使用ZF2,但是一些搜索给了我这个片段。你能试试吗?谢谢!我终于明白了!我需要的解决方案与您在回答中提供的页面几乎相同。调用未定义的方法Zend\Mvc\Application::plugin(),我正在寻找重定向到route的方法,但我认为唯一的方法是获取控制器实例,然后重定向。我以前一直在寻找通过模块重定向,但我没有通过配置模块类得到任何解决方案。但是,我将listerner附加到了_uu名称空间_u,而不是AbstractActionController。在sendHeaders()之后从函数返回不会停止执行,即控制器仍将被调度。最好退出。我更新了答案,只有在路由事件期间,应用程序才能运行得更短。我添加了一个具有高优先级的侦听器,可以避免其他内部侦听器(短路)。如果您好奇,请在Zend\Mvc\应用程序行上从第行开始检查“短路”逻辑278@imel96退出永远不是一个好主意。如果你需要,你的设计是有缺陷的。exit()的唯一有效用法是设置非零的退出代码。不要使用exit。它将中断PHPUnit测试用例的执行。
public function onBootstrap($e) {

        $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
        if(someCondition==true) {
           $controller->plugin('redirect')->toRoute('myroute');        
        }
}