PHP request文件封装
·
1.继承FormRequest 其中id是路由传参 name是对象中必填校验
<?php
namespace 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'),
];
}
// 如需获取路由 id
public function getNodataSeq()
{
return $this->route('id');
}
}
2.router
// routes/web.php
Route::post('/user/{id}/update', [UserController::class, 'updateOneUser']);
3.controller
<?php
namespace App\Http\Controllers;
class UserControllerextends Controller
public function __construct(
protected UserService $service
) {}
public function updateOneUser(user_info_uptRequest $request)
{
return $this->service->executeQuery($request, 'updateOneUser');
}
4.service(模拟)
<?php
namespace 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
<?php
namespace 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
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
public static $wrap = 'data';
public function toArray($request): array
{
// 将每个项包装成 UserResource
return [
'items' => UserResource::collection($this->collection),
];
}
public function with($request): array
{
// 如果是 LengthAwarePaginator,会自带 meta/links,这里可补充自定义 meta
return [
'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
<?php
namespace 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
]);
}
}
更多推荐
所有评论(0)