2015-01-14 57 views
1

有沒有解決方案可以從模塊配置中添加路由?Yii2模塊中的路由定義

例子。我們有我們描述

'components' => [ 
    'urlManager' => [ 
       'enablePrettyUrl' => true, 
       'showScriptName' => false, 
       'rules' => require(FILE_PATH_CONFIG_ENV . '_routes.php') // return array 
    ], 
] 

每個模塊中,我們與私人蔘數加載自定義配置文件

public function loadConfig($sFileName = 'main', $sFolderName = 'config') 
{ 
    Yii::configure($this, require($this->getBasePath() . DS . $sFolderName . DS . $sFileName . '.php')); 

    return $this; 
} 

配置文件

return [ 
    'components' => [ 
     'urlManager' => [ 
      'class' => 'yii\web\UrlManager', 
      'rules' => [ 
       '/admin' => '/admin/index/index', 
      ] 
     ] 
    ] 
]; 

主要配置而現在我需要以某種方式合併當前配置(主要用於Web應用程序),從模塊加載配置。最後,我希望在模塊配置路由中僅描述此模塊,並將它們用於漂亮的url(用戶友好的url)。我怎樣才能做到這一點?這個例子不起作用,當我創建url /admin/index/index時,它顯示我/admin/index/index,但我想要/admin在模塊規則中提到。

回答

0

在官方文檔here中提到了分離模塊的url規則。

我認爲這是更合適的方法不像合併和聲明一個配置文件中的所有規則。

規則被解析以便聲明它們(這是here),所以通過分離可以跳過其他模塊的URL。在大量規則的情況下,它可以提高性能。

+0

重讀文檔發現'$ APP-> getUrlManager() - >的addRules([])',日Thnx的幫助。 – user1954544

5

所以我這樣做(這是一個問題的完整答案)。

創建引導類專用於模塊。

namespace app\extensions; 

use yii\base\BootstrapInterface; 

/** 
* Class ModuleBootstrap 
* 
* @package app\extensions 
*/ 
class ModuleBootstrap implements BootstrapInterface 
{ 
    /** 
    * @param \yii\base\Application $oApplication 
    */ 
    public function bootstrap($oApplication) 
    { 
     $aModuleList = $oApplication->getModules(); 

     foreach ($aModuleList as $sKey => $aModule) { 
      if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0) { 
       $sFilePathConfig = FILE_PATH_ROOT . DS . 'modules' . DS . $sKey . DS . 'config' . DS . '_routes.php'; 

       if (file_exists($sFilePathConfig)) { 
        $oApplication->getUrlManager()->addRules(require($sFilePathConfig)); 
       } 
      } 
     } 
    } 
} 

創建模塊的文件夾(/modules/XXX/config/_routes.php)路由文件

return [ 
    '/sales'       => '/sales/index/index', 
    '/sales/company'     => '/sales/company/index', 
    '/sales/company/view/<sID:\d+>'  => '/sales/company/view', 
    '/sales/company/update/<sID:\d+>' => '/sales/company/update', 
    '/sales/company/delete/<sID:\d+>' => '/sales/company/delete', 
]; 

添加自舉到主配置文件

$aConfig = [ 
    // some code 
    'bootstrap' => [ 
     // some code 
     'app\extensions\ModuleBootstrap', 
    ], 
    'modules' => [ 
     // some code 
     'sales' => ['class' => 'app\modules\sales\SalesModule'] 
    ] 
] 

return $aConfig; 

就是這樣。我們只能在模塊'route'config中定義路由。我不喜歡檢測if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0)(我的意思不是'debug','log','gii'或其他原生Yii2模塊),也許有人可以提出更好的解決方案?

+0

感謝您的貢獻。我在你的代碼中修復了一些缺少的常量。 –

3

而且這樣會更乾淨可靠。我在Yii2的github回購here上發現了這個問題。

<?php 
namespace backend\modules\webmasters; 

use Yii; 
use yii\base\BootstrapInterface; 

class Module extends \yii\base\Module implements BootstrapInterface 
{ 
    public $controllerNamespace = 'backend\modules\webmasters\controllers'; 

    public function init() 
    { 
     parent::init(); 
     // initialize the module with the configuration loaded from config.php 
     Yii::configure($this, require(__DIR__ . '/config/main.php')); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function bootstrap($app) 
    { 
     $app->getUrlManager()->addRules([ 
      [ 
       'class' => 'yii\web\UrlRule', 
       'pattern' => $this->id, 
       'route' => $this->id . '/tools/index' 
      ], 
      [ 
       'class' => 'yii\web\UrlRule', 
       'pattern' => $this->id . '/<controller:[\w\-]+>/<action:[\w\-]+>', 
       'route' => $this->id . '/<controller>/<action>' 
      ], 
     ], false); 
    } 
} 

,只是配置main.php配置文件的引導部分作爲

'bootstrap' => [ 
    'log', 
    'webmasters' 
] 
'modules' => [ 
    'webmasters' => [ 
     'class' => 'backend\modules\webmasters\Module' 
    ] 
]