如何让服务提供者或特征将 Algolia 集成到我的 Laravel 的控制器中?

How do I make a service provider or trait to integrate Algolia in my Laravel's controllers?

我正在使用 Algolia search client PHP for Laravel 我想在没有 Laravel Scout 的情况下使用它。

现在我必须在每个需要使用 Algolia 的控制器中执行此操作:

$client = new \AlgoliaSearch\Client('xxx', 'xxx');

$index = $client->initIndex('index');

$index->doSomeAlgoliaFunction();

我怎样才能把它变成一个服务提供者,这样我就不必在每次需要时都初始化 Algolia?

您可以在您的基本控制器中执行此操作

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    protected $client;
    public function __contruct(){
       $this->client =  new \AlgoliaSearch\Client('xxx', 'xxx');
    }

}

现在您可以在控制器中使用

$index = $this->client->initIndex('index');

$index->doSomeAlgoliaFunction();

希望对您有所帮助。

我建议您将其绑定到容器。在您的 App\Providers\AppServiceProvider 中,在 register 方法中:

namespace App\Providers;

use AlgoliaSearch\Client;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(Client::class, function () {
            return new Client('xxx', 'xxx');
        });
    }
}

然后,如果您在控制器中需要它,例如,您可以在构造函数中对其进行类型提示,Laravel 将自动传递客户端实例。

use AlgoliaSearch\Client;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    protected $client;

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

}

如果其他地方需要,可以使用app()辅助函数从容器中获取。

use AlgoliaSearch\Client;

class Something
{

    public function doMagic()
    {
        $algoliaIndex = app(Client::class)->initIndex('my_index_name');

        $algoliaIndex->addObject(....);
    }

}

注意config()env() 获取凭据,避免提交您的 ADMIN api 密钥。