Laravel Contracts 是一組 **定義框架核心服務的介面**。每個 Contract 對應一項核心功能 (認證、快取、路由、佇列等),框架內建提供具體實作,開發者可自行替換。
| Contract | 對應服務 | Facade |
|---|---|---|
Illuminate\Contracts\Auth\Guard | 認證守衛 | Auth |
Illuminate\Contracts\Auth\PasswordBroker | 密碼重設 | Password |
Illuminate\Contracts\Cache\Repository | 快取存儲 | Cache |
Illuminate\Contracts\Cache\Factory | 快取工廠 | Cache |
Illuminate\Contracts\Config\Repository | 配置存取 | Config |
Illuminate\Contracts\Container\Container | 服務容器 | App |
Illuminate\Contracts\Cookie\Factory | Cookie 管理 | Cookie |
Illuminate\Contracts\Encryption\Encrypter | 加密解密 | Crypt |
Illuminate\Contracts\Events\Dispatcher | 事件分發 | Event |
Illuminate\Contracts\Filesystem\Factory | 檔案系統 | Storage |
Illuminate\Contracts\Hashing\Hasher | 雜湊 | Hash |
Illuminate\Contracts\Logging\Log | 日誌 | Log |
Illuminate\Contracts\Mail\Mailer | 郵件發送 | Mail |
Illuminate\Contracts\Queue\Factory | 佇列 | Queue |
Illuminate\Contracts\Routing\Registrar | 路由註冊 | Route |
Illuminate\Contracts\Translation\Translator | 翻譯 | Lang |
Illuminate\Contracts\Validation\Factory | 驗證 | Validator |
Illuminate\Contracts\View\Factory | 視圖渲染 | View |
<?php
// App\Providers\AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(
\Illuminate\Contracts\Auth\Registrar::class,
\App\Services\Registrar::class
);
}
}
<?php
// App\Services\Registrar.php
namespace App\Services;
use App\Models\User;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;
use Illuminate\Support\Facades\Validator;
class Registrar implements RegistrarContract
{
public function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
}
public function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
<?php
// App\Http\Controllers\Auth\AuthController.php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\Registrar;
class AuthController extends Controller
{
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
public function postRegister(Request $request)
{
$validator = $this->registrar->validator($request->all());
if ($validator->fails()) {
$this->throwValidationException($request, $validator);
}
$this->auth->login($this->registrar->create($request->all()));
return redirect($this->redirectPath());
}
}
<?php
namespace App\Orders;
class Repository
{
public function __construct(\SomePackage\Cache\Memcached $cache) // 綁定具體實作
{
$this->cache = $cache;
}
}
問題:換 Redis 需修改建構子、所有使用處、可能涉及多個檔案。
<?php
namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository
{
public function __construct(Cache $cache) // 綁定介面
{
$this->cache = $cache;
}
}
優勢:
| 場景 | 建議 | |
|---|---|---|
| 開發可複用套件/擴展包 | 必須 依賴 Contracts,確保使用者可替換實作 | |
| 大型專案、團隊協作 | 推薦 核心服務注入 Contracts,降低耦合 | |
| 需要替換核心驅動 (如快取換 Redis) | 必須 代碼已依賴介面,零修改遷移 | |
| 小型專案、快速原型 | 可直接使用 Facades/Helpers,務實優先 | |
| 單元測試需大量 Mock | 推薦 介面易於 Mock |
| 特性 | Contracts (介面注入) | Facades (靜態代理) |
|---|---|---|
| 耦合度 | 低 (依賴抽象) | 高 (依賴具體容器解析) |
| 可測試性 | 極佳 (輕鬆 Mock) | 需 Facade::shouldReceive() |
| 使用便利性 | 需建構子注入 | 任意處直接呼叫 |
| 效能 | 略優 (無 Facade 解析開銷) | 極微差異 |