7

我正在尝试在 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',
                        ),
                    ),
                ),
            ),
        ),

    ),
),
4

2 回答 2

16

您必须了解路由在 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 ,你可以使用 url view helper/foo/bar/baz来询问url:route_name_1

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

您的 url/user/create映射到路由名称 user_create,因此要组装此 url,您需要传递路由名称:

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

儿童路线

还有一个子路由的概念。这可以给你一个user映射到的路由,/user然后这个用户路由有一个create映射到的子/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您构建一个“路径”,并/在名称与其父级之间构建一个“路径”:

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

于 2013-10-03T07:24:06.437 回答
0

我发现我做错了什么。

在我的一个视图文件中,有一个指向路由的 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',
                        ),
                    ),
                ),
            ),
        ),      

    ),
),

感谢您的帮助!

于 2013-10-04T01:52:32.200 回答