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, и оно должно работать нормально.
Поскольку вы поместили туда двоеточие, ограничения не вводятся принудительно, поэтому будут использоваться ограничения по умолчанию, и каждый маршрут, который будет первым, будет совпадать.