【问题标题】:Routing in Zend Framework 2Zend Framework 2 中的路由
【发布时间】:2013-10-03 04:42:04
【问题描述】:

我正在尝试在 Zend Framework 2 中进行一些路由,但它不起作用。

骨架应用程序的基础工作正常,所以我在文件 \module\User\config\module.config.php 中添加了一个名为 User 的新模块和以下代码

'controllers' => array(
    'invokables' => array(
        'User\Controller\User' => 'User\Controller\UserController',
    ),
),

'router' => array(
    'routes' => array(

        'login' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/login',
                'defaults' => array(
                    '__NAMESPACE__' => 'User\Controller',
                    'controller'    => 'User',
                    'action'        => 'login',
                ),
            ),
        ),

        'user_create' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/user/create',
                'defaults' => array(
                    '__NAMESPACE__' => 'User\Controller',
                    'controller'    => 'User',
                    'action'        => 'create',
                ),
            ),
        ),

    ),
),

如果我尝试访问第一条路由 (/login),它可以工作。

但是第二条路由(/user/create)导致错误:

文件:

F:\www\ZendVendas\library\Zend\Mvc\Router\Http\TreeRouteStack.php:313

消息:

Route with name "create" not found

如果我确实创建了一个没有控制器名称的路由,它可以工作:

        'create' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/create',
                'defaults' => array(
                    '__NAMESPACE__' => 'User\Controller',
                    'controller'    => 'User',
                    'action'        => 'create',
                ),
            ),
        ),

但我希望路由是“/user/create”,而不是“/create”。

我搜索了很多主题,但看不到我的错误在哪里。 感谢任何帮助;)

编辑:根据@Jurian 的建议调整代码

'router' => array(
    'routes' => array(

        'user' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/user',
                'defaults' => array(
                    'controller' => 'User\Controller\User',
                    'action'     => 'profile',
                ),
            ),


            'child_routes' => array(
                'login'  => array(
                    'type' => 'Literal',
                    'options' => array(
                        'route'    => '/login',
                        'defaults' => array(
                            'controller' => 'User\Controller\User',
                            'action'     => 'login',
                        ),
                    ),
                ),
                'create' => array(
                    'type' => 'Literal',
                    'options' => array(
                        'route'    => '/create',
                        'defaults' => array(
                            'controller' => 'User\Controller\User',
                            'action'     => 'create',
                        ),
                    ),
                ),
            ),
        ),

    ),
),

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

    您必须了解路由在 Zend Framework 2 中是如何工作的。路由有一个名称和一些配置。结构如下:

    'router' => array(
      'routes' => array(
        'route_name_1' => array( /* config here */ ),
        'route_name_2' => array( /* config here */ ),
        'route_name_3' => array( /* config here */ ),
      ),
    ),
    

    这里的路由名称是route_name_1 等。如果你组装一个url,你使用那个路由名称。所以如果route_name_1 有 url /foo/bar/baz,你可以使用 url view helper 请求route_name_1 的 url:

    echo $this->url('route_name_1'); // prints /foo/bar/baz
    

    你的 url /user/create 映射到路由 name user_create 所以要组装这个 url,你需要传递路由名称:

    echo $this->url('user_create'); // prints /user/create
    

    儿童路线

    还有一个子路由的概念。这可以给你一个路由user,它映射到/user,然后这个用户路由有一个子create,它映射到/create,因此创建的“总”路由是/user/create。这可以配置如下:

    'router' => array(
      'routes' => array(
        'route_name_1' => array( /* config here */ ),
        'route_name_2' => array(
          /* config here */
    
          'child_routes' => array(
            'child_name_1' => array( /* config here */ ),
            'child_name_2' => array( /* config here */ ),
          ),
        ),
      ),
    ),
    

    现在,如果你想为route_name_2 组装一个 url,它看起来就像上面一样:

    echo $this->url('route_name_1');
    

    但是,如果您需要为 child_name_1 组合 URL,您可以在名称与其父级之间构建一个带有 / 的“路径”:

    echo $this->url('route_name_1/child_name_1');
    

    因此,尽管您可以使用已有的路由名称访问 /user/create 路由,但您可能希望使用子路由,因为这为您提供了更灵活的路由系统:

    'router' => array(
      'routes' => array(
        'user' => array(
          'type'    => 'Literal',
          'options' => array(
            'route'    => '/user/create',
              'defaults' => array(
                'controller' => 'User\Controller\User',
                'action'     => 'profile',
              ),
            ),
          ),
    
          'child_routes' => array(
            'login'  => array(
              'type' => 'Literal',
              'options' => array(
                'route'    => '/login',
                'defaults' => array(
                  'action'     => 'login',
                ),
              ),
            ),
            'create' => array(
              'type' => 'Literal',
              'options' => array(
                'route'    => '/create',
                'defaults' => array(
                  'action'     => 'create',
                ),
              ),
            ),
          ),
        ),
      ),
    ),
    

    然后你有一个路由user 映射到一个“配置文件”。如果你组装user/create 你去/user/create 它使用来自用户控制器的“createAction”。 user/login 路由也是如此。

    【讨论】:

    • 嗨@Jurian!感谢您的详细解释。现在我可以更好地理解路线的结构。但是,不幸的是,它仍然不起作用!错误是一样的。也许我缺少一些配置文件?感谢您的帮助!
    • 你能发布你的更新路由配置和你“尝试访问路由”的位置吗?
    • 我已经用我的路由的最新版本编辑了帖子。现在,我尝试访问路由(/user/create)和(/user/login),但现在两个路由都出现错误
    • 嗨@Jurian!我设法找到了错误。我会做更多的测试,稍后再给出答案。无论如何,非常感谢您的帮助!问候
    【解决方案2】:

    我发现我做错了什么。

    在我的一个视图文件中,有一个 URL 函数指向路由 /create。 如果 Zend 用无效路由指示文件会很有帮助,但是,一旦我发现错误,现在一切正常。

    'router' => array(
        'routes' => array(
    
            'login' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/login',
                    'defaults' => array(
                        'controller' => 'User\Controller\User',
                        'action'     => 'login',
                    ),
                ),
            ),
    
            'logout' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/logout',
                    'defaults' => array(
                        'controller' => 'User\Controller\User',
                        'action'     => 'logout',
                    ),
                ),
            ),
    
            'user' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/user',
                    'defaults' => array(
                        'controller' => 'User\Controller\User',
                        'action'     => 'profile',
                    ),
                ),
                'child_routes' => array(
                    'create' => array(
                        'type' => 'Literal',
                        'options' => array(
                            'route'    => '/create',
                            'defaults' => array(
                                'controller' => 'User\Controller\User',
                                'action'     => 'create',
                            ),
                        ),
                    ),
                    'edit' => array(
                        'type' => 'Literal',
                        'options' => array(
                            'route'    => '/edit',
                            'defaults' => array(
                                'controller' => 'User\Controller\User',
                                'action'     => 'edit',
                            ),
                        ),
                    ),
                ),
            ),      
    
        ),
    ),
    

    感谢您的帮助!

    【讨论】:

    • ZF2找不到路线怎么知道“错误路线”? ^^
    • 我的意思是 ZF2 可以指向具有无效路由的 文件。像这样:File: \module\User\view\user\user\create.phtmlMessage: Route with name "create" not found :)
    • 真可惜...现在我看到了。哈哈!谢谢山姆! =D
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 2014-05-02
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多