2014-11-25 64 views
0

是否有任何可能的方式從urlManager中去除url規則?Yii - 動態刪除url規則

我知道我可以通過urlManager->addRules()添加規則,但是如何刪除它們?

謝謝。

編輯:

我的目標是動態生成基於子域的規則。 例如,某種類型的子域名可能會有一個規則<catalog>/<brand>/<product>導致某個產品,而另一個子域名則會有不同的規則。此外,子域也是動態的,這意味着我不能創建任何靜態條件。

回答

0

如果您能提供更多關於您爲什麼需要此類行爲的詳細信息,那將會很棒。

通常情況下,您可以擴展默認CUrlManager類並添加所需的功能。之後,你可以指定這個新的,比如說CustomUrlManagerconfig.php作爲你的urlManager的實現。

但是再次 - 你試圖解決什麼問題?

2

你把所有的規則在這裏:

Yii::app()->urlManager->rules; 

這是一個關聯數組,你可以很容易地通過它循環,並操縱它。

0

不幸的是,沒有一個明確的方法來解決這個問題。

內部規則數組_rules被聲明爲私有,並且除addRules()之外沒有任何使用它的方法。但是,此方法僅允許您將處理後的規則附加到_rules陣列的開始/結束處。您也將無法刪除已添加的規則。

我提出的解決方案是不好的做法,但沒有其他解決我的問題的方法(我知道)。

  1. 聲明的方法CUrlManager

    protected function clearInnerRules() { 
         $this->_rules = array(); // clears the inner rules array 
    } 
    
  2. 在子類UrlManager被用作經理爲Yii的應用程序,聲明:

    public function reprocessRules() { 
        Yii::app()->cache->delete(self::CACHE_KEY); // remove anything rule-connected from cache 
        $this->clearInnerRules(); 
        $this->processRules(); 
    } 
    
  3. 使用onBeginRequest事件,將規則添加到數組中的佔位符:

    // code 
    Yii::app()->urlManager->rules['rulePlaceholder'] = $newRule; 
    Yii::app()->urlManager->reprocessRules(); 
    // code 
    

完成。現在,我可以隨時刪除規則或在任何時候替換它們(只要此時在請求之前)。我猜,有時候你必須做你應該做的事情。