百度空间 | 百度首页 
 
查看文章
 
zend中用使用url的动态部分作为action
2009-01-04 11:02
使用zend框架时常见的url重写模式一般都是由两部分组成,即:controller/:action这种模式。比如说一个博客,其发表文章的地址有可能是article/write,那么最终会调用ArticleController中的writeAction来进行相关的控制。稍微复杂一点,查看一篇文章的地址有可能是article/1111,我们可以利用Controller_Router_Route_Regex写它的路由:
new Zend_Controller_Router_Route_Regex(
    'article/(\w+)',
    array(
        'controller'=>'article',
        'action'    =>'show',
    ),
    array(
        1=>'articleId'
    )
);
然后用Zend_Controller_Front::getInstance()->getRouter()->addRoute()方法将其加入到路由控制中,在具体的action中则可以通过$this->_getParam('articleId')获取到1111这个数值。

不过,在实际做项目的时候,我们可能会遇到更加复杂的情况。比如某个用户的个人主页是people/22,那么该用户的所发表过的文章地址有可能是people/22/articles,这时候,可能会使用到PeopleController的articlesAction来进行相关页面的控制,当然,对用户发表过的评论也会有类似的情况,会需要用PeopleController的commentsAction来进行控制。也就是说,我们需要使用url中的某些动态部分作为action的名称。

实际上,操作也是相当简单的,还是利用Zend_Controller_Router_Route_Regex来进行处理

$peopleAction = new Zend_Controller_Router_Route_Regex(
    'people/(\d+)(?:/(\w+))?',
    array(
        'controller'=>'people',
        'action'    =>'index',
    ),
    array(
        1=>'actorId',
        2=>'action',
    )
);
第三个参数的意思实际上就是这样:将正则表达式中第一个匹配项指定为参数actorId对应的值,将第二个匹配项作为action的值,action这个参数是zend路由中用来指定controller的action的。实际上,我们仅仅是做了一些参数的键值的映射。如果不传递第三个参数的话,那么在action中使用$this->_getAllParams()方法得到的值将是这样:
array(1=>'22',2=>'articles')
这个时候,zend处理会使用第二个参数action指定的index来作为默认的action名称。
我们传递了第三个参数后,就将原来没有特殊含义的1和2改成了actorId和action,也就是变成了
array('actorId'=>'22','action'=>'articles')
这样的话,zend处理时如果找到键值为2的参数,就会将其改变成键值为action的参数,从而调用参数'action'的值作为控制器中相应的Action的名称了。

类别:技术追峰 | 添加到搜藏 | 分享到i贴吧 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu