Laravel 的 Service Provider 是服務容器註冊的核心,Facade 則提供靜態介面存取容器綁定的服務。本文以建立 AjaxResponse 服務為例,完整示範從 Service 類別、Provider、Facade 到設定檔註冊的全流程。
在 Controller 中直接呼叫 \AjaxResponse::success() 回傳統一格式:
{ "code": 0, "message": "", "result": { ... } }
app/Services/AjaxResponse.php
$code, 'message' => $message];
if ($data !== null) $out['result'] = $data;
return response()->json($out);
}
public function success($data = null) {
return $this->ajaxResponse(0, '', $data);
}
public function fail(string $message, array $extra = []) {
return $this->ajaxResponse(1, $message, $extra);
}
}
app/Providers/AjaxResponseServiceProvider.php
app->singleton('AjaxResponseService', function() {
return new \App\Services\AjaxResponse();
});
}
}
關鍵:singleton 確保全應用共用單一實例;綁定鍵名 AjaxResponseService 供 Facade 解析。
app/Facades/AjaxResponseFacade.php
步驟 4:註冊到設定檔
編輯
config/app.php:'providers' => [ // ... App\Providers\AjaxResponseServiceProvider::class, ], 'aliases' => [ // ... 'AjaxResponse' => App\Facades\AjaxResponseFacade::class, ],步驟 5:在 Controller 中使用
namespace App\Http\Controllers; class MechanicController extends Controller { public function getIndex() { return \AjaxResponse::success(['mechanic_id' => 123, 'name' => 'John']); } }原理解析
- 呼叫
\AjaxResponse::success()→ Facade 靜態代理getFacadeAccessor()回傳'AjaxResponseService'- 服務容器解析該綁定 → 回傳
AjaxResponse實例- 呼叫實例方法
success()進階:自動發現 (Laravel 5.5+)
若
composer.json設定"extra": { "laravel": { "providers": ["App\\Providers\\AjaxResponseServiceProvider"] } },可省略config/app.php的 providers 註冊。延伸閱讀
掌握 Provider + Facade 模式,能讓你將核心業務邏輯封裝為可重用、可測試、且呼叫優雅的服務元件!