【问题标题】:ZF2 - Trying to create a route like ZF1ZF2 - 尝试创建类似 ZF1 的路线
【发布时间】:2013-06-05 13:45:36
【问题描述】:

我的 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'

                )

            )

        ),

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

有人对如何解决这个问题提出建议吗?

【问题讨论】:

    标签: zend-framework2 zend-framework-routing


    【解决方案1】:

    注意路由顺序:路由是使用 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,
    ),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多