1

我想匹配用户未登录到控制器Admin\Controller\Sign和操作的所有请求inonBootstrap()我在文件中的方法中编写了这段代码Module.php

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

    $event->setRouteMatch($routeMatch);
}

我没有收到任何错误,但代码不起作用,为什么?

4

2 回答 2

4

这里的问题是应用程序路由事件(MvcEvent::EVENT_ROUTE)是在(MvcEvent::EVENT_BOOTSTRAP)之后触发的。这意味着即使您在引导级别设置路由匹配,应用程序也会在 MvcEvent::EVENT_ROUTE 之后使用请求的路由匹配来覆盖它。

如果您想避免这种覆盖,您需要为具有非常低优先级的路由事件添加一个侦听器,以确保它不会被覆盖:

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

注意: onRouteEvent 将是处理路由事件的 Module 类的方法(类似于您的代码)。

如果您想短路在引导级别运行的应用程序,您可以做的是将带有重定向代码的标头发送到客户端:

//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();
于 2012-12-26T07:44:00.333 回答
1

在 admin 模块下 module.config.php 的 routes 部分添加如下路由条目 sign_in

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

并像这样调用控制器中的路由

$this->redirect()->toRoute('sign_in');
于 2012-12-26T06:35:25.193 回答