@Baldaris

Как организовать контроллер(ы) в YII2 для авторизованного юзера и гостя на один URL?

Хочу, чтобы для гостя на главной странице сайта открывался лендинг с авторизацией и ссылками на регистрацию, сброс пароля и прочее, а после авторизации он оставался также по url главной страницы, но уже в своём кабинете не имеющего ничего общего с гостевым лендингом. Некоторые страницы также могут совпадать по URL для гостя и юзера.
Как лучше организовать такое?
Вариант в экшене проверять авторизован юзер или нет и в зависимости от этого выводить соответствующую вьюху мне не нравится.
Хочется разделить контроллеры - для авторизованного пользователя свой контроллер со своими экшенами, для гостя свой.
Как вы решаете такую задачу?
Фреймворк Yii2.
  • Вопрос задан
  • 431 просмотр
Решения вопроса 1
@matperez
В принципе, вы знаете авторизован пользователь или нет еще до этапа маршрутизации, поэтому можно разные правила маршрутизации задавать для авторизованных пользователей и не авторизованных. Как-нибудь так.

class ConditionalRouting implements BootstrapInterface
{
    /**
     * @var array
     */
    public $guestRules = [
        '' => 'guest/index',
    ];

    /**
     * @var array
     */
    public $userRules = [
        '' => 'user/index'
    ];

    /**
     * @inheritDoc
     */
    public function bootstrap($app)
    {
        $manager = \Yii::$app->urlManager;
        $manager->addRules(\Yii::$app->user->isGuest ? $this->guestRules : $this->userRules, false);
    }
}


И добавить это дело в автозагрузку веб-приложению
...
'bootstrap' => [
        \app\components\ConditionalRouting::class
],
...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@maxyc_webber
Web-программист
Вариант в экшене проверять авторизован юзер или нет и в зависимости от этого выводить соответствующую вьюху мне не нравится.
почему вьюху. для разных пользователей разный экшен. можешь оформить модулем, и в модуле проверять нужного пользователя и отдавать необходимый контроллер модуля
Ответ написан
Комментировать
bitver
@bitver
"Вариант в экшене проверять авторизован юзер или нет и в зависимости от этого выводить соответствующую вьюху мне не нравится." и зря, это самый очевидный и не плохой вариант. Естественно содержимое блоков проверки лучше вынести в отдельные методы для большей читабельности.
Ответ написан
Комментировать
jacksparrow
@jacksparrow
В качестве альтернативы тому что предложили выше, есть такая мысль. Но тут будет несколько переопределена проблема.
public function __construct($id, $module)
    {
        parent::__construct($id, $module);
        if (Yii::$app->user->isGuest) {
            return $this->redirect('/login/', 302);
        } else {
            return false;
        }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы