Pablo Kowalczyk
Pablo Kowalczyk

Reputation: 127

Zend Framework 2 - Why i can't override MvcEvent's MatchRoute?

i would like to match all requests where user is unlogged to controller Admin\Controller\Sign and action in. I wrote this code in onBootstrap() method in Module.php file :

if (!$authService->hasIdentity()) {
    $routeMatch = new RouteMatch(
        array(
            'controller' => 'Admin\Controller\Sign', 
            'action'     => 'in'
        )
    );

    $event->setRouteMatch($routeMatch);
}

I don't get any errors, but code doesn't work, why?

Upvotes: 1

Views: 1581

Answers (2)

yechabbi
yechabbi

Reputation: 1881

The problem here is that the application route event (MvcEvent::EVENT_ROUTE) is triggered after the (MvcEvent::EVENT_BOOTSTRAP). Which means even if you're setting the route match at the bootstrap level, the application is going to override it with the route match of the request after the MvcEvent::EVENT_ROUTE.

If you want to avoid this overriding you need to add a listener for the route event with a very low priority to make sure it will not be overridden:

$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, array($this, 'onRouteEvent'), -1000000);

Note : the onRouteEvent would be the method of your Module class that handles the route event (similar to your code).

If you want to short-circuit your application running at the bootstrap level, what you can do is to send the headers with redirection code to the client:

//get the url of the login page (assuming it has route name 'login')
$url = $e->getRouter()->assemble(array(), array('name' => 'login'));
$response=$e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
$response->sendHeaders();

Upvotes: 4

Raj
Raj

Reputation: 1284

add a route entry sign_in as below in the routes section of the module.config.php under admin module

'sign_in' => array(
    'type'    => 'Segment',
    'options' => array(
        'route' => '/admin/sign/in',
        'defaults' => array(
            'controller' => 'sign',
            'action'     => 'in',
        ),
    ),
),

and call the route in the controller like this

$this->redirect()->toRoute('sign_in');

Upvotes: 1

Related Questions