首页 > 解决方案 > 如何在 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\ClientelasticSearch 服务。所以我尝试将以下内容添加到我的 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()

标签: phplaravellaravel-7service-provider

解决方案


构造方法__construct不是__contructElasticSearch您还没有为您的类定义自定义构造函数。所以那个成员变量是null.

旁注:不要env在配置文件之外调用。

为了避免在env配置文件之外进行这些调用,您可以根据需要添加配置文件或添加到当前配置文件中。像 Elastic Search 凭证这样的东西可能会被添加到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(...);

有多种方法可以访问配置系统。


推荐阅读