2013-07-26 176 views
0

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

在一个模块中,称为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', 
     ), 
    ), 
), 

当我与URL domain.ext/Company-name/red-wines/domain.ext/Company-name/white-wines测试等等,Company控制器被调用。

如果我domain.ext/vineyard/Vineyard-name/测试中,Vineyard控制器不会被调用,仍调用Company一个错误消息说,该控制器不能分派请求。当然,CompanyController课程中没有VineyardnameAction()的方法。

我期待,关于正则表达式指定:action对值列表中的路由匹配,此外,如果:slug_company正则表达式匹配“标志” vineyard,那么就没有行动符合Vineyard-name一部分......

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

如果我禁用Company模块或删除company_wines路由,vineyard路由正在工作。

我已经解决了创建每个葡萄酒类型不同的路线,但我想了解whath我做错了:)

回答

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

移除结肠默认/约束部分,它应该工作正常。

正如你已经把冒号放在那里,约束没有被强制使用,所以默认约束将被使用,哪条路线先来匹配。

+0

此外,这些路由在配置级定义的顺序很重要,因为字符串'vineyard'也与'slug_company'的正则表达式匹配... – Sam

+0

@Andrew,谢谢!我真的是小白:D – Gabriel

+0

@sam你是对的,但网址和约束应该完全评估,对吧? – Gabriel