设为首页收藏本站
查看: 67|回复: 0

[PHP] Yii框架中module(模块)或模块风格控制器的URL美化

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2014-5-16 09:11:00 | 显示全部楼层 |阅读模式
    由于最近自己业余时间在写一套类似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管理组件
    有什么疑问欢迎在下面的回复中讨论。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表