0

我的 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”。

现在我需要一条通往应用程序模块的路线。问题是,如果我简单地为模块应用程序使用类似的路由,则此新路由将匹配“/admin/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'

                )

            )

        ),

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

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

4

1 回答 1

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数组下定义,而是在路由的最顶层数组中定义),因此以下代码等效于前面的示例:

'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,
),
于 2013-06-05T16:00:19.370 回答