Есть ли решение для добавления маршрутов из конфигурации модуля?
Пример. У нас есть основная конфигурация, где мы описываем
'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
как указано в правилах модуля.
Разделение правил 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' ] ]