Этот вопрос связан с форматированием, представлением и автозаполнением в отношении статусов. Я не нашел способа эффективно использовать перечисления для более сложных сценариев.
у меня несколько таблиц
В каждой таблице есть столбец status, а также другие столбцы перечисления. Я создал следующие перечисления:
Внутри моего кода мне нужно ссылаться на статусы каждой модели, например:
$user->status = Status::APPROVED;
$post->status = Status::COMPLETE;
$category->status = Status::OPEN;
Статусы не связаны друг с другом и различны для каждой модели. Проблема связана с форматированием, так как очень легко перепутать статусы, если все они имеют одинаковый префикс.
Я знаю, что я также могу сделать это:
$user->status = \App\Enums\User\Status::APPROVED;
$post->status = \App\Enums\Post\Status::COMPLETE;
$category->status = \App\Enums\Category\Status::OPEN;
Однако это не очень чисто, и мне интересно, есть ли лучший способ. В идеале я хотел бы сделать:
$user->status = User::Status::APPROVED;
$post->status = Post::Status::COMPLETE;
$category->status = Category::Status:OPEN;
Я пытался сделать это в своей модели, но не работает, так как не могу создать экземпляр нового объекта вне метода:
class User extends Model
{
public Status $STATUS = new Status();
Вышеупомянутое дает мне автозаполнение и чистый синтаксис, но это явно не работает.
Есть ли решения для моего варианта использования? Что-то, что дает мне автодополнение и сохраняет код чистым и коротким?
Я хотел бы использовать перечисления, если это возможно, для проверки типов
или вы можете изменить имя так же, как: \App\Enums\User\Status as UserStatus;






Я думаю, вы можете использовать
class User extends Model
{
/** @var Status */
public static $status = Status::class;
}
Или
use \App\Enums\User\Status as UserStatus
Проблема в том, что некоторые модели имеют длинные имена, и это тоже не очевидно. Такая модель, как UserPurchaseHistory, оказалась бы UserPurchaseHistoryStatus, что тоже не очевидно. Я попробовал Status::class, но он не работает, поскольку он разрешается в строку, а не в экземпляр Enum.
Он разрешается в экземпляр Enum, вы можете попробовать User::$status::APPROVED, это работает. @BernardWiesner
вы можете добавить их в конфиг