composer create-project laravel/laravel laravel-sanctum-api

進(jìn)入項目目錄并啟動 Laravel 內(nèi)置服務(wù)器:

cd laravel-sanctum-api
php artisan serve

2. 配置 SQLite 數(shù)據(jù)庫

.env 文件中,將數(shù)據(jù)庫連接設(shè)置為 SQLite:

DB_CONNECTION=sqlite

創(chuàng)建 SQLite 數(shù)據(jù)庫文件:

touch database/database.sqlite

3. 創(chuàng)建產(chǎn)品模型和遷移


使用 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

4. 創(chuàng)建產(chǎn)品控制器和方法


生成產(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);
    }
}

5. 定義路由

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']);

6. 搜索功能


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']);

7. 配置 Laravel Sanctum

安裝 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;
}

8. 創(chuàng)建認(rèn)證控制器

生成認(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);
    }
}

9. 定義認(rèn)證路由

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']);
});

10. 測試 API

使用 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
}

結(jié)論

通過這個教程,你已經(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

上一篇:

微服務(wù)架構(gòu)下的API調(diào)用與整合:實現(xiàn)高效數(shù)據(jù)整合

下一篇:

SOAP Web Services API:定義、規(guī)則與消息結(jié)構(gòu)
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費