查看文章 |
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的名称了。 |
最近读者: