当前位置: 首页 > backend >正文

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.xdnf.cn/news/17507.html

相关文章:

  • 小杰python高级(three day)——matplotlib库
  • ESP32 配合上位机串口打印数据
  • Python面试题及详细答案150道(41-55) -- 面向对象编程篇
  • linux安装和使用git
  • CVE-2019-0708复刻
  • SpringBoot 实现 Excel 导入导出功能的三种实现方式
  • [激光原理与应用-240]:光学器件 - 变形镜,波前校正器
  • 数据结构:树与二叉树
  • python之浅拷贝深拷贝
  • Java Selenium 自动打开浏览器保存截图
  • DevExpress ASP.NET Web Forms v25.1新版本开发环境配置要求
  • 操作系统1.5:操作系统引导
  • OpenHarmony概述与使用
  • ttyd终端工具移植到OpenHarmony
  • 大模型工程问题
  • 用vscode 里docker显示不出有容器和镜像 ?
  • [Shell编程] Shell 编程之免交互
  • 华为watch5心率变异性测量法的底层逻辑
  • Docker部署MySQL完整指南:从入门到实践
  • MyBatis插件开发与扩展:从原理到实战的完整指南
  • 阿里发布数字人模型echomimic_v3,在视频合成的基础上支持prompt输入~
  • 机器学习 - Kaggle项目实践(1)Titanic
  • 人工智能-python-机器学习- 欠拟合与过拟合:岭回归与拉索回归的应用
  • 【安全发布】微软2025年07月漏洞通告
  • SharePlay确保最佳游戏体验
  • 基恩士 CA CNX10U 视觉连接器REPEATER CA CN or CV- C 日本原装进口
  • 数字IC后端层次化Hierarchical Flow子系统Sub-System模块 block partition和pin assignment细节盘点
  • istio如何采集method、url指标
  • 飞算JavaAI vs 传统开发:效率与质量的双重突破
  • conda一键配置python开发环境