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
        ]);
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐