Автоматическая маршрутизация на основе соглашений внутри модуля в 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',
),
),
);