delfi
@delfi
https://ittricks.ru

Как прописывать динамические правила роутинга в Yii2?

Недавно начал осваивать Yii и возникла необходимость реализовать такой функционал.

1. Человек регистрируется, указывая свою роль - роль1 или роль2.
2. После авторизации я хочу, чтобы пользователь по адресу site.ru/profile видел свой профиль и мог им управлять, однако для "роль1" и для "роль2" профили разные, с разным набором полей и хранятся в разных таблицах. Можно ли как-то динамически прописать правила роутинга в UrlManager, чтобы в зависимости от значения Yii::$app->user->iedentity->role выводились разные контроллеры для разных типов ролей?

Предвижу вариант ответа - в контроллере вывода просто проверяем роль, но хотелось бы разделить на разные контроллеры логику, т.к. дальше будут они обрастать функционалом и появится путаница.
  • Вопрос задан
  • 2817 просмотров
Решения вопроса 1
delfi
@delfi Автор вопроса
https://ittricks.ru
Решил через UrlRule
class ProfileUrlRule implements UrlRuleInterface
{
    public function createUrl($manager, $route, $params)
    {
        if (preg_match('/^staff\//', $route)) {
            return str_replace('staff/', '', $route);
        }
        if (preg_match('/^customer\//', $route)) {
            return str_replace('customer/', '', $route);
        }

        return false;
    }

    public function parseRequest($manager, $request)
    {

        $pathInfo = trim($request->pathInfo, '/');
        $pathInfo = explode('/', $pathInfo);

        if (is_array($pathInfo) && $pathInfo[0] == 'profile' &&
            in_array(Yii::$app->user->identity->type, [UserHelper::TYPE_CUSTOMER, UserHelper::TYPE_STAFF])
        ) {
            if (Yii::$app->user->identity->type == UserHelper::TYPE_STAFF) {
                return [str_replace('profile', 'staff/profile', $request->pathInfo), []];
            } elseif (Yii::$app->user->identity->type == UserHelper::TYPE_CUSTOMER) {
                return [str_replace('profile', 'customer/profile', $request->pathInfo), []];
            }
        }

        return false;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Отдавайте разные вьюхи, но из одного controller#action.

public function actionIndex()
{
    if ($this->user->role1) {
        $this->runActionForRole1();
    } else {
        $this->runActionForRole2();
    }
}
Ответ написан
Ваш ответ на вопрос

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

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