Zend Framework 2 - 段路由

时间:2013-07-26 08:46:52

标签: zend-framework2 zend-framework-routing

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

在一个名为Company的模块中,有这条路线:

'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的模块中,我有这条路线:

'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',
        ),
    ),
),

当我使用网址domain.ext/Company-name/red-wines/domain.ext/Company-name/white-wines等进行测试时,会调用Company控制器。

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

我期望路线与:action的正则表达式上指定的值列表匹配,如果:slug_company正则表达式匹配“flag”vineyard,那么就没有动作符合Vineyard-name部分......

如果我使用:action测试preg_match_all正则表达式,则domain.ext/vineyard/Vineyard-name/之类的字符串中找不到任何内容。

如果我停用Company模块或删除company_wines路线,vineyard路线正在运行。

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

1 个答案:

答案 0 :(得分:2)

您的语法错误:

'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}',
),

从默认/约束部分删除冒号,它应该可以正常工作。

由于您已将冒号放在那里,因此不会强制使用约束,因此将使用默认约束,首先路由将匹配。