A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本文将会介绍一种将 URL 路由 自动断字的方法。
我们指定 Yii 使用 URL manager 来支持创建和解析 URL。然而,默认的方法对于混合词语的 路由 处理的不尽如人意。例如,URL 管理器默认将createAccount生成为:
/user/createAccount
这对于 SEO 来讲很不友好。他们想要的是像user/create-account更具易读性的。为了实现它,我们可以在 URL 管理器的 规则 中添加如下内容:
'user/create-account' => 'user/createAccount'
这么做很好,但不是最后的办法,因为我们需要为每一个类似的路由指定一个规则。为了避免麻烦和提高性能,我们可以使用一下内容扩展 CUrlManager:
class UrlManager extends CUrlManager { public $showScriptName = false; public $appendParams = false; public $useStrictParsing = true; public $urlSuffix = '/'; public function createUrl($route, $params = array(), $ampersand = '&') { $route = preg_replace_callback('/(?', function($matches) { return '-' . lcfirst($matches[0]); }, $route); return parent::createUrl($route, $params, $ampersand); } public function parseUrl($request) { $route = parent::parseUrl($request); return lcfirst(str_replace(' ', '', ucwords(str_replace('-', ' ', $route)))); } }
在上面我们定义了一个 CUrlManager 的子类UrlManager。我们主要覆盖了createUrl()和parseUrl()方法来实现路由的断字。我们也覆盖了 CUrlManager 中几个属性的默认值来使我们的 URL 更加友好。
现在我们需要在应用的配置文件中做些小改动:
return array( // .... 'components' => array( 'urlManager' => array( 'class' => 'UrlManager', 'rules' => array( // .... '/' => '/', ), ), ), );
在上面的代码我们指定了urlManager的类为我们的新类UrlManager。我们也修改了一点规则,这样我们可以在 URL 中匹配连字符(-)(默认的设置中只匹配单词不匹配连字符)。
通过以上设置,对于路由user/createAccount我们会获得 URL/user/create-account/。最后的斜线是因为我们在UrlManager中设置了urlSuffix为/。

1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马