Zend framework2 Zend Framework 2段路由

Zend framework2 Zend Framework 2段路由,zend-framework2,zend-framework-routing,Zend Framework2,Zend Framework Routing,我正在使用Zend Framework v2.2.0构建一个应用程序,并为每个部分创建不同的模块 在名为公司的模块中,有以下路径: 'company_wines' => array( 'type' => 'Zend\Mvc\Router\Http\Segment', 'options' => array( 'route' => '/:slug_company/:action/', 'constraints'=>a

我正在使用Zend Framework v2.2.0构建一个应用程序,并为每个部分创建不同的模块

在名为
公司
的模块中,有以下路径:

'company_wines' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment',
    'options' => array(
        'route'    => '/:slug_company/:action/',
        'constraints'=>array(
            ':slug_company'=>'[a-zA-Z0-9\-_]+',
            ':action'=>'(wines|red\-wines|white\-wines|sparkling\-wines|dessert\-wines|rose\-wines){1}',
        ),
        'defaults' => array(
            'controller' => 'Company\Controller\Company',
        ),
    ),
),
'vineyard_page' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment',
    'options' => array(
        'route'    => '/vineyard/:slug_vineyard/',
        'constraints'=>array(
            ':slug_vineyard'=>'[a-zA-Z0-9\-_]+',
        ),
        'defaults' => array(
            'controller' => 'Vineyard\Controller\Vineyard',
            'action'     => 'vineyard',
        ),
    ),
),
在另一个名为葡萄园的模块中,我有以下路线:

'company_wines' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment',
    'options' => array(
        'route'    => '/:slug_company/:action/',
        'constraints'=>array(
            ':slug_company'=>'[a-zA-Z0-9\-_]+',
            ':action'=>'(wines|red\-wines|white\-wines|sparkling\-wines|dessert\-wines|rose\-wines){1}',
        ),
        'defaults' => array(
            'controller' => 'Company\Controller\Company',
        ),
    ),
),
'vineyard_page' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment',
    'options' => array(
        'route'    => '/vineyard/:slug_vineyard/',
        'constraints'=>array(
            ':slug_vineyard'=>'[a-zA-Z0-9\-_]+',
        ),
        'defaults' => array(
            'controller' => 'Vineyard\Controller\Vineyard',
            'action'     => 'vineyard',
        ),
    ),
),
当我使用url
domain.ext/Company name/red wines/
domain.ext/Company name/white wines
等进行测试时,会调用
Company
控制器

如果我使用
domain.ext/vineyard/vineyard name/
进行测试,则不会调用
vineyard
控制器,仍然会调用
Company
one,错误消息表示控制器无法调度请求。当然,在
CompanyController
类中没有名为
VineyardnameAction()
的方法

我希望路线与regex上为
:action
指定的值列表匹配,而且如果
:slug\u company
regex与“flag”
葡萄园
匹配,则没有与
葡萄园名称
部分匹配的操作

如果我用
preg\u match\u all
测试
:action
正则表达式,则在
domain.ext/vineyard/vineyard name/
这样的字符串中找不到任何内容

如果我禁用
公司
模块或删除
公司
路线,
葡萄园
路线正在运行

我已经解决了为每种葡萄酒类型创建不同路线的问题,但我想了解我做错了什么:)

您的语法错误:

'constraints' => array(
    'slug_vineyard'=>'[a-zA-Z0-9\-_]+',
),

'constraints'=>array(
    'slug_company'=>'[a-zA-Z0-9\-_]+',
    'action'=>'(wines|red\-wines|white\-wines|sparkling\-wines|dessert\-wines|rose\-wines){1}',
),
从default/constraints部分删除冒号,它应该可以正常工作


由于您已将冒号放在其中,因此不会强制约束,因此将使用默认约束,哪一条路线优先将匹配。

此外,在配置级别定义这些路线的顺序很重要,因为字符串
vineyard
也与
slug_company
的正则表达式匹配…@sam您是对的,但url和约束条件应完全评估,对吗?@Gabriel Router应该返回第一个没有子路由的匹配。除此之外,我不太明白这个问题。