Laravel - 我的每个服务容器/自定义类都需要一个服务提供者吗?

问题描述 投票:0回答:1

服务容器/提供者的概念可能比我想象的要简单得多,但经过几个小时的阅读,我仍然完全不明白。

我在

DateFormat
中创建了一个简单的
app/Library
类。在内部为其创建别名后,我可以立即在任何控制器或刀片模板中使用它。

\config\app.php

我刚刚创建了一个服务容器吗?如果是,我还需要创建一个服务提供商吗?绑定在哪里出现? 

我真的很感激有关这个主题的一些说明。

谢谢


php laravel service dependency-injection inversion-of-control
1个回答
31
投票
Facade

结合使用。 别名只是一种使用类的便捷方法,而无需每次都导入整个命名空间类。

例如,如果您有一个类

<?php namespace App\Library; class DateFormat { public static function getDate($timestamp){ // processing the timestamp } }

,您可以在

\My\Very\Long\Class\Adapter
中为其别名:
config/app.php

现在你可以这样做:

// config/app.php <?php 'aliases' => [ // a bunch of aliases 'MyAdapter' => My\Very\Long\Class\Adapter::class, ]

而不是:

<?php new MyAdapter(); ...

当您想要解决依赖关系时,通常会使用服务提供者,最常见的是通过注入。当您要解析的类需要将参数传递到构造函数中或每次都具有通用设置时,这会很有帮助。您可以在提供程序中执行所有设置。

这是一个场景:

您有一个想要与之交互的 API。我们将其称为 SuperApi。 SuperAPI 的文档说要创建 SuperApi 类的实例,您必须执行以下操作:

<?php use My\Very\Long\Class\Adapter; ... new Adapter(); ...

现在,每次您想要创建此实例时,您都必须执行相同的设置(或将其抽象为某个类,但事实仍然是您需要将 
<?php // Some method (a controller or something) public function index() { $superApi = new \SuperApi\Connector($key, $secret); return $superApi->getCustomers(); }

$key
传递给构造函数)。
如果你要为这个 

$secret

类创建一个别名,也许会是:

Connector

因此,使用该别名,您现在可以执行以下操作:

// config/app.php <?php 'aliases' => [ // a bunch of aliases 'SuperApi' => SuperApi\Connector::class, ]

但是你看,即使有了别名,你仍然需要传递 
<?php // Some method (a controller or something) public function index() { $superApi = new SuperApi($key, $secret); return $superApi->getCustomers(); }

$key
这是服务提供商可以提供帮助的地方。

$secret

看到您在提供程序 (
// app/Providers/SuperApiProvider.php <?php namespace App\Providers; use SuperApi\Connector; use Illuminate\Support\ServiceProvider; class SuperApiProvider extends ServiceProvider { /** * Register bindings in the container. * * @return void */ public function register() { $this->app->bind('superApiConnector', function ($app) { return new ApiConnector($app['config']->get('super-api.key'), $app['config']->get('super-api.secret')); }); } } // app/Providers/SuperApi.php (the Facade) <?php namespace App\Providers; use Illuminate\Support\Facades\Facade; class SuperApi extends Facade { protected static function getFacadeAccessor() { return 'superApiConnector'; } } // config/super-api.config <?php return [ 'key' => env('SUPER_API_KEY'), 'secret' => env('SUPER_API_SECRET'), ]; // config/app.php <?php 'providers' => [ // a bunch of providers App\Providers\SuperApiProvider::class, ]

) 中绑定的字符串与您从外观返回的字符串相同,并且外观的类名是您实际调用绑定类的方式,在本例中为

'superApiConnector'
现在,当你想使用 

SuperApi

类时,你可以这样做:

SuperApi\Connector

正如我上面所说,提供者真正派上用场的是当你想要注入它并让 
Laravel 的 IoC Container

自动解析注入的类时: <?php // Some method (a controller or something) public function index() { return SuperApi::getCustomers(); }

需要明确的是,您不需要服务提供商来利用依赖项注入。只要该类可以被应用程序解析,就可以注入。这意味着您注入的类的构造函数所采用的任何参数也需要是可自动解析的。

© www.soinside.com 2019 - 2024. All rights reserved.