@EVOSandru6

Как хранить tenant в Saas проекте на Yii1?

Добрый день?

ЛУчше в глобале, сессии или постоянно держать в GET (при это вдобавок дополнительные правила в urlManager)

Понравился пример хранения языка как в данной статье: www.elisdn.ru/blog/39/yii-based-multilanguage-site...

Но Там используется Yii::app()->language , куда можно сохранять значение. В свойства params из config/main.php сохранять значения к сожалению нельзя.

Если не глобал и не сессия, то необходимо постоянно хранить в $_GET['tenant'] , в данном случае никуда не деться без дополнения правил, как я понял. В случае с языком, его можно было хранить в Yii::app()->language

Вот к чему пришел:

urlManager:

'urlManager' =>return
[
    'class'             =>  'DTenantUrlManager',
    'urlFormat'         =>  'path',
    'showScriptName'    =>  false,
    'rules'             =>
    [
        '/' => 'hotels/index',
        '<tenant:\d+>/<action:(login|logout|registration)>'      =>  'users/<action>',
        '<tenant:\d+>/<action:(contact)>'                        =>  'site/<action>',
        '<tenant:\d+>/<controller:\w+>/<id:\d+>'                 =>  '<controller>/view',
        '<tenant:\d+>/<controller:\w+>/<action:\w+>/<id:\d+>'    =>  '<controller>/<action>',
        '<tenant:\d+>/<controller:\w+>/<action:\w+>'             =>  '<controller>/<action>',
        '<module:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>'   =>  '<module>/<controller>/<action>/<id>',
        '<module:\w+>/<controller:\w+>/<action:\w+>'            =>  '<module>/<controller>/<action>',
    ],
]


DTenantUrlManager:

class DTenantUrlManager extends UrlManager
{
    /** Переопределение createUrl */
    public function createUrl($route, $params = [], $ampersand = '&')
    {
        $url = parent::createUrl($route, $params, $ampersand);
        return TenantHelper::addTenantToUrl($url);
    }
}


DTenantHttpRequest (определен для request в конфиге)

class DTenantHttpRequest extends CHttpRequest
{
    private $_requestUri;

    public function getRequestUri()
    {
        /** Если запрос не получен */
        if($this->_requestUri == null)
        {
            $this->_requestUri = TenantHelper::processTenantToUrl(parent::getRequestUri());
        }
    }

    /** показать оригинальный URL адрес */
    public function getOriginalUrl()
    {
        return $this->getOriginalUrl();
    }
    /** показать оригинальный URI адрес */
    public function getOriginalRequestUri()
    {
        return TenantHelper::addTenantToUri($this->getRequestUri());
    }
}



TenantHelper

/** Процесс фирмы в адресной строке */
    /** Тут затираем все лишнее и тут будут отрабатывать правила по шаблонам из UrlManager */
    public static function processTenantToUrl($url)
    {
        $domains = explode('/', ltrim($url,'/'));
         $url = '/' . implode('/',$domains);
        echo $url;
        return $url;
    }

    /** Функция добавления фирмы в налачло строки для построения url */
    public static function addTenantToUrl($url)
    {
        $domains = explode('/', ltrim($url, '/'));
        if(isset($_GET['tenant']))
            $tenant = (int)$_GET['tenant'];
        else
            $tenant = self::getDefaultTenant();
        array_unshift($domains, $tenant);
        array_unshift($domains, 'tenant');
        $url = '/' . implode('/',$domains);
        return $url;
    }

    /** Фирма по умолчанию */
    public static function getDefaultTenant()
    {
        return Yii::app()->params['tenant']['default'];
    }
    /** Получить id фирмы */
    public static function getFirmID()
    {
        // echo 'getFirmID: ' .Yii::app()->request->getParam('tenant');
        /** Если значение пришло из get */
        if(isset($_GET['tenant']))
        {
            $tenant = Yii::app()->request->getParam('tenant');
        }
        else
        {
            $tenant = $_GET[1];
        }
        return $tenant;
        /** Вывод значения из сессии */
    }


Метод getFirmID - какой то мутный( При переходе по ссылкам DTenantHttpRequest::getRequestUri выдает желаемый - /tenant/2/hotels/view/id/87 , но я не могу зацепить никакие get параметры из данной строки. ВИдимо потому, что там идут слэши вместо '?' и '&'

params:

return
[
    ...
    'tenant' =>
    [
        'default'   => 1,
    ],
    ...
]


<?php echo Yii::app()->createUrl('blog/view', ['id' => 1]); ?>


На входящей странице выдает желаемое /tenant/2/blog/view/id/1 , но открывается дефолтный экшн дефолтного контроллера.

Подскажите, что мне исправить, чтобы иметь доступ к tenant через GET или каким либо другим способом. И почему я улетаю в дефолтный экшн?
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы