Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redirect in Front Controller plugin Zend

I'm trying to centralise my redirects (based on authentication and various other states) into a front controller plugin. So far I've tried:

    $this->setRequest(new Zend_Controller_Request_Http('my_url'));

at various points in the plugin (i.e. from routeStartup to dispatchLoopShutdown) and also:

    $this->setResponse(new Zend_Controller_Response_Http('my_url'));

Can anyone offer some assistance on this, or point me in the direction of a tutorial?

like image 859
sunwukung Avatar asked Mar 01 '10 17:03

sunwukung


3 Answers

The easiest way would be to use ZF's Redirect ActionHelper

    $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    $r->gotoUrl('/some/url')->redirectAndExit();

Alternatively instantiate it without the HelperBroker

    $r = new Zend_Controller_Action_Helper_Redirector;
    $r->gotoUrl('/some/url')->redirectAndExit();

The ActionHelper provides an API solely concerned about redirecting through a number of methods, like gotoRoute, gotoUrl, gotoSimple, which you can use depending on your desired UseCase.

Internally, the ActionHelper uses the APIs of Response and Router to do the redirect though, so you can also use their methods directly, e.g.

    $request->setModuleName('someModule')
            ->setControllerName('someController')
            ->setActionName('someAction');

or

    $response->setRedirect('/some/url', 200);

Further reading:

  • http://devzone.zend.com/article/3372-Front-Controller-Plugins-in-Zend-Framework
  • http://framework.zend.com/manual/en/zend.controller.actionhelpers.html
  • http://framework.zend.com/manual/en/zend.controller.response.html
  • http://framework.zend.com/manual/en/zend.controller.plugins.html
  • http://framework.zend.com/apidoc/core
  • http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Controller/
like image 76
Gordon Avatar answered Nov 08 '22 05:11

Gordon


If you are looking to redirect if the user is not logged it, the first parameter of dispatchLoopStartup() is a handle to the request object.

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
        $request->setControllerName('auth');
        $request->setActionName('login');
        // Set the module if you need to as well.
    }
}
like image 26
smack0007 Avatar answered Nov 08 '22 04:11

smack0007


If you want to redirect in the index page then this should suffice.

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
          $baseUrl = new Zend_View_Helper_BaseUrl();
          $this->getResponse()->setRedirect($baseUrl->baseUrl());
    }
}

If you want to redirect somewhere else then just change the parameter in the setRedirect() function

Thanks! :)

like image 3
renzki Avatar answered Nov 08 '22 05:11

renzki