PHP request文件封裝

1.繼承FormRequest? ?其中id是路由傳參 name是對象中必填校驗

<?phpnamespace App\Http\Requests\Admin\User;use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;class user_info_uptRequest extends FormRequest
{public function authorize(): bool{return true;}// 在驗證前把路由參數寫入到請求數據中protected function prepareForValidation(): void{$this->merge(['id' => $this->route('id'),]);}public function rules(): array{return ['id' => ['required','integer','min:1',// 需要的話可以加 exists 約束// Rule::exists('your_table', 'id'),],// 表單參數校驗'name'   => ['required','string','min:1'],];}public function messages(): array{return ['required' => '必填','max' => '最大10'];}public function attributes(): array{return ['id'     => trans('dict.id'),'name' => trans('dict.name'),];}// 如需獲取路由 idpublic function getNodataSeq(){return $this->route('id');}
}

2.router

// routes/web.php
Route::post('/user/{id}/update', [UserController::class, 'updateOneUser']);

3.controller

<?phpnamespace App\Http\Controllers;class UserControllerextends Controllerpublic function __construct(protected UserService $service) {}public function updateOneUser(user_info_uptRequest $request){return $this->service->executeQuery($request, 'updateOneUser');}

4.service(模擬)

<?phpnamespace App\Services;use App\Http\Requests\User\user_info_uptRequest; // 按你的實際命名空間調整
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Throwable;class UserService
{/*** 統一入口:根據 action 路由到具體方法*/public function executeQuery($request, string $action){switch ($action) {case 'updateOneUser':return $this->updateOneUser($request);// 其他動作...default:abort(400, "Unknown action: {$action}");}}/*** 更新單個用戶* 期望 request 已通過 FormRequest 校驗,包含 id 與可更新字段*/public function updateOneUser(user_info_uptRequest $request){// 建議在 FormRequest 中已 merge 路由 id -> 'id'$validated = $request->validated();// 允許更新的字段(按你的業務調整)$updatable = collect($validated)->only(['name','email','phone','status',// ... 其它允許更新的列])->toArray();if (empty($validated['id'])) {abort(422, 'Missing user id.');}return DB::transaction(function () use ($validated, $updatable) {/** @var \App\Models\User $user */$user = User::query()->lockForUpdate()->findOrFail($validated['id']);// 可加業務規則:例如 email 不可重復、狀態流轉校驗等$user->fill($updatable);$user->save();// 返回標準資源return (new UserResource($user))->additional(['success' => true,'message' => 'User updated successfully.',]);});}
}

5.JsonResource

<?phpnamespace App\Http\Resources;use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;class UserResource extends JsonResource
{public static $wrap = 'data'; // 默認就是 data,可按需保留或去掉/*** @param  Request  $request*/public function toArray($request): array{return ['id'         => $this->id,'name'       => $this->name,'email'      => $this->email,'phone'      => $this->phone,'status'     => $this->status,'roles'      => $this->whenLoaded('roles', fn () => $this->roles->pluck('name')),'created_at' => optional($this->created_at)->toDateTimeString(),'updated_at' => optional($this->updated_at)->toDateTimeString(),];}
}

單條更新通常返回 UserResource?分頁多條數據?用App\Http\Resources\UserCollection?

6.?Collection

<?phpnamespace App\Http\Resources;use Illuminate\Http\Resources\Json\ResourceCollection;class UserCollection extends ResourceCollection
{public static $wrap = 'data';public function toArray($request): array{// 將每個項包裝成 UserResourcereturn ['items' => UserResource::collection($this->collection),];}public function with($request): array{// 如果是 LengthAwarePaginator,會自帶 meta/links,這里可補充自定義 metareturn ['meta' => ['total'        => method_exists($this->resource, 'total') ? $this->resource->total() : $this->collection->count(),'per_page'     => method_exists($this->resource, 'perPage') ? $this->resource->perPage() : null,'current_page' => method_exists($this->resource, 'currentPage') ? $this->resource->currentPage() : null,'last_page'    => method_exists($this->resource, 'lastPage') ? $this->resource->lastPage() : null,],'success' => true,];}
}

附件:AbstractApiBaseService

<?phpnamespace App\Services;use Exception;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;/*** 抽象 API 基礎服務類* 提供統一的增刪改查執行入口、事務處理、異常捕獲及日志功能* @author J總裁的小芒果*/
abstract class AbstractApiBaseService
{/*** 更新(增刪改)處理** @param  mixed   $request  請求對象(通常是 FormRequest)* @param  string  $method   調用的方法名* @return mixed   執行結果(通常是 Resource/Response)*/public function execute($request, $method){return $this->baseExecute($request, $method, true);}/*** 查詢處理** @param  mixed   $request  請求對象(通常是 FormRequest)* @param  string  $method   調用的方法名* @return mixed   執行結果(通常是 Resource/Response)*/public function executeQuery($request, $method){return $this->baseExecute($request, $method, false);}/*** 核心執行方法* 用于統一處理事務、調用對應的業務方法、異常捕獲及日志** @param  mixed   $request   請求對象* @param  string  $method    調用的方法名* @param  bool    $transFlg  是否啟用事務(true=啟用,用于增刪改;false=不啟用,用于查詢)* @return mixed   執行結果* @throws Exception*/private function baseExecute($request, $method, $transFlg){DB::beginTransaction();try {// 動態調用子類中對應的方法$result = $this->{$method}($request);if ($transFlg) {$statusCode = $result->getStatusCode();if ($statusCode == 200) {DB::commit();} else {DB::rollBack();}}return $result;} catch (Exception $e) {DB::rollBack();Log::debug($e);// 自定義的全局錯誤記錄方法log_error($e);throw $e;}}/*** 寫入操作日志** @param string $SBJ  日志主題* @param string $CONT 日志內容*/public function log($SBJ, $CONT){$admin = Auth::user();DB::table('LOG')->insert(['MEM_CODE' => $admin->MEM_CODE,'SBJ'      => $SBJ,'CONT'     => $CONT,'INS_DATE' => now()->format('YmdHis'),// 'ip' => Request::ip(), // 可選:記錄請求IP]);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95313.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于跨平臺的svg組件編寫一個svg編輯器

duxapp 提供了一套跨平臺的 SVG 編輯器組件&#xff0c;支持在多種環境中創建和編輯 SVG 圖形。該編輯器包含以下核心功能&#xff1a; 插入圖片繪制自由路徑添加文本創建基本形狀&#xff08;矩形、圓形、線條等&#xff09;對元素進行移動、縮放和旋轉操作 快速開始 import…

react+echarts實現圖表展示的兩種方法

前言&#xff1a;reactecharts實現圖表展示。1、直接用echarts的插件來實現1&#xff09;安裝npm install echarts2&#xff09;使用1、useEffect是react中集合onload/watch監聽等方法與一體的hook函數&#xff0c;他的第二個參數是空數組&#xff0c;則等同于onload&#xff0…

Apache 服務器基礎配置與虛擬主機部署

Apache 服務器基礎配置與虛擬主機部署 Apache 的核心定位與作用&#xff1a; Apache 的核心功能是處理 HTTP 請求并提供 Web 資源&#xff0c;是客戶端&#xff08;如瀏覽器&#xff09;與 Web 服務器之間的 “中間人”&#xff1a; 接收客戶端通過 HTTP/HTTPS 協議發送的請求…

線性代數 · 矩陣 | 最小多項式

注&#xff1a;本文為 “矩陣 | 最小多項式” 相關合輯。 略作重排&#xff0c;如有內容異常&#xff0c;請看原文。 最小多項式 橘子蜂蜜 于 2019-05-22 22:48:25 發布 根據哈密頓 - 凱萊&#xff08;Hamilton - Cayley&#xff09;定理&#xff0c;任給數域 PPP 上的一個 …

docter的使用、vscode(cursor)和docker的連接,詳細分析說明

目錄 一、基本命令 二、用案例來學習使用方法 &#x1f680; Pull Python 3.11 鏡像并創建命名容器 &#x1f4cb; 其他有用命令 在容器中安裝依賴 三、直接在鏡像中安裝依賴&#xff08;創建自己定制的鏡像&#xff09; 四、在 cursor 中選用容器作為編譯器 五、對于整…

如何使用AI大語言模型解決生活中的實際小事情?

我們總以為AI是遙不可及的未來科技&#xff0c;卻忽視了它早已成為生活中最實用的“隱形助手”。在信息爆炸的今天&#xff0c;我們每天被無數生活瑣事包圍&#xff1a;一封專業郵件反復修改措辭、孩子突如其來的數學難題、冰箱里僅剩的食材如何搭配、旅行行程的繁瑣規劃……這…

關于微信小程序的筆記

1.需要獲取demo素材圖片方法&#xff08;2,3&#xff09;2.使用逆向工具進行解包沒有安裝node的需要安裝一下安裝npm i -g wedecode0.8.0-beta.3獲取小程序文件存放路徑/Users/lin/Library/Containers/com.tencent.xinWeChat/Data/.wxapplet/packages/wx060ecb4f74eac0da根據具…

課堂筆記:吳恩達的AI課(AI FOR EVERYONE)-W2 AI項目工作流程

課堂筆記&#xff1a;吳恩達的AI課&#xff08;AI FOR EVERYONE&#xff09;-W2 AI項目工作流程 一、如何開始一個AI項目&#xff1f; 1、建設項目工作流程 2、選擇合適的AI項目 3、為這個項目收集數據和組織團隊二、AI項目的工作流程 &#xff08;1&#xff09;機器學習項目的…

逐際動力開源運控 tron1-rl-isaacgym 解讀與改進

文章目錄概覽基礎框架解讀線速度估計觀測結構仿真實驗點足式步態設計步態相位與接觸狀態建模步態接觸獎勵動作延遲我的改進Point-goal Locomotion觀測修改獎勵修改預訓練地形編碼器Sliced Wasserstein AutoEncoder模型訓練與結果參考材料概覽 這篇博客記錄了我參加逐際動力創學…

人工智能-python-機器學習-線性回歸與梯度下降:理論與實踐

文章目錄線性回歸與梯度下降&#xff1a;理論與實踐1. 引言2. 回歸分析2.1 什么是回歸&#xff1f;2.2 線性回歸2.3 損失函數2.4 多參數回歸3. 參數求解&#xff1a;最小二乘法3.1 最小二乘法 MSE3.2 最小二乘法的優缺點優點&#xff1a;缺點&#xff1a;4. 梯度下降4.1 梯度下…

前端,elment-plus組件:表格,分頁,對話框,表單

Element Plus 核心特性組件體系&#xff1a;表單、表格、彈窗、導航等高頻組件設計理念主題定制&#xff1a;Sass 變量覆蓋與暗黑模式無縫切換國際化支持&#xff1a;多語言動態切換的實現機制TypeScript 支持&#xff1a;完整的類型定義與開發友好性快速上手指南安裝與基礎配置…

【LeetCode】6. Z 字形變換

文章目錄6. Z 字形變換題目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路算法分析問題本質分析Z字形排列過程詳解Z字形排列可視化方向控制策略數學規律法詳解各種解法對比算法流程圖邊界情況處理時間復雜度分析空間復雜度分析關鍵優化點…

spring文件下載的方式

spring文件下載的方式方式一:通過ResponseEntity<Resource> 方式來下載方式二:通過ResponseEntity<StreamingResponseBody> 方式來下載方式三:通過Servlet原生下載方式四:通過ResponseEntity<byte[]> 方式來下載四種下載方式的對比1、核心特性對比2、典型場景…

寫一個redis客戶端軟件,參考 Another Redis Desktop Manager 的設計風格。

一個基于 Electron 開發的現代化 Redis 桌面客戶端&#xff0c;參考 Another Redis Desktop Manager 的設計風格。 github倉庫地址 https://github.com/henkuoai/redis-man-pc

Web3: DeFi借貸的安全基石, 了解喂價與清算機制的原理與重要性

今天我們要聊一個DeFi世界里至關重要&#xff0c;但又時常被誤解的話題&#xff1a;為什么DeFi協議需要定期更新喂價和執行清算&#xff1f; 如果大家參與過DeFi借貸&#xff0c;大家可能看到過“清算”這個詞&#xff0c;甚至會有點談虎色變。但實際上&#xff0c;清算和為其提…

「iOS」————響應者鏈與事件傳遞鏈

iOS學習響應者鏈和事件傳遞鏈傳遞鏈&#xff1a;hitTest:withEvent**pointInside:withEvent**響應鏈第一響應者和最佳響應者觸摸事件&#xff08;UITouch&#xff09;UIGestureRecognizer&#xff08;手勢識別器&#xff09;響應者鏈和事件傳遞鏈 iOS事件的主要由&#xff1a;…

修復圖像、視頻和3D場景的AI工具–Inpaint Anything

TL; DR&#xff1a;用戶可以通過單擊來選擇圖像中的任何對象。借助強大的視覺模型&#xff0c;例如SAM、LaMa和穩定擴散 (SD)&#xff0c;Inpaint Anything能夠順利地移除對象&#xff08;即Remove Anything&#xff09;。此外&#xff0c;在用戶輸入文本的提示下&#xff0c;I…

java -jar xxx.jar 提示xxx.jar中沒有主清單屬性報錯解決方案

xxx.jar 中沒有主清單屬性 &#xff08;no main manifest attribute&#xff09;解決方案 java -jar xxx.jar 提示xxx.jar中沒有主清單屬性報錯解決方案 這個錯通常出現在你用 java -jar xxx.jar 啟動&#xff0c;但 JAR 的 META-INF/MANIFEST.MF 里沒有 Main-Class 條目&#…

Myqsl建立庫表練習

目錄 一、windows中選擇一種方式安裝Mysql8.0 二、新建產品庫mydb6_product 1. 新建3張表如下&#xff1a; 1&#xff09;employees表 2&#xff09;orders表 3&#xff09;invoices表 三、新建員工庫mydb8_worker&#xff0c;添加自定義表內容并插入數據 1. 新建庫表 2. 插…

STM32 輸入捕獲,串口打印,定時器,中斷綜合運用

實驗目的 使用定時器 2 通道 2 來捕獲按鍵 2 按下時間&#xff0c;并通過串口打印。 計一個數的時間&#xff1a;1us&#xff0c;PSC71&#xff0c;ARR65535 下降沿捕獲、輸入通道 2 映射在 TI2 上、不分頻、不濾波輸入捕獲原理定時器輸入捕獲實驗配置步驟測量按鍵按下時長思路…