После долгого поиска без успеха. прежде чем я сдадусь, я хотел бы спросить:
Есть ли способ маршрутизации субдомена в модуль в 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, вы сделаете это для каждого модуля самостоятельно.