0

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

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

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

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

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

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

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

ZendSkeletonApplication кораблей с «маршрут по умолчанию», что, скорее всего, получить вас к этому действию. Этот маршрут в основном ожидает «/ {модуль}/{контроллер}/{действие}», который позволяет указать это: «/ Зенд-пользователь/привет/мир»

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

В нем содержится неполный 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(); 
    } 
} 

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

+0

IIRC вы забыли добавить по умолчанию '«__NAMESPACE__»=>«SVC \ Controller'' ** редактировать ** но маршрут не найдено, странно, какой URL вы звоните? – Sam

+0

Я добавил '__NAMESPACE__' => 'svc \ Controller', и никаких изменений нет. Я пробовал следующие URL: http: // zf-sample.localhost/svc/clients/index, http: //zf-sample.localhost/clients/index, http: //zf-sample.localhost/svc/clients/another, http: //zf-sample.localhost/clients/ другой. Все дают «Запрошенный URL не может быть сопоставлен маршрутизацией». – Josh

ответ

0

В нем приведен неполный файл 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', 
     ), 
    ), 
); 
+0

Итак, я попробовал это, и теперь получаю: «клиенты (разрешает недопустимый класс контроллера или псевдоним: клиенты)». Это находится по адресу http: //zf-sample.localhost/svc/clients/another. Поэтому, видимо, мне нужно как-то псевдоним «клиентов» для моего класса контроллера ... правильно? Но как мне это сделать? – Josh

+0

Ok, поэтому я изменил этот 'контроллеры' => массив ( 'invokables' => массив ( 'SVC \ Controller \ Clients' => 'SVC \ Controller \ ClientsController', ), ), к этому: 'контролеры' => Array ( 'invokables' => Array (= 'клиентов> 'SVC \ Controller \ ClientsController', ), ), И что, казалось, сделать трюк. Это правильно? Помимо этого изменения, у меня есть то, что вы разместили. – Josh

+0

нет, как ранее указывал @Sam, вам нужно добавить '__NAMESPACE__' в конфигурацию вашего маршрута, см. Мое редактирование. – Crisp