@Evgenya-k2

Как настроить UrlManager в Yii2 с одинаковым названием параметра для разных rotes?

Добрый день!

Настраиваю ссылки в проекте на yii2. Необходимо, чтобы по роуту ['product/view', 'alias' => $alias] открывалась ссылка http://localhost/<alias>, по роуту ['news-category/view', 'alias' => $alias]http://localhost/<alias> и по роуту ['stat-page/view', 'alias' => $alias] тоже открывалась ссылка с урл http://localhost/<alias>. Все слаги уникальны.
UrlManager:
'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                '/' => 'site/index',
                'site/feedback-create' => 'site/feedback-create',
                'products' => 'category/index',
                'products/<alias>' => 'category/view',
                '<alias>' => 'product/view',
                '<alias>' => 'news-category/view',
                '<category>/<alias>' => 'news/view',
                '<alias>' => 'stat-page/view',
            ],
        ],


Открывает только по последнему правилу. Никак не разберусь, как работает UrlManager и как сделать один паттерн для разных роутов?
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@Evgenya-k2 Автор вопроса
Разобралась. Наследовала класс от UrlRule, переопределила методы createUrl() и parseRequest().

public function createUrl($manager, $route, $params) 
{
        if ($route == 'news-category/view' || $route == 'stat-page/view') {
            if (isset($params['alias'])) {
                return '/' . $params['alias'];
            }
        }

        return false;
}

public function parseRequest($manager, $request)
{
        $pathInfo = $request->getPathInfo();
        $pathArray = explode('/', $pathInfo);
        $params['alias'] = $pathInfo;
        $alias = array_pop($pathArray);
        if (StatPage::find()->published()->byAlias($alias)->one()) {
            return ['stat-page/view', $params];
        } elseif (NewsCategory::find()->published()->byAlias($alias)->one()) {
            return ['news-category/view', $params];
        }

        return false;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы