隨著 laravel 的不斷發展,service(服務)成為了 laravel 框架的一個重要組件。service 的作用是什么?在 laravel 中如何使用 service?在本文中,我們將詳細介紹 laravel service 的相關知識。
一、Service 的作用
服務是指在項目中使用的業務邏輯,比如一些跟支付、員工管理、數據分析等相關的業務邏輯。在 Laravel 框架中,Service 主要是為了處理一些繁瑣的業務邏輯,并將其封裝成一個可復用的組件,以便于在多個 Controller、Repository、Service 中被調用,提高代碼復用率,減少代碼冗余。
通常情況下,Service 和 Repository 都是為了實現數據的一系列業務操作,但是 Service 還要進一步封裝,實現業務的高度抽象和簡化。Service 接受客戶端的請求,處理業務邏輯后,返回結果或拋出異常。
不同于 Repository,Service 封裝了很多的業務邏輯,并且對于不同的業務功能,可以創建多個不同的 Service 類,以便于代碼的邏輯劃分。
二、Service 的實現方式
使用 Service 要注意兩個方面:創建 Service 類以及在需要的地方調用 Service 類。下面將用代碼進行詳細說明。
- 創建 Service
創建 Service 時,需要考慮到 Service 的功能和調用方。一般情況下,在 Service 中實現一些基礎的增刪改查操作,以及其他的一些更具體的業務邏輯。
下面以一個用戶注冊的 Service 為例,展示 Service 的常規實現方式:
<?php namespace AppServices; use AppRepositoriesUserRepository; class RegisterService { protected $userRepository; /** * RegisterService constructor. * * @param UserRepository $userRepository */ public function __construct(UserRepository $userRepository) { $this->userRepository = $userRepository; } /** * 用戶注冊. * * @param array $data * * @return mixed */ public function register(array $data) { // TODO: 進一步驗證 $this->userRepository->create($data); } }
在上述代碼中,首先命名空間 AppServices,Service 的類名為 RegisterService。構造方法中需要注入 UserRepository 對象。在 Service 中,我們實現了用戶注冊的邏輯,并且使用了 UserRepository 的 create() 方法,在數據庫中創建了一個新用戶。
- 調用 Service
Service 有了之后,還需要在 Controller、Repository 這些地方調用。下面以在 Controller 中調用 RegisterService 為例,展示調用代碼:
<?php namespace AppHttpControllers; use AppHttpRequestsRegisterRequest; use AppServicesRegisterService; class RegisterController extends Controller { public function register(RegisterRequest $request, RegisterService $registerService) { // TODO: 調用 Service 進行注冊 $registerService->register($request->validated()); } }
在上述代碼中,使用 RegisterService 時需要在其構造函數中傳入 UserRepository 對象,并且在調用時,需要在 RegisterController 的方法參數中注入 RegisterService 對象。
三、Service 中其他需要注意的問題
在 Laravel 針對 Service 的使用還需要注意以下問題:
- Service 只是一個類,可以依賴于其他 Service、Repository、或者其他 Class,使用時仍需要在構造函數中注入依賴。
- Service 需要實現具體的業務邏輯,這也就要求 Service 需要保持簡潔、輕量。如果 Service 實現的業務過于龐雜,需要考慮拆分 Service。一般建議,每個 Service 只實現單一功能的業務。
- Service 中不要包含視圖層面的邏輯處理,Service 中的邏輯應該與控制器和其他被調用的服務邏輯無關。
四、結語
Service 作為 Laravel 的重要組件之一,其作為業務邏輯組件優勢十分明顯。在 Laravel 5.8 / 6 版本之后,Laravel 官方引入了更為方便的 Service 自動注冊機制,可以更輕松地集成 Service。對于日益復雜的業務邏輯,Service 組織代碼更加清晰易懂,簡化代碼復雜度,也具有較好的可擴展性和可維護性。