У меня есть приложение, встроенное в 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
Спасибо вам!