昨天我们说到 Service Container 是一个地方绑定你类别如何产生出来,或者是你想将 interface 绑定某个 class 来作出实例,我们需要一个地方来描述这个实例过程,我们可以打开 config/app.php 这个档案,里面有一个 providers 的 Array,里面存放 laravel 提供的 Service Provider,今天我们也可以自己定义一个 Service Provider。
我们就借用上篇文章定义的 Animal 来试试看。
我们创建一个Service Provider
php artisan make:provider AnimalServiceProvider
好接着打开 AnimalServiceProvider.php 我们要修改 register 这个方法
public function register()
{
$this->app->bind(Animal::class, function () {
return new Dog();
});
}
然後将 AnimalServiceProvider 放到config/app.php 的 providers 里
App\Providers\AnimalServiceProvider::class,
接着试着使用它,创建一个 command 来试试
php artisan make:command Animals
修改 $signature 为 animal,并改写handle
public function handle(Animal $animal)
{
dd($animal->say());
return 0;
}
印出来会看到,汪汪,若要改成用Cat实作呢,我们可以改一下 Service Provider 的 register 试试看
public function register()
{
$this->app->bind(Animal::class, function () {
return new Cat();
});
}
再次执行後会是 喵~
也可以使用 singleton 来绑定
public function register()
{
$this->app->singleton(Animal::class, function () {
return new Cat();
});
}
若你希望你的 Provider 不要一开始就注册到Container,想等到需要用实在注册的话,可以实作 DeferrableProvider,这样他在需要时,才会进行注册
<?php
namespace App\Providers;
use App\Animal\Cat;
use App\Animal\Animal;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Support\DeferrableProvider;
class AnimalServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(Animal::class, function () {
return new Cat();
});
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
OK~今天就研究到这边,明天再来看生命周期。
>>: 网页动起来-30天学会HTML+CSS,制作精美网站
铁人赛的前20天,把常常混淆的那些观念重新理解过一遍之後,後面的10天打算来练习切版,希望透过实际练...
前3篇回顾 awk - 简介 Linux 制表好工具 awk-2 Regex搭配浅谈 awk-3 运...
接下来的两篇文章,会结合前面 GitHub Action 所学,实作持续整合与持续布署两个部分。因为...
Step 1: 蒐集数据 要先将自己需要的数据下载好,并且确认资料格式而去做不同的处理 Step ...
日子来到了第二天,我们先去 tableau public 的官网看看吧! 注册帐号跟下载程序这两件事...