
模型压缩四剑客:量化、剪枝、蒸馏、二值化
在开始之前,确保你已经安装了 PHP 和 Composer。我们将使用 Composer 来创建一个新的 Laravel 项目。此外,为了简化数据库设置,我们将使用 SQLite,但你也可以选择其他数据库如 MySQL 或 PostgreSQL。
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