@ukoHka
Всего понемногу

Как настроить маршрутизацию в зависимости от параметров в UrlManager?

В текстах статей на сайте есть ссылки наподобие index.php?option=com_content&view=article&id=1
Как в UrlManager прописать так, чтобы при открытии подобных ссылок открывался определенный контроллер?
К примеру, если view = article, то открывается article/view и передается параметр id, а если view = category, то уже category/view
'rules' => [
    'index.php?option=com_content&view=article' = 'article/view',
]
перенаправляет все в index.php, а если заменить index.php на files.php, то выдает 404.
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
@vksee
*** Вариант 1 *** - создать специальное правило для URL.
<?php
namespace app\components;
use yii\web\UrlRuleInterface;
use yii\base\Object;

class JoomlaUrlRule extends Object implements UrlRuleInterface
{
    public function createUrl($manager, $route, $params)
    {
        return false;
    }

    public function parseRequest($manager, $request)
    {
        $it_joomla_url = $request->getPathInfo()==='' 
                     && $request->getQueryParam('option')==='com_content';
        if (!it_joomla_url) {
            return false;            
        }
        $view = $request->getQueryParam('view');
        if (empty($view)) {
            return false;            
        }
        return ["$view/view", $request->queryParams];
    }
}

Прописать его в конфиге приложения:
[
    'components' => [
        'urlManager' => [
            // ...
            'rules' => [
                ['class' => 'app\components\JoomlaUrlRule'],
                // ...
            ],
        ],
    ],
]

Yii2: Разбор и генерация URL

*** Вариант 2 *** - решить задачу настройками веб-сервера.

Для веб-сервера Apache - добавьте в файл .htaccess строки:
RewriteCond %{THE_REQUEST} index.php [NC]
RewriteCond %{QUERY_STRING} option=com_content [NC]
RewriteCond %{QUERY_STRING} view=category [NC]
RewriteRule (.*) /category/view/ [L,R=301,QSA]

RewriteCond %{THE_REQUEST} index.php [NC]
RewriteCond %{QUERY_STRING} option=com_content [NC]
RewriteCond %{QUERY_STRING} view=article [NC]
RewriteRule (.*) /article/view/ [L,R=301,QSA]

Информация о правилах...
Это два набора правил редиректа, для ссылок вида:
index.php?option=com_content&view=category...
index.php?option=com_content&view=article...

Для изначального URL запроса - порядок параметров значения не имеет.
К примеру, должны работать варианты:
index.php?option=com_content&view=article&id=1
index.php?id=1&view=article&option=com_content

По ссылке index.php?option=com_content&view=article&id=1
будет редирект на /article/view?option=com_content&view=article&id=1

Все параметры запроса затем передаются в контроллер, обрабатывать можно только нужные параметры, к примеру, только id.

Но для SEO рекомендую более строгие правила:
RewriteCond %{THE_REQUEST} index.php [NC]
RewriteCond %{QUERY_STRING} option=com_content [NC]
RewriteCond %{QUERY_STRING} view=category [NC]
RewriteCond %{QUERY_STRING} id=(\d+) [NC]
RewriteRule (.*) /category/view?id=%1 [L,R=301]

RewriteCond %{THE_REQUEST} index.php [NC]
RewriteCond %{QUERY_STRING} option=com_content [NC]
RewriteCond %{QUERY_STRING} view=article [NC]
RewriteCond %{QUERY_STRING} id=(\d+) [NC]
RewriteRule (.*) /article/view?id=%1 [L,R=301]

По ссылке index.php?option=com_content&view=article&id=1 будет редирект на /article/view?id=1
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
$url = Url::to(['post/view', 'id' => 100]);
создаст
/index.php?r=post%2Fview&id=100
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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