微信截圖_17413321624196.png)
DeepSeek R1 × 飛書多維表格賦能教育領(lǐng)域
composer create-project laravel/laravel laravel-sanctum-api
進(jìn)入項目目錄并啟動 Laravel 內(nèi)置服務(wù)器:
cd laravel-sanctum-api
php artisan serve
在 .env
文件中,將數(shù)據(jù)庫連接設(shè)置為 SQLite:
DB_CONNECTION=sqlite
創(chuàng)建 SQLite 數(shù)據(jù)庫文件:
touch database/database.sqlite
使用 Artisan 命令創(chuàng)建產(chǎn)品模型和遷移文件:
php artisan make:model Product --migration
在 database/migrations
目錄中找到新創(chuàng)建的遷移文件,編輯其 up
方法以定義產(chǎn)品表的結(jié)構(gòu):
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->nullable();
$table->text('description')->nullable();
$table->decimal('price', 5, 2);
$table->timestamps();
});
}
運行遷移以創(chuàng)建數(shù)據(jù)庫表:
php artisan migrate
生成產(chǎn)品控制器:
php artisan make:controller ProductController --api
在 app/Http/Controllers/ProductController.php
中定義 CRUD 方法:
use App\Models\Product;
class ProductController extends Controller
{
public function index()
{
return Product::all();
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string',
'slug' => 'required|string',
'description' => 'nullable|string',
'price' => 'required|numeric',
]);
return Product::create($validated);
}
public function show($id)
{
return Product::findOrFail($id);
}
public function update(Request $request, $id)
{
$product = Product::findOrFail($id);
$product->update($request->all());
return $product;
}
public function destroy($id)
{
return Product::destroy($id);
}
}
在 routes/api.php
中定義 API 路由:
use App\Http\Controllers\ProductController;
Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Route::put('/products/{id}', [ProductController::class, 'update']);
Route::delete('/products/{id}', [ProductController::class, 'destroy']);
在 ProductController
中添加搜索方法,并在 routes/api.php
中定義相應(yīng)的路由:
public function search(Request $request)
{
$query = $request->input('name');
return Product::where('name', 'like', "%{$query}%")->get();
}
Route::get('/products/search', [ProductController::class, 'search']);
安裝 Laravel Sanctum:
composer require laravel/sanctum
發(fā)布 Sanctum 配置和遷移文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" --tag="sanctum"
運行遷移以創(chuàng)建令牌表:
php artisan migrate
在 app/Http/Kernel.php
中添加 Sanctum 中間件:
protected $middlewareGroups = [
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Session\Middleware\StartSession::class,
// ...
],
];
在 app/Models/User.php
中添加 HasApiTokens
trait:
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
生成認(rèn)證控制器:
php artisan make:controller AuthController
在 app/Http/Controllers/AuthController.php
中實現(xiàn)注冊、登錄和登出功能:
use App\Models\User;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function register(Request $request)
{
$fields = $request->validate([
'name' => 'required|string',
'email' => 'required|string|unique:users,email',
'password' => 'required|string|confirmed',
]);
$user = User::create([
'name' => $fields['name'],
'email' => $fields['email'],
'password' => bcrypt($fields['password'])
]);
$token = $user->createToken('myapptoken')->plainTextToken;
return response([
'user' => $user,
'token' => $token
], 201);
}
public function login(Request $request)
{
$fields = $request->validate([
'email' => 'required|string',
'password' => 'required|string'
]);
$user = User::where('email', $fields['email'])->first();
if (!$user || !Hash::check($fields['password'], $user->password)) {
return response([
'message' => 'Bad credentials'
], 401);
}
$token = $user->createToken('myapptoken')->plainTextToken;
return response([
'user' => $user,
'token' => $token
], 200);
}
public function logout(Request $request)
{
$request->user()->tokens()->delete();
return response([
'message' => 'Logged out'
], 200);
}
}
在 routes/api.php
中定義認(rèn)證路由:
use App\Http\Controllers\AuthController;
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->group(function () {
Route::post('/logout', [AuthController::class, 'logout']);
Route::post('/products', [ProductController::class, 'store']);
Route::put('/products/{id}', [ProductController::class, 'update']);
Route::delete('/products/{id}', [ProductController::class, 'destroy']);
});
使用 Postman 或其他 HTTP 客戶端測試你的 API。首先注冊一個新用戶并獲取訪問令牌:
POST http://localhost:8000/api/register
Content-Type: application/json
{
"name": "Brad",
"email": "brad@gmail.com",
"password": "123456",
"password_confirmation": "123456"
}
使用訪問令牌進(jìn)行認(rèn)證請求:
POST http://localhost:8000/api/products
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"name": "Test Product",
"slug": "test-product",
"description": "This is a test product",
"price": 99.99
}
通過這個教程,你已經(jīng)成功創(chuàng)建了一個帶有認(rèn)證的 RESTful API。你可以使用這個 API 來管理產(chǎn)品數(shù)據(jù),并通過 Sanctum 實現(xiàn)基于令牌的認(rèn)證。Laravel 的強大功能和 Sanctum 的簡潔性使得這個過程變得非常高效。
原文引自YouTube視頻:https://www.youtube.com/watch?v=MT-GJQIY3EU