iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
Software Development

跟著官方文件學習Laravel, 並實作出一個會員登入系統系列 第 26

Day26 跟著官方文件學習Laravel-Service Provider

昨天我們說到 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~今天就研究到這邊,明天再來看生命週期。


上一篇
Day25 跟著官方文件學習Laravel-Service Container
下一篇
Day27 跟著官方文件學習Laravel-Request 生命週期
系列文
跟著官方文件學習Laravel, 並實作出一個會員登入系統30

尚未有邦友留言

立即登入留言