Laravel 的灵魂之一,是 Service Container。
如果你没理解它,就会觉得 Laravel 有很多“神奇自动注入”;
理解了它,你会知道这不是魔法,而是城区的总调度系统。
可以把它想成:
一个巨大工具柜
+ 一个工人排班台
+ 一个依赖装配间当 Controller、Middleware、Listener、Job 这些角色需要工具时,它不会自己乱找,而是由 Container 统一发放。
例如:
<?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 被解析出来的。
再看一个绑定接口的片段:
use App\Contracts\InvoiceGateway;
use App\Services\HttpInvoiceGateway;
$this->app->bind(InvoiceGateway::class, HttpInvoiceGateway::class);这表示:
以后谁要 InvoiceGateway
就从工具总柜里领到 HttpInvoiceGateway所以 Container 真正带来的,不只是“省几行 new”,而是:
- 依赖关系集中管理
- 具体实现可替换
- 测试更容易注入替身
- Controller / Listener / Job 都说同一种依赖语言
这就是 Laravel 的“手感完整”来源之一。