Yii - 动态删除网址规则

时间:2014-11-25 07:37:19

标签: php yii

有什么方法可以随时从urlManager中删除网址规则吗?

我知道我可以通过urlManager->addRules()添加规则,但如何删除它们?

感谢。

编辑:

我的目标是根据子域动态生成规则。 例如,某个类型的子域将具有导致特定产品的规则<catalog>/<brand>/<product>,而另一个将具有不同的规则。此外,子域也是动态的,这意味着我无法创建任何静态条件。

3 个答案:

答案 0 :(得分:2)

这里有所有规则:

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

这是一个关联数组,你可以轻松地遍历它并操纵它。

答案 1 :(得分:0)

如果您能提供有关您需要此类行为的详细信息,那就太棒了。

通常,您可以扩展默认的CUrlManager类并添加所需的功能。之后,您可以在CustomUrlManager中指定这个新的config.php,作为urlManager的实施。

但是又一次 - 你试图解决什么问题?

答案 2 :(得分:0)

不幸的是,没有一个明确的方法来解决这个问题。

内部规则数组_rules被声明为私有,除了addRules()之外,没有其他方法可以使用它。但是,此方法仅允许您将已处理的规则附加到_rules数组的开头/结尾。您也无法删除已添加的规则。

我提出的解决方案是不好的做法,但没有其他办法解决我的问题(我知道)。

  1. CUrlManager

    中声明方法
    protected function clearInnerRules() {
          $this->_rules = array(); // clears the inner rules array
    }
    
  2. 在用作Yii应用程序管理器的子类UrlManager中,声明:

    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
    
  4. 完成。现在我可以轻松删除规则或随时替换它们(前提是,此时刻在请求之前)。有时候你只需要做你必须做的事情,我想。