如何在 Laravel 11 中创建和使用枚举

作者: 温新

图书: 【Laravel 11 实战】

阅读: 101

时间: 2025-01-17 16:37:56

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

到此,枚举的使用案例结束。

请登录后再评论