根据参数值Yii重写路径

时间:2015-01-28 03:18:35

标签: php yii url-rewriting

我在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属性值的规则,然后将其重写为我想要的任何内容。

感谢

2 个答案:

答案 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';
    }
}