Маршрут для модуля на поддомене

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
comunTwist
Сообщения: 9
Зарегистрирован: 2020.11.10, 23:20

Маршрут для модуля на поддомене

Сообщение comunTwist »

Как настроить маршрут для модуля на поддомене?
Шаблон basic. Некоторые патерны могут совпадать как у основного домена, так и у поддомена, например корень сайта. Я хочу создавать правила маршрутизации динамически, то есть если есть обращение к модулю, то нужно использовать правила маршрутизации из модуля
Аватара пользователя
comunTwist
Сообщения: 9
Зарегистрирован: 2020.11.10, 23:20

Re: Маршрут для модуля на поддомене

Сообщение comunTwist »

Ну, спасибо за помощь!
В общем, сделал так: создал класс 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:

Код: Выделить всё

  'bootstrap' => [
        'app\bootstrap\ModuleComponents' // автозагрузка компонентов модулей
    ],
В папке с модулями создал абстрактный класс app\modules\BaseModule с абстрактным методом:

Код: Выделить всё

   /** @return array */
    abstract public function getModuleComponents();
Теперь классу модуля, которому нужны свои компоненты (в том числе urlManager), нужно реализовать метод, например вот так:

Код: Выделить всё

  /** @inheritdoc */
    public function getModuleComponents()
    {
        return require __DIR__ . '/config/components.php';
    }
Если ваш модуль, доступен из поддомена, то при обращении к нему, приложение будет брать компоненты из модуля, а не из основного приложения
Ответить