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 один и сообщение об ошибке говорят, что контроллер не может отправить запрос. Конечно, нет метода, называемого VineyardnameAction() в CompanyController учебный класс.

Я ожидал, что маршрут совпадает со списком значений, указанных в регулярном выражении для :actionтакже, если :slug_company регулярное выражение соответствует "флаг" vineyardто нет действия, соответствующего Vineyard-name часть...

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

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

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

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

удалите двоеточие из секции default / constraints, и оно должно работать нормально.

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

Другие вопросы по тегам