Zend Framework 2 — Маршрут сегмента

Я создаю приложение, используя 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',
        ),
    ),
),

Когда я тестирую с 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...

Если я проверю регулярное выражение :action с помощью preg_match_all, ничего не будет найдено в строке, подобной domain.ext/vineyard/Vineyard-name/.

Если я отключу модуль Company или удалю маршрут company_wines, маршрут vineyard будет работать.

Я решил создать разные маршруты для каждого типа вин, но я хотел бы понять, что я делаю неправильно :)


person Gabriel    schedule 26.07.2013    source источник


Ответы (1)


Ваш синтаксис неверен:

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

удалите двоеточие из раздела по умолчанию/ограничений, и все должно работать нормально.

Поскольку вы поместили туда двоеточие, ограничения не применяются принудительно, поэтому будут использоваться ограничения по умолчанию, какой бы маршрут ни пришел первым, будет соответствовать.

person Andrew    schedule 26.07.2013
comment
Кроме того, важен порядок, в котором эти маршруты определены на уровне конфигурации, поскольку строка vineyard также соответствует регулярному выражению для slug_company... - person Sam; 26.07.2013
comment
@sam, вы правы, но URL-адрес и ограничения должны оцениваться полностью, верно? - person Gabriel; 26.07.2013
comment
@Gabriel Router должен вернуть первое совпадение, в котором больше нет child_routes. В остальном я не очень понимаю вопрос. - person Sam; 26.07.2013