ZendFramework2 模块间路由
ZendFramework2 routing between modules
我安装了一个 SkeletonApplication 并在标准模块中实现了一些控制器 'Application'。
效果很好。
但现在我想使用第二个模块,我想设置一条从 'Application' 模块到新模块的路由,以便在视图中将其链接到那里。
第二个模块名为 'Sporttabs'。
在我的 application.config.php 中,我已按照文档中的设置进行了设置:
// This should be an array of module namespaces used in the application.
'modules' => array(
'Application',
'Sporttabs'
),
在模块'Application'中我设置在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 模块,所以我认为所有文件都在正确的位置...)
你能告诉我怎么做吗?
无需在您的应用程序配置中定义 sporttabs。我建议您在 Sporttabs 的 module.config.php 文件中执行此操作。
这是我的 /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',
),
),
),
),
),),
作为在路由中包含命名空间的后遗症,我还必须更改控制器数组,因为控制器的别名从 'Index' 更改为 'Application\Controller\Index':
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
),
),
同样的错误阻止我进入第二个模块,路由数组也错了。
现在 Stanimir 在他的回答中发布的 link-解决方案工作正常,我进入了我的新模块...
感谢您的帮助 Stanimir!
我安装了一个 SkeletonApplication 并在标准模块中实现了一些控制器 'Application'。
效果很好。
但现在我想使用第二个模块,我想设置一条从 'Application' 模块到新模块的路由,以便在视图中将其链接到那里。
第二个模块名为 'Sporttabs'。
在我的 application.config.php 中,我已按照文档中的设置进行了设置:
// This should be an array of module namespaces used in the application.
'modules' => array(
'Application',
'Sporttabs'
),
在模块'Application'中我设置在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 模块,所以我认为所有文件都在正确的位置...)
你能告诉我怎么做吗?
无需在您的应用程序配置中定义 sporttabs。我建议您在 Sporttabs 的 module.config.php 文件中执行此操作。
这是我的 /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',
),
),
),
),
),),
作为在路由中包含命名空间的后遗症,我还必须更改控制器数组,因为控制器的别名从 'Index' 更改为 'Application\Controller\Index':
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
),
),
同样的错误阻止我进入第二个模块,路由数组也错了。
现在 Stanimir 在他的回答中发布的 link-解决方案工作正常,我进入了我的新模块...
感谢您的帮助 Stanimir!