Как настроить маршрут для модуля на поддомене?
Шаблон basic. Некоторые патерны могут совпадать как у основного домена, так и у поддомена, например корень сайта. Я хочу создавать правила маршрутизации динамически, то есть если есть обращение к модулю, то нужно использовать правила маршрутизации из модуля
Маршрут для модуля на поддомене
- comunTwist
- Сообщения: 9
- Зарегистрирован: 2020.11.10, 23:20
- comunTwist
- Сообщения: 9
- Зарегистрирован: 2020.11.10, 23:20
Re: Маршрут для модуля на поддомене
Ну, спасибо за помощь!
В общем, сделал так: создал класс app\bootstrap\ModuleComponents. В нём переопределил метод:
Этот метод на этапе запроса парсит строку запроса и выделяет из неё поддомен. Далее идёт проверка, существует ли модуль с таким именем... Соответственно, подключаю класс в конфиге, в секции bootstrap:
В папке с модулями создал абстрактный класс app\modules\BaseModule с абстрактным методом:
Теперь классу модуля, которому нужны свои компоненты (в том числе urlManager), нужно реализовать метод, например вот так:
Если ваш модуль, доступен из поддомена, то при обращении к нему, приложение будет брать компоненты из модуля, а не из основного приложения
В общем, сделал так: создал класс app\bootstrap\ModuleComponents. В нём переопределил метод:
Код: Выделить всё
/** @inheritdoc */
public function bootstrap($app)
{
$route = $app->request->hostName;
$moduleName = substr($route, 0, strpos($route, '.'));
if ($app->hasModule($moduleName)) {
$module = $app->getModule($moduleName);
if ($module instanceof BaseModule) {
$app->setComponents($this->getComponents($module));
}
}
}
public function getComponents(BaseModule $module)
{
return $module->getModuleComponents();
}
Код: Выделить всё
'bootstrap' => [
'app\bootstrap\ModuleComponents' // автозагрузка компонентов модулей
],
Код: Выделить всё
/** @return array */
abstract public function getModuleComponents();
Код: Выделить всё
/** @inheritdoc */
public function getModuleComponents()
{
return require __DIR__ . '/config/components.php';
}