
DeepSeek R1 × 飛書多維表格賦能教育領域
composer create-project laravel/laravel laravel-sanctum-api
進入項目目錄并啟動 Laravel 內置服務器:
cd laravel-sanctum-api
php artisan serve
在 .env
文件中,將數據庫連接設置為 SQLite:
DB_CONNECTION=sqlite
創建 SQLite 數據庫文件:
touch database/database.sqlite
使用 Artisan 命令創建產品模型和遷移文件:
php artisan make:model Product --migration
在 database/migrations
目錄中找到新創建的遷移文件,編輯其 up
方法以定義產品表的結構:
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();
});
}
運行遷移以創建數據庫表:
php artisan migrate
生成產品控制器:
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
中定義相應的路由:
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
發布 Sanctum 配置和遷移文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" --tag="sanctum"
運行遷移以創建令牌表:
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;
}
生成認證控制器:
php artisan make:controller AuthController
在 app/Http/Controllers/AuthController.php
中實現注冊、登錄和登出功能:
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
中定義認證路由:
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"
}
使用訪問令牌進行認證請求:
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
}
通過這個教程,你已經成功創建了一個帶有認證的 RESTful API。你可以使用這個 API 來管理產品數據,并通過 Sanctum 實現基于令牌的認證。Laravel 的強大功能和 Sanctum 的簡潔性使得這個過程變得非常高效。
原文引自YouTube視頻:https://www.youtube.com/watch?v=MT-GJQIY3EU