Определение маршрутов 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', ] ] ] ]; 

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

Related of "Определение маршрутов Yii2 в модулях"

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

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

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

Поэтому я сделал это ( это полный ответ на вопрос ).

Создайте класс 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), может быть, кто-то может предложить лучшее решение?

И это будет более чистым и надежным. Я нашел это на giiub repo Yii2 здесь .

 <?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); } } 

и просто настройте секцию начальной загрузки файла config.php как

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