Как лучше создать глобально доступный instance?

234
17 октября 2017, 04:16

Есть следующий класс работы с ВК (там несколько нужных API):

class UserApi implements UserApiContract
{
    private $user_id;
    private $access_token;
    private $client;
    /**
     * UserApi constructor.
     */
    public function __construct()
    {
        $this->client = new Client();
    }
    public function setUserId(string $user_id)
    {
        $this->user_id = $user_id;
    }
    public function setAccessToken(string $token)
    {
        $this->access_token = $token;
    }
}

Задача состоит в том, чтобы задать свойства access_token и user_id один раз для всего приложения. Эти данные получаются в функции Auth стороннего класса (самописная простая аутентификация через ВК, просто получается user_id и access_token, создается модель, затем делается Auth::login()). Для этих целей я пробую использовать сервис-контейнер таким образом. После получения этих параметров в процедуре Auth я кладу уже настроенные инстанс в сервис контейнер

 $res=getData();
    $vk = new UserApi();
    $vk->setAccessToken($res['access_token']);
    $vk->setUserId($res['user_id']);
    app()->instance(UserApiContract::class, $vk);

В самом классе аутентификации это инстанс доступен без всяких проблем. Но вот когда я пытаются подсунуть его контроллеру:

class DashController extends Controller
{
    private $vk;
    public function __construct(UserApiContract $vk)
    {
      $this->vk=$vk;
    }
}

То при обращении к контроллеру ловлю эксепшн: [UserApiContract] is not instantiable. Дамп сервис контейнера показывает, что ранее положенного инстанса там нет. Мне кажется, что я все же не до конца понял принцип работы IoC. Может надо вручную передавать сервис-контейнер в каждый класс? Если нет, то как лучше сделать глобально доступный инстанс с уже настроенными свойствами?

P.S. Если я делаю биндинг в сервис-провайдере, то инстанс доступен везде, но соответственно свойства user_api и access_token - null, т.к процедура аутентификации вызвается позже метода register в сервис провайдере.

READ ALSO
PHP Скрипт не запускается

PHP Скрипт не запускается

Есть код его нужно запустить по расписанию но как это сделать я не знаю, в БД и записано время старта акции - но она не стартует в чем может...

420
Получение ChatID и отправка его пользователю в Telegram-bot

Получение ChatID и отправка его пользователю в Telegram-bot

Мне нужно, чтобы после того, как пользователь начал чат с ботом, ему отправлялся его chatID

241
Почему shell_exec возвращает null?

Почему shell_exec возвращает null?

Есть Python скриптЧерез терминал все работает нормально

236