在 Laravel 7 中,如何将已注册的服务单例传递到另一个已注册服务的构造函数中?

最近在学习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')

        ],

    ]);

});

这是连接到 ElasticSearch API,目前有效:


$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 错误:在 null 上调用成员函数 request()


守着星空守着你
浏览 58回答 1
1回答

GCT1015

构造方法__construct不是__contruct。您还没有为您的ElasticSearch类定义自定义构造函数。所以该成员变量是null.附注:不要env在配置文件之外调用。env为了避免在配置文件之外进行这些调用,您可以根据需要添加配置文件或添加到当前配置文件。像 Elastic Search 凭证这样的东西可能会被添加到services.php配置文件中:<?phpreturn [&nbsp; &nbsp; ...&nbsp; &nbsp; 'elasticsearch' => [&nbsp; &nbsp; &nbsp; &nbsp; 'host' => env('ELASTICSEARCH_HOST'),&nbsp; &nbsp; &nbsp; &nbsp; 'user' => env('ELASTICSEARCH_USER'),&nbsp; &nbsp; &nbsp; &nbsp; 'password' => env('ELASTICSEARCH_PASS'),&nbsp; &nbsp; ],&nbsp; &nbsp; ...];现在您已经在配置中包含了这些值,您可以使用配置系统来提取这些值:config('services.elasticsearch'); // that whole array of valuesconfig('services.elasticsearch.host'); // just that host valueConfig::get('services.elasticsearch');app('config')->get(...);有多种方法可以访问配置系统。
打开App,查看更多内容
随时随地看视频慕课网APP