2013-07-26 178 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