iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
Modern Web

Laravel 30天速成筆記系列 第 17

【Day17】Service Container 與依賴注入(DI)

  • 分享至 

  • xImage
  •  

今天要來理解 Laravel 的「靈魂」之一:
Service Container(服務容器)依賴注入(Dependency Injection, DI)


什麼是 Service Container?

想像你在玩積木:

  • 每個積木是「一個功能」或「一個物件」
  • 服務容器就是「積木收納盒」,幫你保管、拿取、組合需要的積木

在 Laravel 中,Service Container 主要用來:

  1. 綁定(Binding):先告訴容器「某個功能對應哪個類別或物件」
  2. 解析(Resolving):當需要用到時,容器會自動幫你建立物件

沒有 Service Container 會怎樣?

假設我們有一個 PaymentService 負責處理付款:

class PaymentService {
    public function pay($amount) {
        return "已付款 {$amount} 元";
    }
}

如果沒有 Service Container,我們可能會在控制器裡這樣:

$payment = new PaymentService();
echo $payment->pay(100);

問題是,如果有很多地方都用到 PaymentService,而且未來要換成 StripePaymentService,就得全部手動改,很麻煩


使用 Service Container 綁定與解析

綁定

AppServiceProviderregister() 方法中:

public function register()
{
    $this->app->bind(PaymentService::class, function ($app) {
        return new PaymentService();
    });
}

解析(自動注入)

在控制器:

use App\Services\PaymentService;

class OrderController extends Controller
{
    public function checkout(PaymentService $payment)
    {
        return $payment->pay(200);
    }
}

Laravel 會看到 PaymentService $payment,自動去容器找並建立實例


依賴注入(DI)是什麼?

依賴注入 = 物件不自己建立所依賴的類別,而是「外面幫它準備好再傳進去」

好處:

  1. 降低耦合度 → 容易更換實作
  2. 方便測試 → 可注入假的版本(mock)
  3. 更乾淨的程式碼 → 不需要到處 new

範例:切換付款系統

假設有兩個付款系統:

interface PaymentInterface {
    public function pay($amount);
}

class PaypalPayment implements PaymentInterface {
    public function pay($amount) {
        return "用 PayPal 付款 {$amount} 元";
    }
}

class StripePayment implements PaymentInterface {
    public function pay($amount) {
        return "用 Stripe 付款 {$amount} 元";
    }
}

在 Service Provider 中綁定:

$this->app->bind(PaymentInterface::class, StripePayment::class);

控制器:

public function checkout(PaymentInterface $payment)
{
    return $payment->pay(300);
}

只要修改 Service Provider 的綁定,就能瞬間換付款系統,控制器不需要改


小結

  • Service Container = Laravel 管理物件與依賴的工具箱

  • 依賴注入(DI) = 不自己建立依賴物件,而是外部傳入

  • 好處:

    • 降低耦合
    • 提高可測試性
    • 更靈活的程式架構

上一篇
【Day16】API 驗證與 Laravel Sanctum
系列文
Laravel 30天速成筆記17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言