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

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

0

Решение

Чтобы добавить имя клиента ко всем 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потому что любой пользователь до входа в систему является гостем.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]