2013-07-26 4 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 части ...

Если я тестирую regex :action с preg_match_all, ничего не найдено в строке, как 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, спасибо! Я действительно noob: D – Gabriel

+0

@sam вы правы, но url и ограничения должны оцениваться полностью, не так ли? – Gabriel

Смежные вопросы