我正在使用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
路线正在运行。
我已经解决了为每种葡萄酒类型创建不同路线的问题,但我想了解我做错了什么:)
答案 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}',
),
从默认/约束部分删除冒号,它应该可以正常工作。
由于您已将冒号放在那里,因此不会强制使用约束,因此将使用默认约束,首先路由将匹配。