热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

由于最近自己业余时间在写一套类似Tumblr的博客系统,涉及到的模型、控制器、视图比较多,如用户模块、文章模块、图片模块、音乐模块、视频模块、东西(商品)模块,各模块下标签、评论、分类、图片等等自成一块,这样的话控制器和视图如果单独开来的,将会显得很臃肿,繁杂,不便于管理和维护,但是因为功能暂时比较轻,又不想将其各个模块化,于是便准备用模块风格 的文件夹来管理控制器和视图,具体就是类似下面这种风格:

控制器(以文章为例)

article

视图(以文章为例)

view

上述控制器中,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管理组件

有什么疑问欢迎在下面的回复中讨论。


推荐阅读
  • CGroups: 资源管理和控制
    CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ... [详细]
  • CSGO
    CSGOTimeLimit:40002000MS(JavaOthers)MemoryLimit:524288524288K(JavaOthers)ProblemDescriptio ... [详细]
  • ArcGIS技巧:为相邻地块创建指定宽度的隔离带
    在地理信息系统(GIS)的数据处理中,为了满足特定项目的质量检查标准,需要在相邻地块之间创建一定宽度的隔离带。本文将探讨如何使用ArcGIS工具解决这一问题,确保不同地块图斑间保持规定的最小距离。 ... [详细]
  • 深度兴趣网络在点击率预测中的应用研究
    本文探讨了一种名为深度兴趣网络(Deep Interest Network, DIN)的新方法,该方法通过捕捉用户的历史行为和当前上下文之间的交互来提高点击率预测的准确性。DIN模型不仅考虑了用户的静态偏好,还动态地调整了对不同商品的兴趣权重,从而实现了更加个性化的推荐。 ... [详细]
  • 本文探讨了一个项目中遇到的挑战,即如何通过技术手段解决不同菜单项触发时,跨域IFrame页面的高度自适应问题。通过创建中介页面和利用JavaScript与Cookie机制,实现无缝的用户体验。 ... [详细]
  • 本文探讨了在PHP中处理特定类型编码字符串的方法,特别是如何将HTML实体编码的字符串转换为普通文本。 ... [详细]
  • Java 动态代理详解与示例
    本文详细介绍了Java中的动态代理机制,包括如何定义接口、实现类和代理处理器,并通过具体示例演示了动态代理的创建和使用过程。 ... [详细]
  • 本文详细介绍了在PHP中如何创建新文件以及如何使自定义函数在整个项目中全局可用的方法,包括最新的实践技巧。 ... [详细]
  • 解决Android开发中的TextView难题
    探讨了在Android开发过程中遇到的关于TextView组件的常见问题,特别是如何实现多行文字的跑马灯效果,并提供了初步的解决方案和参考资料。 ... [详细]
  • 本文探讨了Windows Presentation Foundation (WPF)如何通过扩展Microsoft Build Engine (MSBuild)来增强其构建能力,特别是在处理WPF特有的任务时。 ... [详细]
  • 本文详细介绍了C++中常见的容器(如列表、向量、双端队列等)及其迭代器的实现方式,通过具体代码示例展示了如何使用这些容器和迭代器。 ... [详细]
  • 本文探讨了在执行SQL查询时遇到的因字符集不同而导致查询结果差异的问题,特别是涉及中文字符时。文章分析了在不同字符集设置下,SQL查询结果的变化,并提供了详细的解决方案。 ... [详细]
  • 本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ... [详细]
  • 深入解析Java中的锁类型及其应用场景
    本文详细介绍了Java中常见的锁类型,包括乐观锁与悲观锁、独占锁与共享锁、互斥锁与读写锁、可重入锁、公平锁与非公平锁、分段锁、偏向锁、轻量级锁、重量级锁以及自旋锁。每种锁的特性、作用及适用场景均有所涉及。 ... [详细]
  • 本文探讨了HDU 4035的问题,涉及一个由n个房间组成的迷宫,这些房间通过n-1条隧道相互连接,形成一棵树结构。任务是从起点1号房间出发,计算到达出口所需经过的平均隧道数量,考虑了在每个房间中可能发生的三种情况及其相应概率。 ... [详细]
author-avatar
yaoyinghua2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有