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