Маршрутизация скелетных приложений ZF2 — дочерние маршруты

#php #routing #zend-framework2

#php #маршрутизация #zend-framework2

Вопрос:

Я пытаюсь получить рабочую маршрутизацию в своем приложении на основе приложения Zend skeleton.

Мне нужно следующее сопоставление:

localhost / => Приложение / Контроллер / IndexController => indexAction() —> это работает только
localhost / portfolio / section => Приложение / Контроллер / PortfolioController => indexAction()
localhost/ portfolio /section/action/id => Application/ Controller/PortfolioController => specifi_cactionAction()

У меня есть это (module.config.php ):

 'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'ZendMvcRouterHttpLiteral',
            'options' => array(
                'route'    => '/',
                'defaults' => array(
                    'controller' => 'ApplicationControllerIndex',
                    'action'     => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'portfolio' => array(
                    'type' => 'ZendMvcRouterHttpSegment',
                    'options' => array(
                        'route' => '[/portfolio/:section[/:action][/:id]]',
                        'constraints' => array(
                            'section' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'  => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'id'      => '[0-9] ',
                        ),
                        'defaults' => array(
                            '__NAMESPACE__' => 'ApplicationController',
                            'controller'    => 'Portfolio',
                            'action'        => 'index',
                        ),
                    ),
                ),
            )
        ),
    ),
),
'controllers' => array(
    'invokables' => array(
        'ApplicationControllerIndex'     => 'ApplicationControllerIndexController',
        'ApplicationControllerPortfolio' => 'ApplicationControllerPortfolioController',
    ),
),  
 

Теперь, если я перейду на localhost / portfolio / graphics /, я получу сообщение об ошибке:
Произошла ошибка 404
СТРАНИЦА НЕ НАЙДЕНА.
Запрошенный URL-адрес не может быть сопоставлен с помощью маршрутизации.
Исключение не доступно

Я также пробовал в дочернем маршруте (без / при запуске):

 'route' => '[portfolio/:section[/:action][/:id]]',
 

Я этого не понимаю. Почему это не работает?

Комментарии:

1. Ваше определение маршрута не включает завершающую косую черту — localhost/portfolio/graphics работает ли?

2. и вы должны использовать [portfolio/:section[/:action][/:id]] , поскольку это дочерний элемент вашего маршрута домашней страницы. Обычно я избегаю добавления дочерних элементов в маршрут домашней страницы — хотя это кажется логичным, на практике это, похоже, излишне усложняет ситуацию.

3. Да, именно так. Я пробовал оба. Но не сразу (такой придурок). Вы сэкономили мне, вероятно, много времени! Спасибо.