作者:yaoyinghua2012 | 来源:互联网 | 2014-05-16 09:11
由于最近自己业余时间在写一套类似Tumblr的博客系统,涉及到的模型、控制器、视图比较多,如用户模块、文章模块、图片模块、音乐模块、视频模块、东西(商品)模块,各模块下标签、评论、分类、图片等等自成一块,这样的话控制器和视图如果单独开来的,将会显得很臃肿,繁杂,不便于管理和维护,但是因为功能暂时比较轻,又不想将其各个模块化,于是便准备用模块风格 的文件夹来管理控制器和视图,具体就是类似下面这种风格:
控制器(以文章为例)
视图(以文章为例)
上述控制器中,IndexController对应着原来的ArticleController,因为为了方便在urlManager中进行统一匹配,将所有模块主控制器名设为IndexController,例如MusicController为IndexController,以此类推。ArticleCategoryController改为CategoryController,以此类推,
这样就可以在URL中以形如article/category/create这种方式来访问category的create方法,而对原来article/create,现在配置urlManager仍以article/create的形式访问,具体在protected/config/main.php中设置urlManager如下所示:
/**
* author:农夫庄园
* url: http://www.icultivator.com/p/6168.html
* website: http://www.icultivator.com
*/
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
''=>'site/index',
''=>'site/',
''=>'/index/index',
'/'=>'/index/view',
'//'=>'/index/',
'/tag/'=>'/index/tag',
'/'=>'/index/',
'//'=>'//view',
'///'=>'//',
'//'=>'//',
),
'showScriptName'=>FALSE,
),
这样就可以实现URL的统一美化,如查看article的id为1的文章,可以通过article/1来访问,tag为test的文章可以通过article/tag/test来访问,等等。
此外还要注意的是在各个IndexController中需要更改原来render的url路径为//article/(以article为例),在视图的article控制器对应各view文件中,也要修改相应的url路径,这样就可以实现URL的美化了,如果不想修改render里的路径,可以将原来article里的view文件放到/views/article/index文件夹下,就可以了。原理是如果render里的路径包含//,那么相应的url会解析成/path/to/views."/".article/view,否则会解析成/path/to/views/article/index."/".view,至于为什么,可以参考Yii核心源文件,简而言之,就是Yii::app( )->getViewPath( )和$this->getViewPath( )两个方法的调用问题,前者获取到的view文件是通过Yii::app( )->getViewPath( )."/".$viewName,后者是通过$this->getViewPath( )获取view文件。
当然如果您有兴趣的话,也可以通过继承CBaseUrlRule类来自定义一个UrlRule类实现自定义URL生成和解析,详情可参见这篇文章:Yii框架官方指南系列43——专题:URL(创建、路由、美化及自定义)。这里就不赘述了,对于Yii框架中URL的管理,可以参考这篇文章:Yii框架分析(八)——URL管理组件。
有什么疑问欢迎在下面的回复中讨论。