Yii UrlManager URL的部分呈现

Yii UrlManager URL的部分呈现,yii,yii-url-manager,Yii,Yii Url Manager,我需要将带有一些参数的url设置为查询字符串,如: site.com/controller/action/param1/param2?param3=value¶m4=value 有人能帮我解决这个问题吗?您应该在配置中设置此规则: 'rules'=>array( array('controller/action', 'pattern'=>'controller/action/<param1:\w+>/<param2:\w+>'), ) 您可以

我需要将带有一些参数的url设置为查询字符串,如:

site.com/controller/action/param1/param2?param3=value¶m4=value


有人能帮我解决这个问题吗?

您应该在配置中设置此规则:

'rules'=>array(
    array('controller/action', 'pattern'=>'controller/action/<param1:\w+>/<param2:\w+>'),
)
您可以得到以下url:

http://example.com/controller/action/param1value/param2value?param3=param3value¶m4=param4value

而获取参数将是

$_GET['param1'] //'param1value'
$_GET['param2'] //'param2value'
$_GET['param3'] //'param3value'
$_GET['param4'] //'param4value'
我找到了解决办法。 我创建了从CBaseUrlRule扩展的组件

class CCustomUrlRule extends CBaseUrlRule {

private $url;

public function init()
{
    if ($this->name === null) {
        $this->name = __CLASS__;
    }
}
    public function createUrl($manager,$route,$params,$ampersand)
    {
        if ($route === 'controller/index') {
            $this->url = 'controller/';

        if (isset($params['param1'])) {
            $this->url .= 'param1/' . $params['param1'] .'/';
        }

        if (isset($params['param2'])) {
            $this->url .= 'param2/' . $params['param2'] .'/';
        }

        $this->url = substr($this->url, 0, -1);

        if (isset($params['param3']) || isset($params['param4'])) {
            $this->url .= '?';

            if (isset($params['param3']) && isset($params['param4'])) {
                $this->url .= 'param3=' . $params['param3'] .'&';
                $this->url .= 'param4=' . $params['param4'];
            }
            elseif (isset($params['param3'])) {
                $this->url .= 'param3=' . $params['param3'];
            }
            else {
                $this->url .= 'param4=' . $params['param4'];
            }
        }
        return $this->url;
    }
    return false;
}    

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
    {
        return false;
    }
}

我知道-这是为了匹配代码,但它是可行的,并且易于自定义。

如果参数的数量发生变化?我是否可以使规则通用,但指定不应处理的参数?@BriareosLawrence当然不能。您应该指定哪些参数将在路径(
/controller/action/param1value/param2 value
)中表示,哪些参数将添加到查询中(问号后面?)但是在这种情况下,你得到的是
site.com/controller/action/param1/param1val/param2/param2val?param3=value¶m4=value
,而在你的问题中,你想要得到
site.com/controller/action/param1/param2?param3=value¶m4=value
对不起,我的英语很弱,可能没有足够正确地描述这个问题
class CCustomUrlRule extends CBaseUrlRule {

private $url;

public function init()
{
    if ($this->name === null) {
        $this->name = __CLASS__;
    }
}
    public function createUrl($manager,$route,$params,$ampersand)
    {
        if ($route === 'controller/index') {
            $this->url = 'controller/';

        if (isset($params['param1'])) {
            $this->url .= 'param1/' . $params['param1'] .'/';
        }

        if (isset($params['param2'])) {
            $this->url .= 'param2/' . $params['param2'] .'/';
        }

        $this->url = substr($this->url, 0, -1);

        if (isset($params['param3']) || isset($params['param4'])) {
            $this->url .= '?';

            if (isset($params['param3']) && isset($params['param4'])) {
                $this->url .= 'param3=' . $params['param3'] .'&';
                $this->url .= 'param4=' . $params['param4'];
            }
            elseif (isset($params['param3'])) {
                $this->url .= 'param3=' . $params['param3'];
            }
            else {
                $this->url .= 'param4=' . $params['param4'];
            }
        }
        return $this->url;
    }
    return false;
}    

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
    {
        return false;
    }
}