Всем привет, кто с Yii2 давно и глубоко знаком не подскажите как лучше реализовать динамическое изменение папки контроллеров, скажем Если в сессии есть переменная брать контроллеры из папки
/app/controller/ . $_session['controller'] . / . $controller->id , если нет то /app/controller/default/$controller->id
Где вообще происходит открытие контроллера? Копался в urlManager там только обработка запросов и построение роутов, а где сам процесс открытия контроллера происходит? Можно ли это сделать как то не ломая логику фреймворка?
Менять namespase контролера по умолчанию можно в конфиге, можно в модуле, если это контролер модуля. Можно в beforeRequest. Можно вообще в точке входа, собирать разные конфиги. Но мне кажется Вы дичь какую-то делаете. Опишите задачу подробнее.
Возможно стоит просто редирект делать на нужный контролер?
Но все же наверное самый адекватный метод - это менять controllerNamespace при инициализации модуля: https://www.yiiframework.com/doc/api/2.0/yii-base-...
или controllerMap: https://www.yiiframework.com/doc/api/2.0/yii-base-...
Максим Тимофеев, Да если честно дичь))А можно про before request подробней? Как обратится к немспейсу контроллеров по умолчанию? Задача стоит такая. Заходят люди с разных ip, разных стран. От выбора страны(ее либо сам юзер выберет, либо по ip определит функция) может быть самое различное развитие событий. В общем стоит задача создать дефолтный шаблон сайта, а при необходимости, создать отдельный контроллер для определенной странны, независимый от остальных. Стран может быть порядка 10, но при этом в каждой может быть какая-то маленькая особенность, не слишком маленькая чтоб ставить if и не слишком большая чтоб ради нее пилить отдельный модуль.
Максим Тимофеев, Ну изначально все в одном и решалось, только было слишком много if() Разные страны, разные операторы, слишком много условий, вот и встала задача разбить это все на более раздельные понятные куски. Только еще не желательно url при этом менять, скажем в английской версии может быть три разных оператора, и у каждого свои какие-то танцы с бубнами, и нужно чтоб по url /en/site/index я попадал на контроллер своего оператора, который был определен в переменной скажем carrier динамически. И планировал это как то сделать в роутере вообще, что то вроде if (file_exist(controller/$cariier/$controller-id)) {Выкинуть на него}
Ну а если нет, то пусть все обрабатывается по стандарту, из папки controller/default. Звучит немного запутанно, наверно потому что так и есть))
по чему не switch case и разные методы в пределах одного контролера или вообще отдельный объект, который получает входные параметры и что-то возвращает?
Но если все от url зависит, то конечно стоит задуматься о своем url manager
Максим Тимофеев , а все же не подскажите в каком методе у urlManager происходит подключение нужного контроллера на основании роута? А то я чего то в упор не могу увидеть как это в yii реализовано все, если нет с удовольствием бы глянул более детальный обзор URL менеджера у вас на канале)