UrlManager

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
bykaVBS
Сообщения: 1
Зарегистрирован: 2017.03.23, 13:07

UrlManager

Сообщение bykaVBS »

В общем такая ситуация. Используется Yii Starter kit, бэкенд, фронтенд.

Структура урлов достаточно сложная (связано с переносом сайта с другой системы)
На фронте rules для urlManager выглядят вот так:

Код: Выделить всё

// Stuffs
['pattern'=>'stuff/<razdel>/<category>/<slug>/<alias>', 'route'=>'stuff/view'],
['pattern'=>'stuff/<razdel>/<category>/<id>', 'route'=>'stuff/category'],
['pattern'=>'stuff/<razdel>/<id>', 'route'=>'stuff/razdel'],
['pattern'=>'stuff/search/', 'route'=>'stuff/search'],
['pattern'=>'/', 'route'=>'stuff/index'],
Сначала пытался строить урлы динамически

Код: Выделить всё

Url::to(['stuff/view', 'razdel'=>$razdel->slug, 'category' => $this->category->slug, 'slug' => $this->slug, 'alias' => $this->getAlias()])
Но это дает достаточно большое количество запросов, то есть нужно получить раздел, категорию, сформировать алиас. Поэтому я решил хранить уже сформированные урлы сразу в модели, в бд, а формировать единоразово в afterSave() модели.

Вот тут возник небольшой затык. Сохраняю-то я модель с бэкенда, а там инициализирован компонент urlManager с настройками

Код: Выделить всё

[
    'class'=>'yii\web\UrlManager',
    'enablePrettyUrl'=>true,
    'showScriptName'=>false,
    'rules'=>[
        // url rules
    ]
];
и соответственно мой url сохраняется в базу совсем не ЧПУ, как задумывалось.

Тогда я поступил так - проинициализировал новый urlManager прямо в модели c нужным мне конфигом

Код: Выделить всё

public function getUrl()
    {
        $razdel = $this->category->getParent()->one();
        $urlManage = new UrlManager([
            'enablePrettyUrl'=>true,
            'showScriptName'=>false,
            'rules'=> [

                // Stuffs
                ['pattern'=>'stuff/<razdel>/<category>/<slug>/<alias>', 'route'=>'stuff/view'],
                ['pattern'=>'stuff/<razdel>/<category>/<id>', 'route'=>'stuff/category'],
                ['pattern'=>'stuff/<razdel>/<id>', 'route'=>'stuff/razdel'],
                ['pattern'=>'stuff/search/', 'route'=>'stuff/search'],
                ['pattern'=>'/', 'route'=>'stuff/index'],

            ]
        ]);

        $url = $urlManage->createUrl(['stuff/view', 'razdel'=>$razdel->slug, 'category' => $this->category->slug, 'slug' => $this->slug, 'alias' => $this->getAlias()]);
        return $url;
    }
Соответственно в базу стали сохраняться чпу урлы, но вопрос - не слишком ли большой костыль? Может как-то можно правильней все это организовать?
Ответить