Автоматическая маршрутизация на основе соглашений внутри модуля в Zend Framework 2- возможно?

Я пытаюсь понять всю конфигурацию, необходимую для работы моей маршрутизации в Zend Framework 2, и я не могу не задаться вопросом, делаю ли я это более сложным, чем необходимо.

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

/: Модуль /: Контроллер /: Действие

Я уже создал и подключил свой модуль "svc" (сокращение от "service)". Затем я создал второй контроллер, "ClientsController", и я не могу заставить маршрутизацию проходить через мои запросы, например, /svc/clients/list к ClientsController::listAction().

Пока я перебираю сотни строк конфигурации в глубоко вложенных массивах, я думаю - разве нет способа просто по умолчанию сопоставить мои URL-адреса с /:module/:controller/:action?

Спасибо за любую помощь. Я перехожу к Zend Framework 2 Quick Start, который помог мне создать новый модуль и затем добавить контроллер к этому модулю. Но когда я попытался добавить второй контроллер к этому модулю, я запутался в маршрутизации.

Обновление: я не уловил это в первый раз, но очевидно, что это должно быть особенностью приложения Zend Framework Skeleton. Из краткого руководства по началу работы:

ZendSkeletonApplication поставляется с "маршрутом по умолчанию", который, вероятно, приведет вас к этому действию. Этот маршрут в основном ожидает "/{module}/{controller}/{action}", что позволяет вам указать это: "/zend-user/hello/world"

Это именно то, что я хочу! Но я не могу заставить его работать.

В нем перечислены неполные module.config.php, с комментарием внизу о размещении здесь "другой конфигурации". Я попытался выяснить, что это за "другая конфигурация", и в итоге получил следующее:

return array(
    'svc' => array(
        'type'    => 'Literal',
        'options' => array(
            'route'    => '/svc',
            'defaults' => array(
                'controller'    => 'svc\Controller\Index',
                'action'        => 'index',
            ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
            'default' => array(
                'type'    => 'Segment',
                'options' => array(
                    'route'    => '/[:controller[/:action]]',
                    'constraints' => array(
                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                    ),
                    'defaults' => array(
                    ),
                ),
            ),
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            'svc\Controller\Clients' => 'svc\Controller\ClientsController',
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);

JFYI, вот как выглядит мой контроллер.

namespace svc\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class ClientsController extends AbstractActionController {

    public function indexAction() {
        return new ViewModel();
    }

    public function anotherAction(){

        return new ViewModel();
    }
}

Мои маршруты не работают. Я получаю "маршрут не найден", когда пытаюсь открыть любой из моих маршрутов.

1 ответ

Решение

В нем перечислены неполные module.config.php, с комментарием внизу о размещении здесь "другой конфигурации". Я попытался выяснить, что это за "другая конфигурация", и в итоге получил следующее:

Если ваш module.config.php действительно выглядит так, он не будет работать, routes это массив маршрутов, определенных в router ключ, ваш конфиг не содержит таких спецификаций, попробуйте заменить его на этот

return array(
    // routes
    'router' => array(
        'routes' => array(
            'svc' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/svc',
                    'defaults' => array(
                        'controller'    => 'svc\Controller\Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                                 // add the default namespace for :controllers in this route
                                 '__NAMESPACE__' => 'svc\Controller',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),    
    'controllers' => array(
        'invokables' => array(
            'svc\Controller\Clients' => 'svc\Controller\ClientsController',
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);