Yii UrlManager URL的部分呈现
我需要将带有一些参数的url设置为查询字符串,如: site.com/controller/action/param1/param2?param3=value¶m4=valueYii 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+>'), ) 您可以
有人能帮我解决这个问题吗?您应该在配置中设置此规则:
'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;
}
}