是否有任何可能的方式从urlManager中去除url规则?Yii - 动态删除url规则
我知道我可以通过urlManager->addRules()
添加规则,但是如何删除它们?
谢谢。
编辑:
我的目标是动态生成基于子域的规则。 例如,某种类型的子域名可能会有一个规则<catalog>/<brand>/<product>
导致某个产品,而另一个子域名则会有不同的规则。此外,子域也是动态的,这意味着我不能创建任何静态条件。
是否有任何可能的方式从urlManager中去除url规则?Yii - 动态删除url规则
我知道我可以通过urlManager->addRules()
添加规则,但是如何删除它们?
谢谢。
编辑:
我的目标是动态生成基于子域的规则。 例如,某种类型的子域名可能会有一个规则<catalog>/<brand>/<product>
导致某个产品,而另一个子域名则会有不同的规则。此外,子域也是动态的,这意味着我不能创建任何静态条件。
如果您能提供更多关于您为什么需要此类行为的详细信息,那将会很棒。
通常情况下,您可以扩展默认CUrlManager
类并添加所需的功能。之后,你可以指定这个新的,比如说CustomUrlManager
在config.php
作为你的urlManager
的实现。
但是再次 - 你试图解决什么问题?
你把所有的规则在这里:
Yii::app()->urlManager->rules;
这是一个关联数组,你可以很容易地通过它循环,并操纵它。
不幸的是,没有一个明确的方法来解决这个问题。
内部规则数组_rules
被声明为私有,并且除addRules()
之外没有任何使用它的方法。但是,此方法仅允许您将处理后的规则附加到_rules
阵列的开始/结束处。您也将无法删除已添加的规则。
我提出的解决方案是不好的做法,但没有其他解决我的问题的方法(我知道)。
声明的方法内CUrlManager
protected function clearInnerRules() {
$this->_rules = array(); // clears the inner rules array
}
在子类UrlManager
被用作经理为Yii的应用程序,声明:
public function reprocessRules() {
Yii::app()->cache->delete(self::CACHE_KEY); // remove anything rule-connected from cache
$this->clearInnerRules();
$this->processRules();
}
使用onBeginRequest
事件,将规则添加到数组中的占位符:
// code
Yii::app()->urlManager->rules['rulePlaceholder'] = $newRule;
Yii::app()->urlManager->reprocessRules();
// code
完成。现在,我可以随时删除规则或在任何时候替换它们(只要此时在请求之前)。我猜,有时候你必须做你应该做的事情。