Joomla 路由系统
joomla中的路由系统的可以创建SEF(搜索引擎友好)的URL。从 1.5 版开始,Joomla!能够创建和解析任何格式的URL,包括 SEF URL.这不依赖于 Web 服务器 URL 重写功能,只要PHP开始mod_rewrite模块,即使服务器类型不是Apache也是可以。SEF URL 遵循一定的固定模式,但用户可以为 URL 的每个段定义一个简短的描述性文本(别名)。
一般,SEF URL 的本地部分(域名之后的部分)称为路由(route)。创建和处理 SEF URL 称为路由(routing),相关代码称为路由器(router)。
在Joomla中,每一个组件负责处理自己的SEF URL,如果你是组件开发者,为了支持SEF URL,你就需要创建自己组件的router.
概念
假设您遵循标准开发实践,你的组件现在使用的是系统的URL模式,类似于
|
现在你的目标是将这个URL转换为下面的形式:
|
为了实现这个目标,作为开发人员,你现在需要做两件事:
1,告诉系统你当前需要转换的URL链接
2,告诉系统如何转换
如何告诉系统当前需要转换的URL.
在实际上是非常困难并且低效的让joomla系统自主计算哪些文本是URL。为此,开发者在生成URL的时候需要手动的调用 \Joomla\CMS\Router\Route::_()方法。示例如下:
|
为了方便,开发者可以省略掉option和Itemid这两个参数。option参数默认为当前正在被执行组件的名称,Itemid参数默认为菜单项的ID.省略后如下:
|
一般来说,您应该只将其应用于用户和/或搜索引擎能够看到的 URL中,对于系统使用的URL是不需要转换的,比如重定向的URL。
如果用户在后台的全局射中关闭了启用SEF URLS的选项,\Joomla\CMS\Router\Route::_() 将不会进行转换,直接输出原始的URL.
写一个路由器
下一步,你需要做的就是写一个路由器。路由器的写法如下;
1,在组件的根目录下创建一个router.php的文件。如:/components/com_yourcomponent/router.php
2,编辑router.php文件,在里面定义一个类,类的名称为[组件的名称]Router。如(com_content组件则类名为 ContentRouter),并且这个类必须继承 Joomla\CMS\Component\Router\RouterInterface 。
3,在类中需要实现3个方法,分别是build(&$query),parse($segments),preprocess($query)。
build(&$query) 的功能是 将 URL 参数数组转换为将生成 SEF URL 的segment段数组。转换的工作流程如下:
- 【原始的URL】 http://www.example.com/index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50
- ↓【调用】
\Joomla\CMS\Router\Route::_
,
- ↓【调用】
【生成】$query = array('view' => 'article', 'id' => 1, 'catid' => 20)
- ↓ 【调用】你组件的路由器
[componentname]Router::build
- ↓ 【调用】你组件的路由器
【生成】$segments = array(20, 1);
- ↓ 【自动调用】joomla内部的路由系统
- 【生成】http://www.example.com/example-menu-item/20/1
parse($segments) 的功能是 将 segment(段)数组参数数组转换URL参数 。转换的工作流程如下:
- 【原始的URL】http://www.example.com/example-menu-item/20/1
- ↓ 【自动调用】Joomla内部的路由系统解析
【生成】$segments = array(20, 1);
- ↓ 【调用】你组件的路由器
[componentname]Router::parse
- ↓ 【调用】你组件的路由器
【生成】$query = array('view' => 'article', 'id' => 1, 'catid' => 20)
|