У меня установлено приложение SkeletonApplication, и некоторые контроллеры встроены в стандартный модуль «Приложение».
Это отлично работает.
Но теперь я хочу использовать второй модуль и установить маршрут из модуля Application в новый модуль, чтобы связать его там в представлении.
Второй модуль называется «Sporttabs».
В моем файле application.config.php я установил, как показано в документации:
// This should be an array of module namespaces used in the application.
'modules' => array(
'Application',
'Sporttabs'
),
В модуле «Приложение» я установил в module.config.php:
'routes' => array(
'home' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'module' => 'Application',
'controller' => 'Index',
'action' => 'index',
),
),
),
'fach' => array(
'type' => 'segment',
'options' => array(
'route' => '/index[/:action][/:id]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Index',
'action' => 'index'
),
),
),
'sporttabs' => array(
'type' => 'segment',
'options' => array(
'route' => '/sporttabs[/:controller][/:action][/:id]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'module' => 'Sporttabs',
'controller' => 'Sporttab',
'action' => 'index'
),
),
),
),
),
Я попытался связать его в index.phtml:
<a href="<?php echo $this->url('sporttabs',array('module' => 'sporttabs','controller' => 'sporttab','action' => 'index'))?>">Sporttabs-Projekt</a>
Это не работает, я только получаю / sporttab
Даже если я попытаюсь сделать www.myurl.de/sporttabs, я не попаду в модуль Sporttabs …
(Я использую ZendStudio для создания модуля ne, поэтому я думаю, что все файлы находятся в правильном положении …)
Можете ли вы дать мне подсказку, как это сделать?
Нет необходимости определять спортивные вкладки в конфигурации вашего приложения. Я предлагаю вам сделать это в файле module.config.php вашего Sporttabs.
Это пример моего /admin
маршрут, который является другим модулем с именем Admin
, которые сидят рядом с приложением.
'router' => [
'routes' => [
'admin' => [
'type' => 'Literal',
'options' => [
'route' => '/admin',
'defaults' => [
'__NAMESPACE__' => 'Admin\Controller',
'controller' => 'Index',
'action' => 'index',
],
],
'may_terminate' => true,
'child_routes' => [
'default' => [
'type' => 'Segment',
'options' => [
'route' => '/[:controller[/][:action[/][:id][/page/:page][/search/:search]]]',
'constraints' => [
'controller' => '[a-zA-Z0-9_-]*',
'action' => '[a-zA-Z0-9_-]*',
'search' => '[a-zA-Z0-9_-]*',
'id' => '[0-9]+',
'page' => '[0-9]+',
],
'defaults' => [
'__NAMESPACE__' => 'Admin\Controller',
'controller' => 'Index',
'action' => 'index',
],
],
],
],
],
],
],
Оттуда я делаю это:
<?=$this->url("admin/default", ['controller' => "controler_name", "action" => "action_name_from_controller", "id" => id_or_something_else_if_needed])?>
/default
существует для того, чтобы иметь доступ к дочерним маршрутам.
@ Stanimir дает правильную подсказку для моего решения:
При редактировании маршрутизации для моего приложения я должен был непреднамеренно изменить порядок массива маршрутов:
Разделы ‘may_terminate’ и ‘child_routes’ перемещены на верхний уровень, а не являются частью маршрута ‘fach’.
Поэтому я изменил массив следующим образом:
'routes'=> array(
'fach'=> array(
'type' => 'Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => 'true',
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/][:action[/][:id]]]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
),
),
),),
В результате включения пространства имен в маршрутизацию мне также пришлось изменить массив контроллеров, поскольку псевдоним контроллера изменился с «Индекс» на «Приложение \ Контроллер \ Индекс»:
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
),
),
Из-за этой же ошибки я не смог попасть во второй модуль, массив маршрутов тоже был неупорядочен.
Теперь ссылка-решение, опубликованное Станимиром в его ответе, отлично работает, и я попадаю в мой новый модуль …
Спасибо за помощь, Станимир!