首页 > 解决方案 > 我有一个想法使用 auth 中间件来检索用户的产品

问题描述

我有一个想法使用 auth 中间件来检索用户的产品,但目前我无法检索该用户的产品。相反,它列出了其他用户的所有产品。你们能给我一些想法来帮助我完成它。谢谢 !!!

在此处输入图像描述

这是我的 ProjectController 代码:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Http\Resources\ProjectResource;
use App\Models\Project;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ProjectController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $projects = Project::all();

        return response([
            'projects' => ProjectResource::collection($projects),
            'message' => 'Retrieved successfully'
        ], 200);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $data = $request->all();

        $validator = Validator::make($data, [
            // 'uuid' => 'required|unique:projects',
            'user_id' => 'required',
            'name' => 'required|max:255',
            'status' => 'required',
        ]);

        if ($validator->fails()) {
            return response(['error' => $validator->errors(), 'Validation Error']);
        }

        $projects = Project::create($data);

        return response(['projects' => new ProjectResource($projects), 'message' => 'Created successfully'], 201);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(Project $project)
    {
        return response(['project' => new ProjectResource($project), 'message' => 'Retrieved successfully'], 200);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Project $project)
    {
        $project->update($request->all());

        return response(['project' => new ProjectResource($project), 'message' => 'Update successfully'], 200);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Project $project)
    {
        $project->delete();

        return response(['message' => 'Deleted'], 204);
    }
}

这是我的 ProjectModel 代码:

<?php

namespace App\Models;

use App\Enums\ProjectStatus;
use App\Http\Traits\Uuid;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Project extends Model
{
    use HasFactory;
    use Uuid;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'status',
        'user_id',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'id',
        'uuid',
    ];

    protected $cast = [
        'status' => ProjectStatus::class
    ];

    public function setUuidAttribute()
    {
        $this->attributes['uuid'] = Str::uuid();
    }
}

这是我的 API 路由器代码: 在此处输入图像描述

标签: laravelmiddlewarelaravel-middleware

解决方案


您必须先检索用户才能过滤产品。有多种方法可以做到这一点。这是 Laravel 关于该主题的文档的链接:https ://laravel.com/docs/8.x/authentication#retrieving-the-authenticated-user

您还必须过滤您的查询(您的查询是Project::all()),以便它只为用户检索产品。这是一些与此相关的 Laravel 文档的链接:https ://laravel.com/docs/8.x/eloquent#retrieving-models

最后,用这个替换$projects = Project::all();$projects = Project::where('user_id', auth()->user()->id);应该可以解决问题。


推荐阅读