[英]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->state
是PostStateEnum::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.