您的位置:首页 > 编程语言 > PHP开发

Yii URL 连字符管理

2016-01-18 13:58 627 查看
本文将会介绍一种将 URL
路由 自动断字的方法。

我们指定 Yii 使用
URL manager 来支持创建和解析 URL。然而,默认的方法对于混合词语的
路由 处理的不尽如人意。例如,URL 管理器默认将
createAccount
生成为:

/user/createAccount
[/code]
这对于 SEO 来讲很不友好。他们想要的是像
user/create-account
更具易读性的。为了实现它,我们可以在 URL 管理器的

规则 中添加如下内容:

'user/create-account' => 'user/createAccount'
[/code]
这么做很好,但不是最后的办法,因为我们需要为每一个类似的路由指定一个规则。为了避免麻烦和提高性能,我们可以使用一下内容扩展
CUrlManager:

[php]
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('/(?<![A-Z])[A-Z]/', 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))));
}
}
[/code]
在上面我们定义了一个
CUrlManager 的子类
UrlManager
。我们主要覆盖了
createUrl()
parseUrl()
方法来实现路由的断字。我们也覆盖了
CUrlManager 中几个属性的默认值来使我们的 URL 更加友好。

现在我们需要在应用的配置文件中做些小改动:

[php]
return array(
// ....
'components' => array(
'urlManager' => array(
'class' => 'UrlManager',
'rules' => array(
// ....
'<controller:[\w\-]+>/<action:[\w\-]+>' => '<controller>/<action>',
),
),
),
);
[/code]
在上面的代码我们指定了
urlManager
的类为我们的新类
UrlManager
。我们也修改了一点规则,这样我们可以在 URL 中匹配连字符(-)(默认的设置中只匹配单词不匹配连字符)。

通过以上设置,对于路由
user/createAccount
我们会获得 URL
/user/create-account/
。最后的斜线是因为我们在
UrlManager
中设置了
urlSuffix
/


注意: 因为上面的代码中使用了匿名函数和lcfirst(),所以此方法运行在 PHP 5.3 或更高版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: