Laravel 6 - Глобальная переменная по ссылке - PullRequest
0 голосов
/ 01 мая 2020

У меня есть приложение, встроенное в Laravel 6. Эти приложения взаимодействуют с экземпляром VTiger CRM через API.

Я создал модель ApiClient, вот конструктор:

function __construct() {
        $this->endpointUrl=env("VTIGER_WS_URL");
        $this->userName=env("VTIGER_WS_USER");
        $this->userKey= env("VTIGER_WS_KEY");
        $this->token=env("VTIGER_WS_KEY");

        if (!$this->login()) {
            echo $this->errorMsg;
        }
    }

Метод входа в систему - это указатель на конечную точку API, который возвращает мне sessionName, sessionId и ключ. После этого я могу звонить в API и передавать эту информацию для авторизации.

Я использую шаблон Service / Repository для связи с VTiger, поэтому я создал несколько сервисов в своем приложении. Все они расширяют BaseServiceProvider, который:

class BaseServiceProvider
{
    protected $apiClient;

    public function __construct()
    {
        $this->apiClient= new ApiClient();
    }
}

Все работало нормально до тех пор, пока не заметил, что что-то не получилось при входе в систему через API. Вот пример одного из моих контроллеров:

  class DemoController extends Controller

     protected $modelAService;
        protected $modelBService;
        protected $modelCService;
        protected $modelDService;       
        protected $modelEService;

        public function __construct(IModelAService $modelAService, IModelBService $modelBService, 
                                   IModelCService $modelCService, IModelDService $modelDService, 
                                   IModelEService $modelEService)
        {
            $this->modelAService= $modelAService;
            $this->modelBService= $modelBService;
            $this->modelCService= $modelCService;
            $this->modelDService= $modelDService;
            $this->modelEService= $modelEService;

        }

Поэтому я внедряю все необходимые мне услуги во все мои контроллеры. Поэтому, когда мне нужен сервис, я могу сделать: $model = $this->modelAService->get($id); и т. Д.

А в моем сервисе я делаю:

public function get($id){
    $returnValue = $this->apiClient()->whateverFunctionimplentedForModelA($id);
}

Проблема заключается в том, что каждый мой сервис создает новая переменная ApiClient ().

Так что, если в моем контроллере у меня есть такая функция:

public function foo(Request $request) {
   $bar = $this->modelAService->whateverfunction($whateverParameter);
   $baz = $this->modelBService->whateverfunction($whateverParameter);
   $boo = $this->modelCService->whateverfunction($whateverParameter);
   $far = $this->modelDService->whateverfunction($whateverParameter);
   return whatever !!!
}

Когда я нажму эту функцию, будет создано 4 модели ApiClient (), 4 войдите в Vtiger API.

Чего я хочу добиться, так это единственной переменной spi 1 ApiClient (), которая создается в моем BaseServiceProvider, и затем каждый раз, когда службе требуется запрашивать информацию в API Vtiger, служба будет обращаться к ApiClient с помощью ссылка вместо создания нового каждый раз

Я знаю, что могу добиться этого с чистым php, как этот пример, который я использовал в прошлом с подключением к базе данных:

$dbConn = new mysql_connection();

    public function getData()
    {
        $this->dbConn->select(blabla...);
    }

    public function getDataFoo()
    {
        $this->dbConn->select(blabla...);
    }

    public function getDataBar()
    {
        $this->dbConn->select(blabla...);
    }

Я не знаю, насколько это понятно, но все, что я хочу, это чтобы все мои сервисы использовали только 1 переменную. Я не совсем уверен, смогу ли я сделать это с помощью Laravel

Спасибо вам!

...