ZF2 - 尝试创建像ZF1这样的路线

时间:2013-06-05 13:45:36

标签: zend-framework2 zend-framework-routing

我实际上在我的ZF2应用程序中有2个模块(应用程序和管理员),我想要像ZF1中那样的URL路由。我目前有以下路线:

'router' => array
(

    'routes' => array
    (

        'admin' => array
        (

            'type' => 'Segment',
            'options' => array
            (

                'route' => 'admin/[:controller[/:action]]',

                'constraints' => array
                (
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                ),

                'defaults' => array
                (
                    '__NAMESPACE__' => 'Admin\Controller',
                    'controller' => 'Index',
                    'action' => 'index',
                ),

            ),

            'may_terminate' => true,
            'child_routes' => array
            (

                'wildcard' => array
                (

                    'type' => 'Wildcard'

                )

            )

        ),

    ),

),

所以它会匹配“/ admin”,“/ admin / controller”,“/ admin / controller / action”而不是“/ controller / action”。

现在我需要一个到Application模块的路由。问题是如果我只是为模块应用程序使用这样的路由,这条新路由将匹配“/ admin / controller”作为controller =“admin”和action =“controller”。

我还在应用程序中尝试了以下正则表达式路径:

'application' => array
        (

            'type' => 'Regex',
            'options' => array
            (

                'regex' => '/(?<controller>^(?!(admin)$)[a-zA-Z][a-zA-Z0-9_-]*)?' . 
                            '(/[a-zA-Z][a-zA-Z0-9_-]*)?',
                'spec' => '/%controller%/%action%',

                /*'constraints' => array
                (
                    //The controller cannot be "admin"
                    'controller' => '^(?!(admin)$)[a-zA-Z][a-zA-Z0-9_-]*',
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                ),*/

                'defaults' => array
                (
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller' => 'Index',
                    'action' => 'index',
                ),

            ),

            'may_terminate' => true,
            'child_routes' => array
            (

                'wildcard' => array
                (

                    'type' => 'Wildcard'

                )

            )

        ),

但它没有得到变量“控制器”和“动作”。

有没有人建议如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

介意路由顺序:使用LIFO堆栈处理路由,因此匹配请求URL时,数据中的最后一个是最后的。

这意味着您必须首先定义最通用的路线,以防止它们匹配相似但更具体的路线。

使用以下顺序不应该对controller参数有任何约束,因为以/admin开头的任何内容都将首先匹配

'route1' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/[:controller[/:action]]',
        'defaults' => array (
            'controller' => 'controller',
            'action' => 'index',
        ),
    ),
),
'route2' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/admin[/:controller[/:action]]',
        'defaults' => array (
            'controller' => 'admin-controller',
            'action' => 'index',
        ),
    ),
),

此外,您始终可以使用priority属性(不应在options数组下定义,但在路由的最顶层数组中)指定excplicitly路由优先级,因此以下代码为相当于前面的例子:

'route2' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/admin[/:controller[/:action]]',
        'defaults' => array (
            'controller' => 'admin-controller',
            'action' => 'index',
        ),
    ),
),
'route1' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/[:controller[/:action]]',
        'defaults' => array (
            'controller' => 'controller',
            'action' => 'index',
        ),
    ),
    'priority' => -1,
),