Yii2: Как перенаправить с помощью UrlManager? - PullRequest
0 голосов
/ 03 июня 2018

В моем конфиге Yii2 у меня есть:

'components' => [
    'urlManager' => [

        'baseUrl'         => '',
        'enablePrettyUrl' => true,
        'showScriptName'  => false,

        'rules' => [
            'search' => 'site/index',
            ...
        ],
    ...

Если перейти на site.com/search, это работает.Если я перехожу на site.com/site/index, он также работает и показывает тот же контент.Как перенаправить звонок вместо того, чтобы просто показывать ответ сайта / индекса?Он также должен перенаправлять с параметрами (site.com/site/index?param=1 -> site.com/search?param=1)

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете использовать UrlManager::$enableStrictParsing, чтобы отключить сопоставление по маршруту.Если вы установите true, запрос к /site/index URL не будет ничего совпадать, и приложение вернет ошибку 404.

'components' => [
    'urlManager' => [
        'baseUrl' => '',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing' => true,
        'rules' => [
            'search' => 'site/index',
            // ...
        ],
    // ...

Но это может быть не вариант, если вы действительно хотите использовать маршруты какURL в других случаях.


Вас также может заинтересовать класс UrlNormalizer.Это все еще относительно простой компонент, который (пока) не поддерживает ваш вариант использования, но на самом деле он был разработан для таких задач.Вы можете рассмотреть возможность его расширения и добавить логику перенаправления для вашего варианта использования - это должно быть гораздо более чистое решение, чем использование событий или специальных действий и правил для перенаправлений.Это также может быть хорошим материалом для PR и передачи этой функции в базовую платформу.


Ленивое решение заключается в создании действия перенаправления и добавлении правил в соответствии с URL-адресами, которые необходимо перенаправить:

class RedirectController extends Controller {

    public function actionRedirect($action, $controller, $module = null) {
        if ($action === $this->action->id && $controller === $this->id && $module === null) {
            // prevent to access action directly and redirection loops
            throw new NotFoundHttpException();
        }

        $url = Yii::$app->request->get();
        unset($url['action'], $url['controller'], $url['module']);
        array_unshift($url, '/' . ltrim(implode('/', [$module, $controller, $action]), '/'));

        return $this->redirect($url);
    }
}

И правила:

'urlManager' => [
    // ...
    'rules' => [
        'search' => 'site/index',
        [
            'pattern' => '<controller:(site)>/<action:(index)>',
            'route' => 'redirect/redirect',
            'model' => UrlRule::PARSING_ONLY,
        ],
        // ...
    ],
],
0 голосов
/ 04 июня 2018

UrlManager не перенаправляет.Скорее, переписывает как веб-сервер.Он называется маршрутизация .

Если вы хотите выполнить перенаправление в своем коде, вы можете использовать Response::redirect().Если у вас нет SearchController, где вы можете поместить это утверждение в действие, вы можете поместить его в событие beforeAction.Вы можете сделать это в своем конфигурационном массиве:

[
    'components' = [
        ...
    ],
    'on beforeAction' => function ($event) {
        if(Yii::$app->request->pathInfo === 'search') {
            $url = 'site/index?' . Yii::$app->request->queryString;
            Yii::$app->response->redirect($url)->send();
            $event->handled = true;
        }
    }
]

Или, если у вас есть SearchController use:

class SearchController extends \yii\web\Controller {
    public function actionIndex() {
        $url = 'site/index?' . Yii::$app->request->queryString;
        return $this->redirect($url);
    }
}

Третий вариант - настроить веб-сервер для перенаправления.Это было бы самым быстрым решением.

...