首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Laravel 5 建立 Service Provider 與 Facade 完整教學

     編輯:PHP 綜合知識

Laravel 的 Service Provider 是服務容器註冊的核心,Facade 則提供靜態介面存取容器綁定的服務。本文以建立 AjaxResponse 服務為例,完整示範從 Service 類別、Provider、Facade 到設定檔註冊的全流程。

目標

在 Controller 中直接呼叫 \AjaxResponse::success() 回傳統一格式:

{ "code": 0, "message": "", "result": { ... } }

步驟 1:建立 Service 類別

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);
    }
}

步驟 2:建立 Service Provider

app/Providers/AjaxResponseServiceProvider.php

app->singleton('AjaxResponseService', function() {
            return new \App\Services\AjaxResponse();
        });
    }
}

關鍵:singleton 確保全應用共用單一實例;綁定鍵名 AjaxResponseService 供 Facade 解析。

步驟 3:建立 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']);
    }
}

原理解析

  1. 呼叫 \AjaxResponse::success() → Facade 靜態代理
  2. getFacadeAccessor() 回傳 'AjaxResponseService'
  3. 服務容器解析該綁定 → 回傳 AjaxResponse 實例
  4. 呼叫實例方法 success()

進階:自動發現 (Laravel 5.5+)

若 composer.json 設定 "extra": { "laravel": { "providers": ["App\\Providers\\AjaxResponseServiceProvider"] } },可省略 config/app.php 的 providers 註冊。

延伸閱讀

掌握 Provider + Facade 模式,能讓你將核心業務邏輯封裝為可重用、可測試、且呼叫優雅的服務元件!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved