getUrlRules - 开关控制器

问题描述:

我有一个SearchModule.php有以下几点:getUrlRules - 开关控制器

class SearchModule extends CWebModule 
{  
    // function init() { } 
    /** 
    * @return array Правила роутинга для текущего модуля 
    */ 
    function getUrlRules() 
    { 
     $customController = (Yii::app()->theme->getName() == 'test' ? 'Test' : '') . '<controller>'; 

     return array(
      $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>' => $this->id.'/' . $customController . '/<action>', 
      $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>/<cityId:\d+>' => $this->id.'/' . $customController . '/<action>', 
      $this->id.'/visas' => $this->id.'/visas/fullVisasInfo', 
     ); 
    } 
} 

我试图找出是如何使用另一个控制器,如果我的主题”设置为‘测试’。现在它拥有名为HotelsController或LocationsController的搜索控制器。我试图实现的是,如果主题名称设置为“测试”,它应该将所有请求从同一网址路由到TestHotelsController或TestLocationsController(/ search/hotels应该路由到TestHotelsController而不是HotelsController)。

我已经试过通过在路由表的第二部分追加'测试'来做到这一点,但似乎没有做任何事情。

我已经找到一种方法,这种通过使用setControllerPath像这样:

$customController = (Yii::app()->theme->getName() == 'test' ? 'test' : ''); 
$this->setControllerPath(__DIR__ ."/controllers/$customController"); 

在模块的init()函数。这样,自定义控制器的名称保持不变,只有它的目录发生更改。

您不会将关键字<controller>与任何类型的控制器名称组合在一起。您可以给它一个自定义的唯一控制器名称,或者使用<controller>关键字来读取给定的控制器。和控制器名称并不TestController,但它是TestHotelsController,这样,试图改变这样的代码:

function getUrlRules() 
{ 
    $customController = (Yii::app()->theme->getName() == 'test' ? 'hotelsTest' : 'hotels'); 

    if(strpos(Yii::app()->urlManager->parseUrl(Yii::app()->request), 'hotel')) { 
     $rules = array(
      $this->id . '/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>' => $this->id . '/' . $customController . '/<action>', 
      $this->id . '/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>/<cityId:\d+>' => $this->id . '/' . $customController . '/<action>', 
      $this->id . '/visas' => $this->id . '/visas/fullVisasInfo', 
     ); 
    } 
    else { 
     $rules = array(
      $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>' => $this->id.'/<controller>/<action>', 
      $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>/<cityId:\d+>' => $this->id.'/<controller>/<action>', 
      $this->id.'/visas' => $this->id.'/visas/fullVisasInfo', 
     ); 
    } 

    return $rules; 
} 
+0

这似乎并没有诀窍,因为它不会调用TestController的操作。我可以直接给他们打电话,但是通过这个路由,它一直呼叫标准HotelsController。我稍微修改了函数和控制器名称,当我直接调用/ search/hotelsTest时,它会正确调用测试控制器的操作,但是它不会根据需要切换到调用它。 –