Zf2:控制器转发/调用生成404错误

时间:2015-03-26 11:47:49

标签: rest authentication zend-framework2 phpunit

我正在为我在另一个问题中描述的两个不同模块实现单独的auth解决方案。

Zend framework 2 : Add different authentication adapter for two different modules

现在在AuthListener文件中,如果身份验证失败,我会编写用于转发/调用其他控制器/操作的代码。那是

    $result = $this->adapter->authenticate();

    if (!$result->isValid()) {

        $response = $event->getResponse();

        // Set some response content
        $response->setStatusCode(401);

        $routeMatch = $event->getRouteMatch();
        $routeMatch->setParam('controller', 'First\Controller\Error');
        $routeMatch->setParam('action', 'Auth');
    }

现在我收到404错误 - “请求的控制器无法发送请求”。首先,我认为我没有为Error / Auth添加路由,但后来我验证了所有其他控制器/操作也获得了404。所有都可以通过各自的路线直接访问。但转发导致404错误。一件重要的事情 - 我通过phpunit发送身份验证请求来制作单元测试用例。

更新:路线详情:

'routes' => array(
    'rest' => array(
        'type' => 'Zend\Mvc\Router\Http\Segment',
        'options' => array(
            'route'    => '/rest[/:id]',
            'constraints' => array(
                'id'     => '[0-9]+',
            ),
            'defaults' => array(
                'controller' => 'First\Controller\Index'
            ),
        ),
    ),
    'error' => array(
        'type'    => 'segment',
        'options' => array(
            'route'    => '/rest-error/[/:action][/:id]',
            'constraints' => array(
                'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                'id'     => '[0-9]+',
            ),
            'defaults' => array(
                'controller' => 'First\Controller\Error',
                'action'     => 'auth',
            ),
        ),
    )
),

'controllers' => array(
    'invokables' => array(
        'First\Controller\Auth' => 'First\Controller\AuthController',
        'First\Controller\Error' => 'First\Controller\ErrorController'
    ),
),

Module.php

$listener = $serviceManager->get('First\Service\AuthListener');
$listener->setAdapter($serviceManager->get('Rest\Service\BasicAuthAdapter'));
$eventManager->getSharedManager()->attach('First', 'dispatch', $listener, 100);

我也尝试使用forward而不是上面的解决方案,但是这给了循环前进Circular forwarding detected: greater than 10 nested forwards错误。我认为事件在前进时被称为。

2 个答案:

答案 0 :(得分:0)

尝试像这样调用你的行动: $ routeMatch-> setParam(' action',' auth');

答案 1 :(得分:0)

我认为问题可能会发生,因为您正在倾听MvcEvent::EVENT_DISPATCH。在您的监听器中,您为controller设置了新的actionRouteMatch变量,但由于您已经通过了路由事件,因此更改这些参数将不会产生任何影响。

你应该听取MvcEvent::EVENT_ROUTE,然后它可能会有用。