Как сделать перенаправление на одну страницу с любой другой в зависимости от свойства модели?
Здравствуйте!
Стоит задача сделать перенаправление с любого маршрута приложения на определенную страницу, которая извещает пользователя о том, что сайт на тех обслуживании.
Реализую так:
1. Создал табличку (и соответствующую ей модель) с одной записью, в которой id состояния приложения. Допустим id=2 соответствует режиму тех.обслуживания.
2. Сделал веб интерфейс для админа где данный параметр можно менять.
После этого столкнулся с проблемой как отдавать всем пользователям кроме админа страничку, извещающую о том, что на сайте проводятся работы.
Хотелось бы из вышеупомянутой модели получать id состояния, проверять его и роль пользователя и при необходимых условиях перенаправлять на нужную страницу. Знаю про решение сделать класс унаследованный от Controller и в нем определить метод beforeAction, в котором будет вся логика, а остальные контроллеры наследовать от него, но уже слишком много создано контроллеров и хотелось бы сделать как то иначе!
Как вариант в конфиге есть свойство "catchAll", которое редиректит любой запрос на необходимый маршрут. Это полумера, т.к. хотелось бы это делать из веб интерфейса.
Пробовал сделать компонент и навесить обработчик на одно из событий приложения и в колбеке обрабатывать как то условия, но не получилось редиректить из компонента на нужную страницу.
Буду признателен за подсказки в преодолении моей проблемы))
Добрый вечер.
В web-local.php, параметры подставьте свои.
Yii::$app->siteSettings - компонент, который получает данные из базы данных для настройки сайта, создан для yii2 по примеру https://elisdn.ru/blog/21/yii-i-hranenie-nastroek-... для yii1.
return [
'on beforeAction' => function ($event) use ($params) {
if ( !Yii::$app->user->can('admin') && Yii::$app->siteSettings->get('SITE.OFF_LINE') == 'off' ) {
if ( in_array($event->action->id, $params['no_section']) ) {
return Yii::$app->response->redirect([ 'site/no-section' ]);
}
}
if ( Yii::$app->siteSettings->get('SITE.OFF_LINE') == 'on' ) {
$controllerId = $event->action->controller->id;
if ( !Yii::$app->user->can('admin') ) {
if ( !in_array($controllerId, [ 'admin/default', 'offline' ]) ) {
Yii::$app->user->logout();
return Yii::$app->response->redirect([ 'offline/off-mode' ]);
}
}
}
return false;
},
'on afterAction' => function ($event) {
if ( Yii::$app->siteSettings->get('SITE.OFF_LINE') == 'on' ) {
if ( !Yii::$app->user->isGuest && !Yii::$app->user->can('admin') ) {
Yii::$app->user->logout();
return Yii::$app->response->redirect([ 'offline/off-mode' ]);
}
}
return false;
},
// остальные настройки
]
Дмитрий, прошу прощения не особо понял приведенный вами код это в конфиге web.php чтоли должно быть? если да, то к чему это все относится - какой-либо компонент, модуль...?