st779779

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

laravel11 api

视频地址 https://www.youtube.com/watch?v=LmMJB3STuU4&list=PL38wFHH4qYZUXLba1gx1l5r_qqMoVZmKM&index=1&t=88s

🌐 Laravel Sanctum docs: https://laravel.com/docs/11.x/sanctum
🌐 Postman: https://www.postman.com/

安装

在一个laravel空白项目下执行以下命令

需要确认运行迁移文件

php artisan install:api

创建对应的模型

php artisan make:model Post -a --api

代码

配置和 请求注意事项

在user模型里面配置 HasApiTokens

use Laravel\Sanctum\HasApiTokens;
 
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}

生成token

通过获取登录的用户来生成token $request->token_name可以使用用户名

use Illuminate\Http\Request;
 
Route::post('/tokens/create', function (Request $request) {
    // 创建token
    $token = $request->user()->createToken($request->token_name);
    // 返回token
    return ['token' => $token->plainTextToken];
});

校验token权限

通过 ->middleware('auth:sanctum') 这个中间件来判断用户是否登录

Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');

请求注意事项

请求 头 必填

Accept:application/json

token 携带这个请求头

Authorization: Bearer 返回的token

Authorization: Bearer 5|G67mEBWeBi8cjZUC9TvwAr2jOTr1xKb4YwVhY15N1489b476

修改迁移文件

posts迁移文件

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    // 添加一个外键约束 设置级联删除
   $table->foreignId('user_id')->constrained()->cascadeOnDelete();
    $table->string('title');
    $table->text('body');
    $table->timestamps();
});

执行命令 覆盖模式
php artisan migrate:fresh

修改模型

post模型

public function user(){
    return $this->belongsTo(User::class);
}

user模型

    public function posts(){
        return $this->hasMany(Post::class);
    }

路由 api

在api文件写的路由默认要添加 api 前缀

例如 api/login

<?php
use App\Http\Controllers\AuthController;
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

// Route::get('/user', function (Request $request) {
//     return $request->user();
// })->middleware('auth:sanctum');

// api资源路由
Route::apiResource('posts', PostController::class);
// 注册
Route::post('/register', [AuthController::class, 'register']);
// 登录
Route::post('/login', [AuthController::class, 'login']);
// 注销
// 添加对应的中间件 只有通过登录的用户才能访问
Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');

控制器 PostController

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Support\Facades\Gate;
use Illuminate\Routing\Controllers\Middleware;
use Illuminate\Http\Request;
use Illuminate\Routing\Controllers\HasMiddleware;

class PostController extends Controller implements HasMiddleware
{

    public static function middleware()
    {
        return [
            new Middleware('auth:sanctum', except: ['index', 'show']),
        ];
    }

    /**
     * 显示资源列表。
     */
    public function index()
    {
        return Post::all();
    }

    /**
     * 将新创建的资源存储在存储器中。
     */
    public function store(Request $request)
    {
        $fields = $request->validate([
            'title' => 'required|max:255',
            'body' => 'required'
        ]);
        $post = $request->user()->posts()->create($fields);
        return   $post;
    }

    /**
     * 显示指定的资源。
     */
    public function show(Post $post)
    {
        return  $post;
    }

    /**
     * 更新存储中的指定资源。
     */
    public function update(Request $request, Post $post)
    {
        // 用户会自动传入 我们只需要传入post
        Gate::authorize('modify', $post);

        $fields = $request->validate([
            'title' => 'required|max:255',
            'body' => 'required'
        ]);
        $post->update($fields);
        return   $post;
    }

    /**
     * 从存储中删除指定的资源。
     */
    public function destroy(Post $post)
    {
        // 用户会自动传入 我们只需要传入post
        Gate::authorize('modify', $post);
        $post->delete();
        return ['msg' => '请求成功'];
    }
}

控制器 authController

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
 
class AuthController extends Controller
{
    // 注册
    public function register(Request $request)
    {
        $fields = $request->validate([
            'name' => 'required|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed'
        ]);
        $user = User::create($fields);

        // 创建token
        $token = $user->createToken($request->name);
        // 返回token
        return [
            'user' => $user,
            'token' => $token->plainTextToken
        ];
    }
    // 退出登录
    public function login(Request $request)
    {
        // 校验的时候已经获取到 数据库存在对应的 email
        $request->validate([
            'email' => 'required|email|exists:users',
            'password' => 'required'
        ]);
        // 获取用户
        $user = User::where('email', $request->email)->first();

        // 如果用户不存在 或者没有通过hash密码校验
        if (!$user ||  !Hash::check($request->password, $user->password)) {
            return [
                'message' => '用户名或者密码不正确'
            ];
        }
        // 通过校验
        // 生成新的token

        $token = $user->createToken($user->name);

        return [
            'user' => $user,
            'token' => $token->plainTextToken
        ];
    }
    // 注销
    public function logout(Request $request)
    {
        $request->user()->tokens()->delete();

        return [
            'msg' => '退出登录',
        ];
    }
}

策略

PostPolicy.php

<?php

namespace App\Policies;

use App\Models\Post;
use App\Models\User;
use Illuminate\Auth\Access\Response;

class PostPolicy
{

    /**
     * 确定用户是否可以永久删除模型。
     */
    public function modify(User $user, Post $post): Response
    {
        return $user->id === $post->user_id ?
            // 运行通过
            Response::allow() :
            // 直接返回错误
            Response::deny('这个帖子不是你的');
    }
}

在vue中使用

项目地址点击这里

创建vue项目

npm create vue@latest

进入创建的项目 安装依赖

npm i

运行

npm run dev

打包

npm run build

alt text

posted on 2024-08-28 17:13  xirang熙攘  阅读(6)  评论(0编辑  收藏  举报