如何在 Laravel 11 中创建和使用枚举
Laravel 11 带来了一个更为精简的应用程序骨架。Laravel 11 引入了简化后的应用程序结构、按秒速率限制、健康路由等功能。
枚举(enum),即“列举”的缩写,是编程中的一种数据类型,它由一组命名值组成,这些值通常被称为成员或元素。枚举允许开发人员定义一系列相关的常量,从而使代码更易读和维护。枚举的每个成员通常代表一个唯一的值,并且可以用作整数的替代品来提高代码清晰度。枚举常用于表示诸如一周中的几天、月份或程序中的状态类型等。
Laravel 11 添加了一个新的 Artisan 命令来创建枚举。在下面的例子中,我们将创建一个 "ProductStatus" 枚举。我们将定义 Pending(待处理)、Active(激活)、Inactive(未激活)和 Rejected(拒绝)这几种状态。然后,我们将使用枚举属性转换与 Laravel 模型一起工作。
第一步:创建项目
$ laravel new demo-enums
第二步:创建迁移
$ php artisan make:migration create_products_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('产品名称');
$table->text('body')->comment('产品描述');
$table->string('status')->default('pending')->comment('产品状态');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('products');
}
};
执行迁移
$ php artisan migrate
第三步:创建枚举
$ php artisan make:enum Enums/ProductStatus
编写枚举状态:app/Enums/ProductStatus.php
<?php
namespace App\Enums;
enum ProductStatus: string
{
case Pending = 'pending';
case Active = 'active';
case Inactive = 'inactive';
case Rejected = 'rejected';
}
第四步:创建模型
$ php artisan make:model Product
编写模型:app/Models/Product.php
<?php
namespace App\Models;
use App\Enums\ProductStatus;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'body', 'status'];
/**
* 定义属性到枚举类型的转换规则。
*
* 这个方法重写了父类 Eloquent 模型中的 casts 属性,
* 将 'status' 字段的值自动转换为 ProductStatus 枚举类型。
*
* @return array
*/
protected function casts(): array
{
return [
'status' => ProductStatus::class,
];
}
}
第五步:创建路由
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProductController;
Route::get('products', [ProductController::class, 'store']);
第六创:创建控制器
$ php artisan make:controller ProductController
编写方法:app/Http/Controllers/ProductController.php
<?php
namespace App\Http\Controllers;
use App\Enums\ProductStatus;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function stroe()
{
$input = [
'name' => '手机',
'body' => '这是一个好手机',
'status' => ProductStatus::Active
];
$product = Product::create($input);
return response()->json([
'status' => $product->status,
'enum_status' => $product->status->value
]);
}
}
到此,枚举的使用案例结束。
请登录后再评论