簡體   English   中英

laravel 中路由上的隱式枚舉綁定問題

[英]Problem with implicit Enum Binding on route in laravel

我有這條路線

Route::get('/post/{post:uuid}', [\App\Http\Controllers\PostController::class, 'showPost']);

它可以工作,如果用戶輸入一個不存在的 uuid,應用程序會響應 404 錯誤,但現在我想通過在路由上使用枚舉來添加另一個條件。

我有一個名為PostStateEnum.php的枚舉

    <?php

namespace Modules\Muse\Enum;

use App\Http\Traits\EnumTrait;

enum PostStateEnum: string
{
    use EnumTrait;

    case DRAFT = 'draft';
    case WAITING_APPROVAL = 'waiting_approval';
    case APPROVED = 'approved';
    case REJECTED = 'rejected';
    case PUBLISHED = 'published';
    case UNPUBLISHED = 'unpublished';
}

我想在路由中添加一個條件:如果$post->statePostStateEnum::PUBLISHED我想去我的PostController中的 'showPost'

目前,我正在控制器上處理該邏輯

public function showPost(Post $post)
{
    if ($post->state == PostStateEnum::PUBLISHED)
    {
        dump($post);
    } else {
        return abort(404);
    }
}

根據我理解的 laravel 9 文檔,我需要創建另一個只有一個狀態的枚舉才能從路由中驗證它,對嗎?

有可能嗎? 還是我的方法更好?

我認為您對路線中的enums可以帶來什么感到困惑。 這不是關於已經保存的內容,而是更多地將其用作過濾器/輸入。 想象一下,您想要一條路線,根據狀態顯示帖子。

Route::get('posts/{PostStateEnum}');

在您的控制器中,您將能夠基於此進行過濾。

public function index(PostStateEnum $enum) {
    if ($enum ==PostStateEnum::PUBLISHED) {
        // query filter published
    } else if ($enum ==PostStateEnum::UNPUBLISHED) {
        // query filter unpublished
    }
}

您的枚舉不是來自輸入,而是來自模型,因此您所做的實際上是正確的方法。 如果沒有完成,請記住投射您的枚舉。

class Post extends Model {
    protected $casts = [
        'status' => PostStateEnum::class,
    ];
}

作為更通用的代碼改進技巧,像您在示例中所做的那樣執行 if else 對可讀性而言不是最佳的,在這些情況下,您可以反轉 if 邏輯並執行早期返回方法。

public function showPost(Post $post)
{
    if ($post->state !== PostStateEnum::PUBLISHED)
    {
        return abort(404);
    }

    return $post;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM