правило перезаписи yii2 для клиентского портала

У меня есть расширенное приложение yii с интерфейсом и бэкэндом.

Чего я пытаюсь добиться, так это того, что я могу получить доступ к внешнему интерфейсу с именем клиента.

Пример (местный): http://localhost/myproject/frontend/web/customer1 должен стать http://localhost/myproject/frontend/web/customer1/site/login при первом посещении.

И после входа имя клиента должно оставаться в URL-адресе. На данный момент URL меняется после входа в систему на http://localhost/myproject/frontend/web/

Информация: customer является параметром GET. Он всегда должен быть первым аргументом после http://localhost/myproject/frontend/web/, но я не хочу указывать аргумент в каждой ссылке перенаправления или пользовательской ссылке. Я надеюсь, что есть способ сохранить этот аргумент и передать его каждому из следующих изменений сайта.

Что я пробовал до сих пор:

'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true, 
            'rules' => [
                '<controller>/<action>' => '<controller>/<action>',
                '<customer:\w+>' => '/site/login',
            ]
        ],

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

Мой файл .htaccess выглядит так:

RewriteEngine on

# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

Я очень ценю любые подсказки по этой теме.


person Sarah West    schedule 23.01.2015    source источник


Ответы (1)


Чтобы добавить имя клиента ко всем URL-адресам, измените правило URL-адреса:

<customer:\w+>/<controller>/<action>' => '<controller>/<action>,

Если вы сейчас вызовете yii\helpers\Url::to(['site/index', 'customer' => 'customer']), вывод будет таким, как вы хотите - /customer/site/index.

Однако называть это так во всем проекте - не гибкий подход.

В большинстве случаев метод Url::to() используется для создания внутренних URL-адресов.

Если вы передадите массив в $route, он вызовет Url::toRoute(). Таким образом, вы можете просто переопределить этот метод в своем пользовательском компоненте.

namespace frontend\components;

use yii\helpers\Url as BaseUrl;

class Url extends BaseUrl
{
    public static function toRoute($route, $scheme = false)
    {
        $customer = ... // Get saved after login customer name (for example from the session)
        $route['customer'] = $customer;

        return parent::toRoute($route, $scheme);
    }
}

Затем вы можете просто вызвать frontend\components\Url::to(['site/index']) для достижения того же результата.

Альтернативный способ настройки вспомогательных классов описан в официальной документации здесь. .

Обновление:

Кроме того, это правило URL-адреса '<customer:\w+>' => '/site/login', является избыточным, и URL-адрес должен быть просто site/login, потому что любой пользователь до входа в систему является гостем.

person arogachev    schedule 23.01.2015
comment
У вас есть идея, как обрабатывать $this-›goBack() и $this-›goHome(). Кажется, они используют Url::to() без использования массива в качестве параметра. Есть ли простой способ также перезаписать Url::to() и установить мой параметр GET? - person Sarah West; 26.01.2015
comment
Да, я сделал этот метод для Url::toRoute(). Но у меня проблемы с Url::to(). Я знаю, что также могу перезаписать этот метод в своем классе, но я еще не знаю, как установить там свой параметр GET. - person Sarah West; 26.01.2015
comment
Как я уже сказал, в случае передачи массива Url::to() вызовет метод Url::toRoute() в самом начале (github.com/yiisoft/yii2/blob/master/framework/helpers/). Поэтому переопределения Url::toRoute() в большинстве случаев должно быть достаточно. - person arogachev; 26.01.2015
comment
Если вы хотите, вы можете изменить метод Url::to() в нужном месте или даже основной метод createUrl() в классе yii\web\UrlManager. - person arogachev; 26.01.2015
comment
Да, но только если параметр Url::to() является массивом. Я думаю, что напр. $this-›GoBack() передает строку в Url::to(), поэтому моя настроенная функция toRoute() не вызывается. - person Sarah West; 26.01.2015
comment
Давайте продолжим обсуждение в чате. - person arogachev; 26.01.2015