# 服务容器
Laravel 的服务容器是管理类依赖和实现依赖注入的强有力的工具。
# 零配置解决方案
如果一个类没有依赖项或只依赖于其他具体类(而不是接口),则不需要指定容器如何解析该类。它会自动解析。换个显示的方式讲,就是可以省略
new
关键字。用一种优雅的方式实现类的实例化。
如果类不依赖于任何接口,则不需要将它们绑定到容器中。不需要指示容器如何构建这些对象,因为它可以使用反射自动解析这些对象。
# 何时使用容器
首先,如果你编写了一个实现接口的类,并希望在路由或类的构造函数上键入该接口的提示,则必须告诉容器如何解析该接口。第二,如果你正在编写一个 Laravel 包,计划与其他 Laravel 开发人员共享,那么你可能需要将包的服务绑定到容器中。
# 绑定
# 简单绑定
use App\Services\Transistor;
use App\Services\PodcastParser;
use Illuminate\Contracts\Foundation\Application;
$this->app->bind(Transistor::class, function (Application $app) {
return new Transistor($app->make(PodcastParser::class));
});
# 单例绑定
singleton 方法将类或接口绑定到只应解析一次的容器中。解析单例绑定后,后续调用容器时将返回相同的对象实例
use App\Services\Transistor;
use App\Services\PodcastParser;
use Illuminate\Contracts\Foundation\Application;
$this->app->singleton(Transistor::class, function (Application $app) {
return new Transistor($app->make(PodcastParser::class));
});
# 绑定到实例
如果您正在编写一个包,并且希望将一个服务绑定到一个具体的实例,则可以使用 bind 方法。
use App\Services\Transistor;
use App\Services\PodcastParser;
use Illuminate\Contracts\Foundation\Application;
$this->app->bind(Transistor::class, new Transistor(new PodcastParser));
# 别名绑定
如果您正在编写一个包,并且希望将一个服务绑定到一个别名,则可以使用 alias 方法。
use App\Services\Transistor;
use App\Services\PodcastParser;
use Illuminate\Contracts\Foundation\Application;
$this->app->alias(Transistor::class, 'transistor');
# 绑定接口到实现
如果类依赖于接口,则可以使用 bind 方法将接口绑定到一个类。
use App\Contracts\EventPusher;
use App\Services\RedisEventPusher;
$this->app->bind(EventPusher::class, RedisEventPusher::class);
这条语句告诉容器,当类需要 EventPusher 的实例时,它应该注入 RedisEventPusher。现在我们可以在由容器解析的类的构造函数中输入 EventPusher 接口。
# 解析
use App\Services\Transistor;
use Illuminate\Support\Facades\App;
$transistor = App::make(Transistor::class);
$transistor = app(Transistor::class);