是否有任何可能的方式從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
完成。現在,我可以隨時刪除規則或在任何時候替換它們(只要此時在請求之前)。我猜,有時候你必須做你應該做的事情。