@tincap

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

Пусть у нас есть 3 вида пользователя и 3 вида модуля соответсвенно:

modules
-> cleaner
-> admin
-> client

У каждого модуля есть контроллер Order

Как сделать так, чтобы смотря на роль пользователя, можно было определить, контроллер какого модуля запускать?
Например, если пользователь cleaner, то по url: "order/list" должен запуститься контроллер order у модуля cleaner.

Спасибо пользователю matperez за его ответ.

Да, можно работать с UrlRule. Но что, если контроллеров 1000? Под каждый url задавать свой контроллер? Возможно ли как-то указать фреймворку, с каким модулем надо работать? Например, если пользователь admin, то нужно сказать фреймворку, что нужно работать только с модулем admin.

Решение:

namespace app\components;

use yii\web\UrlRule;

class RoleUrlRule extends UrlRule
{
    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();

        if (\Yii::$app->user->identity->role == 'cleaner')
            return ['cleaner/' . $pathInfo, array()];
    }
}
  • Вопрос задан
  • 696 просмотров
Решения вопроса 1
@matperez
Мне кажется, можно создать собственный класс \yii\web\UrlRule. В принципе должно хватить только метода parseRequest. Маршрут нужно возвращать в зависимости от текущего пользователя. Потом прописать его в правила маршрутизации:
'rules' => [
   ['class' => 'MyUrlRule', 'pattern' => '/order/list', 'route' => 'order/list', ...],
   ...,
 ]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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