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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 上、不分频、不滤波输入捕获原理定时器输入捕获实验配置步骤测量按键按下时长思路…