2015-01-23 2 views
0

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

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

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

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

Info: 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 

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

ответ

1

предварять имя клиента для всех URL-адресов модифицировали ваше правило URL:

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

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

Howewer, назвав это так, что во всем проекте не является гибким подходом.

В большинстве случаев метод 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']) для достижения того же результата.

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

Update:

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

+1

Спасибо, это хорошая идея. –

+0

У вас есть идея, как обращаться с $ this-> goBack() и $ this-> goHome(). Кажется, они используют Url :: to() без использования массива в качестве параметра. Есть ли простой способ также перезаписать Url :: to() и установить мой параметр GET? –

+0

Вы можете попробовать указать свой собственный класс в 'Yii :: $ classMap'. См. Http://www.yiiframework.com/doc-2.0/guide-helper-overview.html#customizing-helper-classes. Я уже упоминал об этом в ответе. – arogachev

Смежные вопросы