Routing 如何编写ZF2路由器脚本以允许默认操作上的参数
我试图绕过ZF2中路由语句的一些特性。相册模块示例建议如下:Routing 如何编写ZF2路由器脚本以允许默认操作上的参数,routing,zend-framework2,url-routing,Routing,Zend Framework2,Url Routing,我试图绕过ZF2中路由语句的一些特性。相册模块示例建议如下: 'router' => array( 'routes' => array( 'album' => array( 'type' => 'segment', 'options' => array( 'route' => '/album[/:action][/:id]',
'router' => array(
'routes' => array(
'album' => array(
'type' => 'segment',
'options' => array(
'route' => '/album[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Album\Controller\Album',
'action' => 'index',
),
),
),
),
),
<a href="<?php echo $this->url('album',
array('action'=>'index', 'agr1' => 'jazz'));?>">Jazz</a>
但是,假设我想配置该项目,使url/album/index/jazz
只列出爵士乐类型的专辑
我的第一个挑战是,在/album/index/jazz
中,第二个参数不是[/:id]
。它想要成为[/:流派]
。而且,虽然我可以轻松地将路由更改为'route'=>'/album[/:action][/:arg1]'
,并将约束更改为'arg1'=>'[a-zA-Z][a-zA-Z0-9.-]*'
,但我真的不想放弃'[0-9]+'
,id上的约束。我要寻找的是一种根据动作定义替代参数模式和约束的方法
我的第二个挑战在于ZF2对默认操作的处理。如果我按如下方式设置路由:
'router' => array(
'routes' => array(
'album' => array(
'type' => 'segment',
'options' => array(
'route' => '/album[/:action][/:arg1]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'arg1' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'controller' => 'Album\Controller\Album',
'action' => 'index',
),
),
),
),
),
然后url/album/index/jazz
将按照我的要求向控制器发送“jazz”参数。但是,我在让ZF2使用默认操作构造url时遇到了一个问题。按照相册模块示例中的index.phtml
语法,我的期望是:
'router' => array(
'routes' => array(
'album' => array(
'type' => 'segment',
'options' => array(
'route' => '/album[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Album\Controller\Album',
'action' => 'index',
),
),
),
),
),
<a href="<?php echo $this->url('album',
array('action'=>'index', 'agr1' => 'jazz'));?>">Jazz</a>
将构造
。但是(我假设索引是默认操作),索引被剥离,ZF2给出了
,而不是针对真实页面。我试着在路由器、控制器和视图中重命名索引;但是我发现只要是默认操作,$this->url(…)
函数就会去掉我使用的任何名称。围绕这个问题可能有很多方法,但我认为最好在路由器配置中解决它,以避免框架的其他未知部分出现意外,这些未知部分可能会以类似的方式处理默认操作。值得退一步,决定您希望url方案如何工作,然后找出如何实现它
如果我在做类似的事情,我可能会这样开始:
/相册[/:类别]-列出所有相册,可选择按类别过滤
/albums/:id-显示有关单个相册的信息
/albums/:id/edit-显示表单以编辑相册信息并接受帖子
/albums/:id/delete-仅发布,删除相册
/albums/new-用于添加相册和接受帖子的显示表单
我建议不要在路线中使用通用名词(因此,避免:action或:arg1)。相反,要明确,所有的事情通常都是有效的
对于第一个循环,只需显式指定每个路由。一旦你了解了这一点,你就可以开始研究使用子路由将它们组合在一起。我找到了一种方法来解决url()
帮助器配置的url中忽略默认参数的问题。当zf2从route语句开发url时,它会删除[]
括号内与默认参数匹配的所有内容。所以,
<a href="<?php echo $this->url('album',
array('action'=>'index', 'arg1' => 'jazz'));?>">Jazz</a>
与
然后
您是否定义了其他路线?您希望生成的url与您提供的路由定义不相关——路径以/pages
开头,而基于该相册
路由定义,它应该以/album
开头。我的坏消息。我从不同版本的项目中剪切和粘贴。我已经编辑了我的问题。你解决了这个问题吗?我要么删除默认操作,要么停止让ZF构造URL。是的。看看我的答案。
<a href="<?php echo $this->url('album',
array('action'=>'index', 'arg1' => 'jazz'));?>">Jazz</a>
'router' => array(
'routes' => array(
'albums' => array(
...
'route' => '/albums[/][:action] [/][:arg1] [/][:arg2] [/][:arg3] ... ',
...
),
'album' => array(
...
'route' => '/album[/][:action][/][:id]',
...
),
),
),