在ZF2路由器配置中在主机名下配置子路由的正确方法是什么?

时间:2013-05-23 15:07:45

标签: zend-framework2

情景:

有一个名为fabric的zf2应用程序,其中包含两个名为" bike"和"汽车"并通过以下url结构提供类似(但不相同)的功能:

+------------------+-------+-------------------------+-------------+-----------------+--------+
|     Hostname     | Part  |          Page           |   Module    |   Controller    | Action |
+------------------+-------+-------------------------+-------------+-----------------+--------+
| www.fabric.dev   | /     | Company homepage        | Application | IndexController | index  |
| bikes.fabric.dev | /     | Homepage for bikes      | Bike        | IndexController | index  |
| bikes.fabric.dev | /list | Listing of bikes        | Bike        | ListController  | list   |
| cars.fabric.dev  | /     | Homepage for cars       | Car         | IndexController | index  |
| cars.fabric.dev  | /list | Listing of bikes        | Car         | ListController  | list   |
+------------------+-------+-------------------------+-------------+-----------------+--------+

所以,

  • Application,Bike和Car是不同的模块和命名空间\Application\Bike \Car
  • http服务器上有3个vhost(www ..,cars ..,bikes ..),它们指向同一目录:/www/fabric.dev/public
  • 每个模块在module.config.php文件中都有自己的路由定义,如下面的非工作样本:

    // module/Application/config/module.config.php
    'router' => array(
      'routes' => array(
         'home' => array(
           'type'    => 'Hostname',
           'options' => array(
               'route' => 'www.fabric.dev',
               'defaults' => array(
                 '__NAMESPACE__' => 'Application\Controller'
                 'controller'    => 'Application\Controller\Index',
                 'action'        => 'index',
               ),
            )
         )
       )
     );
    

    // module/Bike/config/module.config.php
    'router' => array(
      'routes' => array(
        'home' => array(
        'type'    => 'Hostname',
        'options' => array(
            'route' =>  'bikes.fabric.dev',
            'defaults' => array(
                '__NAMESPACE__' => 'Bike\Controller'
                'controller'    => 'Bike\Controller\Index',
                'action'        => 'index',
            ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
            'default' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/list',
                    'defaults' => array(
                        'controller'    => 'Bike\Controller\List',
                        'action'        => 'list',
                    ),
                  ),
               ),
            ),
         ),
       )
    )

问题和疑问

网上有足够的文档关于zf2的路由类,例如hostname,segment,literal和regex,但不是 how-to-pair ,并且将这些奇妙的类一起使用。

除了将所有应用程序源代码复制到单独的vhost目录之外,是否有正确的方法使用路由器配置提供上述uri方案?

1 个答案:

答案 0 :(得分:1)

您必须了解路由的工作原理。路由基于并包含一些选项。所有模块的所有配置(包括路由)都合并为一个配置数组。

这意味着如果您的应用程序中定义了路由home,然后在Bike中拥有相同路由home,则Bike将覆盖应用程序中的主页。 / p>

最好根据命名空间获得路径名称。所以申请路线:

'router' => array(
  'routes' => array(
     'home' => array(
       // config here
     )
   )
 );

自行车路线

'router' => array(
  'routes' => array(
     'bike' => array(
       // config here
     )
   )
 );

请注意第二个示例中homebike的区别!