我在Yii中有几个规则允许我重写一些路由,其中每个路由都将作为get参数传递给动作。
'<department>' => 'products/index',
'<department>/<category>' => 'products/index',
我想明确地写一条规则,根据参数值将把url改为我想要的
示例,现在我有一个像这样的URL
www.mysite.com/Books+%26+Pencils由于这条规则而被重写'<department>' => 'products/index'
,这是好的
我想将该网址更改为www.mysite.com/books-pencils,如果有人知道如何编写比较deparment属性值的规则,然后将其重写为我想要的任何内容。
感谢
答案 0 :(得分:1)
您可以使用自定义类来处理特殊请求。 我使用过这样的方法,从数据库中获取自定义URL:
'urlManager'=>array(
'rules'=>array(
array(
'class' => 'application.components.UrlRule',
),
),
),
然后您创建类似于此的custo类:
<?php
Yii::import("CBaseRule");
class UrlRule extends CBaseUrlRule
{
public function createUrl($manager,$route,$params,$ampersand)
{
// check for my special case of URL route, if not found, then return the unchaged route
preg_match("/^(.+)\/(.+)$/", $route, $r);
if(!is_array($r) or !isset($r[1]) or !isset($r[2])) {
return $route;
}
// handle your own route request, and create your url
$url = 'my-own-url/some-thing';
// check for any params, which i also want to add
$urlParams = $manager->createPathInfo($params,"=","&");
$return = trim($url,'/');
$return.= $urlParams ? "?" . $urlParams : "";
return $return;
}
public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
{
// handle my special url request
$controller = '....';
$action = '.....';
// return the controller/action that should be used
return lcfirst($controller)."/".$action;
}
}
我不知道这是否是您想要的,但至少在本课程中,您可以使用所请求的URL完成所需的一切。
如果你愿意,想要将许多类似的网址重定向到301重定向到1个网址,您可以在parseUrl
函数
// check my route and params, and if I need to redirect
$request->redirect('/your/new/url/?params=bla',true,'301');
答案 1 :(得分:0)
首先,如果要更改网址,则应进行重定向(在本例中为301)。要实现此逻辑,您可以使用custom URL rule class。
网址管理员配置:
'rules' => array(
// custom url rule class
array(
'class' => 'application.components.MyUrlRule',
),
)
MyUrlRule类:
class MyUrlRule extends CBaseUrlRule
{
public function createUrl($manager,$route,$params,$ampersand)
{
// Logic used to create url.
// If you do not create urls using Yii::app()->createUrl() in your app,
// you can leave it empty.
}
public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
{
// modify url
$pathInfoCleaned = strtolower(preg_replace('+%26+', '-', $pathInfo));
// redirect if needed
if ($pathInfo !== $pathInfoCleaned) {
$request->redirect($pathInfoCleaned, true, 301);
}
// parse params from url
$params = explode('/', $pathInfo);
if (isset($params[0])) {
$_GET['department'] = $params[0];
if (isset($params[1])) {
$_GET['category'] = $params[1];
}
}
return 'products/index';
}
}