2015-01-14 1 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', 
      ] 
     ] 
    ] 
]; 

А теперь мне нужно каким-то образом объединить текущий конфиг (основной для веб-приложения) с конфигурацией, загруженной из модуля. В конце я хочу описать в модуле config маршруты только для этого модуля и использовать их для хороших URL-адресов (удобный URL-адрес). Как я могу это сделать? Эти примеры не работают, когда я создаю url /admin/index/index, он показывает мне /admin/index/index, но я хочу /admin, как указано в правилах модуля.

ответ

0

Разделительные правила для модулей указаны в официальной документации here.

И я думаю, что это более оптимальный подход, в отличие от слияния и объявления всех правил в одном файле конфигурации.

Правила анализируются в порядке их объявления (упоминается here), поэтому с разделением вы можете пропустить другие URL-адреса модулей. В случае большого количества правил он может повысить производительность.

+0

Reread документация нашли '$ app-> getUrlManager() -> addRules ([])', Thnx за помощью. – user1954544

5

Итак, я сделал это так (это полный ответ на вопрос).

Создать класс Bootstrap для модуля.

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', 
]; 

Добавить boostrap в основной конфигурационный файл

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

return $aConfig; 

Вот так. Мы можем определять маршруты только в конфигурации модуля «маршрут».

PS: Мне не нравится обнаружение if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0) (я имею в виду NOT 'debug', 'log', 'gii' или другие собственные модули Yii2), может быть, кто-то может предложить лучшее решение?

+0

Спасибо за ваш вклад. Я исправил некоторые недостающие константы в вашем коде. –

3

И это будет более чистым и надежным. Я нашел это на yii2 github repo 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' 
    ] 
] 
Смежные вопросы