Zend Framework 2路由问题

时间:2014-08-08 16:10:44

标签: php zend-framework2

我刚刚开始学习ZF2,所以如果问题很简单,我会道歉。 我想要实现的是将用户从projectname.loc:8888 / user重定向到projectname.loc:8888 / user / login 如果我手动输入projectname.loc:8888 / user / login,则表单显示没有任何问题。如果我输入projectname.loc:8888 / user,则会收到以下错误消息:找不到名称为“login”的路由。

路由设置为modul.config.php:

'user' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/user',
                'defaults' => array(
                    '__NAMESPACE__' => 'TAuth\Controller',
                    'controller'    => 'User',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'process' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '[/:controller]/[:action]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),

UserController.php:

public function indexAction() {
    return $this->redirect()->toRoute('user/login', array('controller'=>'user', 'action'=>'login'));
}
public function loginAction() {
    $form = new Login();

    return ['form' => $form];
}

我感觉我有错误的child_routes配置,但我无法弄清楚正确的解决方案...... :(

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

应该是这样的。

public function indexAction() {
    // it's user/process rather than user/login
    return $this->redirect()->toRoute('user/process', array('controller'=>'user', 'action'=>'login'));
}

有关您的信息,zf2路由将查找路由密钥。

'user' => array( /** toRoute('user', ... ) **/
        'type'    => 'Literal',
        'options' => array(
                 // ...
        ),
        'may_terminate' => true,
        'child_routes' => array(
            'process' => array( /** toRoute('user/process', ... )  **/
                // ...
            ),
            'some-other-route' => array( /** toRoute('user/some-other-route', ... ) **/
                // ...
            ),
        ),
    ),

答案 1 :(得分:0)

$this->redirect()->toRoute('user/login')的路由名称与路由配置中的数组密钥相关(而不是route参数,因为我认为你会混淆它)

所以你需要做的就是添加一个新的登录信息'路由。

    'user' => array(
        'type'    => 'Literal',
        'options' => array(
            'route'    => '/user',
            'defaults' => array(
                '__NAMESPACE__' => 'TAuth\Controller',
                'controller'    => 'User',
                'action'        => 'index',
            ),
        ),
        'may_terminate' => true,
        'child_routes' => array(

            // Placed before 'process' so it would match first
            'login' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/login',
                    'defaults' => array(
                        // controller & namespace inherited from parent
                        'action' => 'login',
                    ),
                ),
                'may_terminate' => true,
            ),

            'process' => array(
                // .....
            ),
        ),
    )