Zend Framework 2 Маршрутизация поддоменов к модулю

После долгого поиска без успеха. прежде чем я сдадусь, я хотел бы спросить:

Есть ли способ маршрутизации субдомена в модуль в Zend Framework 2 ? как:

Поддомен => Модуль
api.site.com => api
dev.site.com => dev
admin.site.com => admin
site.com => общественный

Я попытался сделать это так, но я не могу получить доступ к контроллерам, отличным от стандартного (Index).

'router' => array( 'routes' => array( 'home' => array( 'type' => 'Hostname', 'options' => array( 'route' => 'site.com', 'defaults' => array( '__NAMESPACE__' => 'Application\Controller', 'controller' => 'Index', 'action' => 'index', ), ) ) ), ), 

Спасибо, что нашли время, чтобы помочь мне.

Zend Framework 2 не имеет понятия маршрутизации к модулям; все сопоставления маршрутизации находятся между шаблоном URI (для маршрутов HTTP) и конкретным классом контроллера. Тем не менее, Zend\Mvc предоставляет прослушиватель событий ( Zend\Mvc\ModuleRouteListener ), который позволяет вам определить шаблон URI, который сопоставляется с несколькими контроллерами на основе заданного шаблона и, таким образом, эмулирует «маршрутизацию модуля». Чтобы определить такой маршрут, вы бы указали это как свою конфигурацию маршрутизации:

 'router' => array( 'routes' => array( // This defines the hostname route which forms the base // of each "child" route 'home' => array( 'type' => 'Hostname', 'options' => array( 'route' => 'site.com', 'defaults' => array( '__NAMESPACE__' => 'Application\Controller', 'controller' => 'Index', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( // This Segment route captures the requested controller // and action from the URI and, through ModuleRouteListener, // selects the correct controller class to use '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( 'controller' => 'Index', 'action' => 'index', ), ), ), ), ), ), ), 

( Нажмите здесь, чтобы увидеть пример этого @ ZendSkeletonApplication )

Это только половина уравнения. Вы также должны зарегистрировать каждый класс контроллера в своем модуле с использованием определенного формата именования. Это также делается через один и тот же файл конфигурации:

 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController' ), ), 

Ключ массива – это псевдоним, который ModuleRouteListener будет использовать для поиска правильного контроллера и должен быть в следующем формате:

 <Namespace>\<Controller>\<Action> 

Значением, назначенным этому ключу массива, является полное имя класса контроллера.

( Нажмите здесь, чтобы увидеть пример этого @ ZendSkeletonApplication )

ПРИМЕЧАНИЕ. Если вы не используете ZendSkeletonApplication или удалили модуль приложения по умолчанию, вам необходимо зарегистрировать ModuleRouteListener в одном из ваших собственных модулей. Нажмите здесь, чтобы увидеть пример того, как ZendSkeletonApplication регистрирует этот прослушиватель

Если я правильно понимаю слайд № 39 DASPRIDS Rounter Presentation , это так же просто, как на каждом модуле – определить хосты субдоменов, то есть:

 'router' => array( 'routes' => array( 'home' => array( 'type' => 'Hostname', 'options' => array( 'route' => 'api.site.com', 'defaults' => array( '__NAMESPACE__' => 'Api\Controller', 'controller' => 'Index', 'action' => 'index', ), ) ) ), ), 

Etc, вы сделаете это для каждого модуля самостоятельно.