2014-11-25 61 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 
    

完成。现在,我可以随时删除规则或在任何时候替换它们(只要此时在请求之前)。我猜,有时候你必须做你应该做的事情。