Zend Framework 2: How to place a redirect into a module, before the application reaches a controller

后端 未结 4 1392
礼貌的吻别
礼貌的吻别 2020-12-28 21:19

Let\'s say we have a module named Cart and want to redirect users if some condition is met. I want to place a redirect at the module bootstrapping stage, before the applicat

相关标签:
4条回答
  • 2020-12-28 21:30

    The page isn't redirecting properly on error

    public function onBootstrap($e) {
    
            $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
            if(someCondition==true) {
               $controller->plugin('redirect')->toRoute('myroute');        
            }
    }
    
    0 讨论(0)
  • 2020-12-28 21:31

    This should do the necessary work:

    <?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;
            }
        }
    }
    ?>
    
    0 讨论(0)
  • 2020-12-28 21:49

    Of course it gives you an error because you must attach your listener to an event. In the folllowing example i use SharedManager and i attach the listener to AbstractActionController.

    Of course you can attach your listener to another event. Below is just a working example to show you how it works. For mor info visit http://framework.zend.com/manual/2.1/en/modules/zend.event-manager.event-manager.html.

    public function onBootstrap($e)
    {
        $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
            $controller = $e->getTarget();
            if (something.....) {
                $controller->plugin('redirect')->toRoute('yourroute');
            }
        }, 100);
    }
    
    0 讨论(0)
  • 2020-12-28 21:50

    Can you try this.

    $front = Zend_Controller_Front::getInstance();
    $response = new Zend_Controller_Response_Http();
    $response->setRedirect('/profile');
    $front->setResponse($response);
    
    0 讨论(0)
提交回复
热议问题