全书目录

第二十七篇:Laravel 完全指南 —— 工匠城区宇宙

第五章:Service Container —— Laravel 真正的“工具总柜 + 工人调度台”

1 分钟 419 字 第 482 / 962 个阅读单元

Laravel 的灵魂之一,是 Service Container

如果你没理解它,就会觉得 Laravel 有很多“神奇自动注入”;
理解了它,你会知道这不是魔法,而是城区的总调度系统。

可以把它想成:

text
一个巨大工具柜
+ 一个工人排班台
+ 一个依赖装配间

当 Controller、Middleware、Listener、Job 这些角色需要工具时,它不会自己乱找,而是由 Container 统一发放。

例如:

php
<?php

namespace App\Http\Controllers;

use App\Services\OrderService;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

class OrderController extends Controller
{
    public function __construct(
        private OrderService $orders,
    ) {}

    public function store(Request $request): RedirectResponse
    {
        $data = $request->validate([
            'customer_name' => ['required', 'string', 'max:50'],
            'product' => ['required', 'string', 'max:100'],
            'quantity' => ['required', 'integer', 'min:1'],
        ]);

        $order = $this->orders->create($data);

        return redirect()
            ->route('orders.index')
            ->with('status', "工单 #{$order->id} 已创建");
    }
}

这里你没有手动 new OrderService(),但它照样能工作。
原因不是“Laravel 很玄”,而是:

Controller 本身就是通过 Container 被解析出来的。

再看一个绑定接口的片段:

php
use App\Contracts\InvoiceGateway;
use App\Services\HttpInvoiceGateway;

$this->app->bind(InvoiceGateway::class, HttpInvoiceGateway::class);

这表示:

text
以后谁要 InvoiceGateway
就从工具总柜里领到 HttpInvoiceGateway

所以 Container 真正带来的,不只是“省几行 new”,而是:

  • 依赖关系集中管理
  • 具体实现可替换
  • 测试更容易注入替身
  • Controller / Listener / Job 都说同一种依赖语言

这就是 Laravel 的“手感完整”来源之一。