Как передать зарегистрированный синглтон службы в другой зарегистрированный конструктор службы в Laravel 7? - PullRequest
2 голосов
/ 04 августа 2020

Недавно я узнал о AppServiceProvider. Я зарегистрировал службу в AppServiceProvider, которая создает синглтон - экземпляр клиента GuzzleHttp, например:

$this->app->singleton('GuzzleHttp\Client', function($api) {
    return new Client([
        'base_uri' =>  env('ELASTICSEARCH_HOST'),
        'auth' => [
            env('ELASTICSEARCH_USER'), 
            env('ELASTICSEARCH_PASS')
        ],
    ]);
});

Это подключается к API ElasticSearch и в настоящее время работает:

$response = app('GuzzleHttp\Client')->request('GET');

Я настроил фасад под названием ElasticSearchFacade, который содержит только getFacadeAccessor():

protected static function getFacadeAccessor()
{
    return 'elasticSearch';
}

Я также зарегистрировал elasticSearch в моем AppServiceProvider, например:

$this->app->bind('elasticSearch', function() {
    return new ElasticSearch();
});

Будет создан новый экземпляр ElasticSearch. Однако я бы хотел передать GuzzleHttp\Client в службу elasticSearch. Итак, я попытался добавить в свой файл ElasticSearch. php следующее:

use GuzzleHttp\Client;

class ElasticSearch
{
    protected $client;

    public function __contruct(Client $client)
    {
        $this->client = $client;
    }

    public function handle()
    {
        $response = $this->client->request('GET');
        die($response->getBody()->getContents());
    }
}

Теперь я изменил зарегистрированную службу, чтобы она проходила через клиент GuzzleHttp, например:

$this->app->bind('elasticSearch', function() {
    return new ElasticSearch(app('GuzzleHttp\Client'));
});

Однако я получаю сообщение об ошибке:

PHP Ошибка: вызов функции-члена request () на null

1 Ответ

2 голосов
/ 04 августа 2020

Метод конструктора __construct не __contruct. Вы не определили специальный конструктор для своего класса ElasticSearch. Таким образом, эта переменная-член имеет вид null.

Боковое примечание: не вызывайте env вне файлов конфигурации.

Чтобы избежать необходимости делать эти env вызовы вне файлов конфигурации вы можете просто добавить файлы конфигурации по мере необходимости или добавить в текущие файлы конфигурации. Что-то вроде Elasti c Учетные данные для поиска, вероятно, могут быть добавлены в файл конфигурации services.php:

<?php

return [
    ...

    'elasticsearch' => [
        'host' => env('ELASTICSEARCH_HOST'),
        'user' => env('ELASTICSEARCH_USER'),
        'password' => env('ELASTICSEARCH_PASS'),
    ],

    ...
];

Теперь, когда они у вас есть в конфигурации, вы можете использовать систему конфигурации для получения этих значений:

config('services.elasticsearch'); // that whole array of values
config('services.elasticsearch.host'); // just that host value

Config::get('services.elasticsearch');
app('config')->get(...);

Есть несколько способов доступа к системе конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...