{"id":2565,"date":"2025-03-24T08:47:01","date_gmt":"2025-03-23T23:47:01","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2565"},"modified":"2025-03-24T08:47:30","modified_gmt":"2025-03-23T23:47:30","slug":"%e3%80%90%e4%bf%9d%e5%ae%88%e6%80%a7%e6%8a%9c%e7%be%a4%e3%80%91laravel-enum%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e4%bd%bf%e3%81%84%e6%96%b9%e3%81%a85%e3%81%a4%e3%81%ae%e6%b4%bb%e7%94%a8","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2565","title":{"rendered":"\u3010\u4fdd\u5b88\u6027\u629c\u7fa4\u3011Laravel Enum\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u30685\u3064\u306e\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel Enum\u3068\u306f\uff1f\u305d\u306e\u7279\u5fb4\u3068\u91cd\u8981\u6027<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">PHP\u306e\u6a19\u6e96enum\u3068\u9055\u3046\u306e\u304b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">Laravel Enum\u304c\u89e3\u6c7a\u3059\u308b3\u3064\u306e\u8ab2\u984c<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-6\">Laravel Enum \u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-7\">enum \u30af\u30e9\u30b9\u306e\u4f5c\u6210\u3068\u57fa\u672c\u69cb\u6587<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u578b\u306e\u5b9a\u7fa9\u3068\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-13\">\u8aad\u8005\u306e\u30b3\u30fc\u30c9\u3092enum\u306b\u79fb\u884c\u3059\u308b\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">Laravel Enum\u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u30b9\u30c6\u30fc\u30bf\u30b9\u7ba1\u7406\u3067\u306e\u6d3b\u7528\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u6d3b\u7528\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-19\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-20\">API\u5fdc\u7b54\u3067\u306e\u6d3b\u7528\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-21\">\u591a\u8a00\u8a9e\u5bfe\u5fdc\u3067\u306e\u6d3b\u7528\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-22\">Laravel Enum \u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-23\">\u547d\u540d\u898f\u5247\u3068\u30a2\u30a6\u30c8\u30e9\u30a4\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u66f8\u304d\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-29\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3078\u306e\u5f71\u97ff\u3068\u6700\u9069\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-34\">Laravel Enum\u306e\u5fdc\u7528\u3068\u767a\u5c55\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-35\">\u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-37\">\u4ed6\u306eLaravel\u306e\u6a5f\u80fd\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-40\">\u5b9f\u52d9\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5c0e\u5165\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel Enum\u3068\u306f\uff1f\u305d\u306e\u7279\u5fb4\u3068\u91cd\u8981\u6027<\/h2>\n\n\n\n<p>Laravel\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u3068\u53ef\u8aad\u6027\u306f\u975e\u5e38\u306b\u91cd\u8981\u3067\u3059\u3002Laravel Enum\u306f\u3001\u3053\u306e\u8ab2\u984c\u306b\u5bfe\u3059\u308b\u5f37\u529b\u306a\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u3068\u3057\u3066\u6ce8\u76ee\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001Laravel Enum\u306e\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u65b9\u6cd5\u307e\u3067\u3001\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">PHP\u306e\u6a19\u6e96enum\u3068\u9055\u3046\u306e\u304b<\/h3>\n\n\n\n<p>Laravel Enum\u306f\u3001PHP 8.1\u3067\u5c0e\u5165\u3055\u308c\u305f\u6a19\u6e96\u306eenum\u6a5f\u80fd\u3092\u30d9\u30fc\u30b9\u3068\u3057\u306a\u304c\u3089\u3001Laravel\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u7279\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3067\u63d0\u4f9b\u3057\u307e\u3059\u3002\u4e3b\u306a\u9055\u3044\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Eloquent\u3068\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Laravel Enum\u306e\u5834\u5408\nclass User extends Model\n{\n    protected $casts = [\n        'status' =&gt; UserStatus::class\n    ];\n}\n\n\/\/ \u81ea\u52d5\u7684\u306bEnum\u3068\u3057\u3066\u30ad\u30e3\u30b9\u30c8\u3055\u308c\u308b\n$user-&gt;status = UserStatus::Active;<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Laravel\u7279\u6709\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\npublic function rules()\n{\n    return [\n        'status' =&gt; ['required', new Enum(UserStatus::class)]\n    ];\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>API\u30ea\u30bd\u30fc\u30b9\u3068\u306e\u9023\u643a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u3088\u308a\u30ea\u30c3\u30c1\u306aAPI\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u751f\u6210\u304c\u53ef\u80fd\npublic function toArray($request)\n{\n    return [\n        'status' =&gt; [\n            'value' =&gt; $this-&gt;status-&gt;value,\n            'label' =&gt; $this-&gt;status-&gt;label(),\n        ]\n    ];\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Laravel Enum\u304c\u89e3\u6c7a\u3059\u308b3\u3064\u306e\u8ab2\u984c<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">1. \u578b\u5b89\u5168\u6027\u306e\u5411\u4e0a<\/h4>\n\n\n\n<p>\u5f93\u6765\u306e\u6587\u5b57\u5217\u3084\u5b9a\u6570\u306b\u3088\u308b\u72b6\u614b\u7ba1\u7406\u3068\u6bd4\u3079\u3001Laravel Enum\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u4ee5\u4e0b\u306e\u5229\u70b9\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDE\u88dc\u5b8c\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u578b\u30c1\u30a7\u30c3\u30af\u306b\u3088\u308b\u30d0\u30b0\u306e\u65e9\u671f\u767a\u898b<\/li>\n\n\n\n<li>\u7121\u52b9\u306a\u5024\u306e\u4ee3\u5165\u3092\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5f93\u6765\u306e\u65b9\u6cd5\uff08\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u3084\u3059\u3044\uff09\n$user-&gt;status = 'active'; \/\/ \u30bf\u30a4\u30d7\u30df\u30b9\u306e\u53ef\u80fd\u6027\u3042\u308a\n\n\/\/ Laravel Enum\u3092\u4f7f\u7528\uff08\u578b\u5b89\u5168\uff09\n$user-&gt;status = UserStatus::Active; \/\/ IDE\u304c\u88dc\u5b8c\u3057\u3066\u304f\u308c\u308b<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">2. \u30b3\u30fc\u30c9\u306e\u4e00\u8cab\u6027\u78ba\u4fdd<\/h4>\n\n\n\n<p>enum\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u4e00\u8cab\u3057\u305f\u5024\u306e\u7ba1\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u7fa9\u3055\u308c\u305f\u5024\u4ee5\u5916\u306f\u4f7f\u7528\u3067\u304d\u306a\u3044<\/li>\n\n\n\n<li>\u5024\u306e\u5909\u66f4\u304c\u4e00\u7b87\u6240\u3067\u7ba1\u7406\u53ef\u80fd<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u8a8d\u8b58\u9f5f\u9f6c\u3092\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">3. \u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/h4>\n\n\n\n<p>Laravel Enum\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u304c\u5927\u304d\u304f\u5411\u4e0a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30c6\u30fc\u30bf\u30b9\u306b\u95a2\u9023\u3059\u308b\u30ed\u30b8\u30c3\u30af\u3092enum\u5185\u306b\u30ab\u30d7\u30bb\u30eb\u5316<\/li>\n\n\n\n<li>\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u96c6\u7d04<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u306e\u3057\u3084\u3059\u3055<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u306b\u95a2\u9023\u3059\u308b\u30ed\u30b8\u30c3\u30af\u3092enum\u5185\u306b\u96c6\u7d04\nenum OrderStatus: string\n{\n    case Pending = 'pending';\n    case Processing = 'processing';\n    case Completed = 'completed';\n\n    public function canCancel(): bool\n    {\n        return match($this) {\n            self::Pending, self::Processing =&gt; true,\n            self::Completed =&gt; false,\n        };\n    }\n\n    public function label(): string\n    {\n        return match($this) {\n            self::Pending =&gt; '\u51e6\u7406\u5f85\u3061',\n            self::Processing =&gt; '\u51e6\u7406\u4e2d',\n            self::Completed =&gt; '\u5b8c\u4e86',\n        };\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Laravel Enum\u306f\u5358\u306a\u308b\u5024\u306e\u5217\u6319\u4ee5\u4e0a\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u54c1\u8cea\u5411\u4e0a\u306b\u5927\u304d\u304f\u8ca2\u732e\u3057\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u5b9f\u969b\u306e\u30b3\u30fc\u30c9\u3067\u6d3b\u7528\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u3088\u308a\u8a73\u3057\u304f\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">Laravel Enum \u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">enum \u30af\u30e9\u30b9\u306e\u4f5c\u6210\u3068\u57fa\u672c\u69cb\u6587<\/h3>\n\n\n\n<p>Laravel Enum\u3092\u5b9f\u88c5\u3059\u308b\u6700\u3082\u57fa\u672c\u7684\u306a\u65b9\u6cd5\u304b\u3089\u3001\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u307e\u3067\u6bb5\u968e\u7684\u306b\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">1. \u57fa\u672c\u7684\u306aenum\u306e\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Enums\/UserStatus.php\nnamespace App\\Enums;\n\nenum UserStatus: string\n{\n    case Active = 'active';\n    case Inactive = 'inactive';\n    case Banned = 'banned';\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-9\">2. \u30d8\u30eb\u30d1\u30fc\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Enums\/UserStatus.php\nnamespace App\\Enums;\n\nenum UserStatus: string\n{\n    case Active = 'active';\n    case Inactive = 'inactive';\n    case Banned = 'banned';\n\n    \/\/ \u8868\u793a\u7528\u306e\u30e9\u30d9\u30eb\u3092\u53d6\u5f97\n    public function label(): string\n    {\n        return match($this) {\n            self::Active =&gt; '\u30a2\u30af\u30c6\u30a3\u30d6',\n            self::Inactive =&gt; '\u975e\u30a2\u30af\u30c6\u30a3\u30d6',\n            self::Banned =&gt; '\u30d0\u30f3',\n        };\n    }\n\n    \/\/ \u5229\u7528\u53ef\u80fd\u306a\u3059\u3079\u3066\u306e\u5024\u3092\u53d6\u5f97\n    public static function values(): array\n    {\n        return array_column(self::cases(), 'value');\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u578b\u306e\u5b9a\u7fa9\u3068\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0<\/h3>\n\n\n\n<p>\u3088\u308a\u9ad8\u5ea6\u306a\u5b9f\u88c5\u3068\u3057\u3066\u3001\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5\u3084\u8ffd\u52a0\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">1. \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Contracts\/HasLabel.php\nnamespace App\\Contracts;\n\ninterface HasLabel\n{\n    public function label(): string;\n}\n\n\/\/ app\/Enums\/UserStatus.php\nnamespace App\\Enums;\n\nuse App\\Contracts\\HasLabel;\n\nenum UserStatus: string implements HasLabel\n{\n    \/\/ ... \u65e2\u5b58\u306e\u30b1\u30fc\u30b9\u5b9a\u7fa9 ...\n\n    public function label(): string\n    {\n        \/\/ ... \u65e2\u5b58\u306elabel\u30e1\u30bd\u30c3\u30c9 ...\n    }\n\n    \/\/ \u6a29\u9650\u30c1\u30a7\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\n    public function canAccess(): bool\n    {\n        return match($this) {\n            self::Active =&gt; true,\n            self::Inactive, self::Banned =&gt; false,\n        };\n    }\n\n    \/\/ \u72b6\u614b\u9077\u79fb\u306e\u53ef\u5426\u3092\u30c1\u30a7\u30c3\u30af\n    public function canTransitionTo(self $newStatus): bool\n    {\n        return match($this) {\n            self::Active =&gt; $newStatus === self::Inactive || $newStatus === self::Banned,\n            self::Inactive =&gt; $newStatus === self::Active,\n            self::Banned =&gt; false,\n        };\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">2. Eloquent\u30e2\u30c7\u30eb\u3068\u306e\u9023\u643a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Models\/User.php\nnamespace App\\Models;\n\nuse App\\Enums\\UserStatus;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass User extends Model\n{\n    protected $casts = [\n        'status' =&gt; UserStatus::class,\n    ];\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u306b\u57fa\u3065\u304f\u30b9\u30b3\u30fc\u30d7\u306e\u5b9a\u7fa9\n    public function scopeActive($query)\n    {\n        return $query-&gt;where('status', UserStatus::Active);\n    }\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u5909\u66f4\u30e1\u30bd\u30c3\u30c9\n    public function updateStatus(UserStatus $newStatus): bool\n    {\n        if (!$this-&gt;status-&gt;canTransitionTo($newStatus)) {\n            return false;\n        }\n\n        $this-&gt;status = $newStatus;\n        return $this-&gt;save();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u8aad\u8005\u306e\u30b3\u30fc\u30c9\u3092enum\u306b\u79fb\u884c\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u65e2\u5b58\u306e\u30b3\u30fc\u30c9\u3092Laravel Enum\u306b\u79fb\u884c\u3059\u308b\u969b\u306e\u63a8\u5968\u624b\u9806\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">1. \u5b9a\u6570\u304b\u3089enum\u3078\u306e\u79fb\u884c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u79fb\u884c\u524d\uff08\u5b9a\u6570\u4f7f\u7528\uff09\nclass User extends Model\n{\n    const STATUS_ACTIVE = 'active';\n    const STATUS_INACTIVE = 'inactive';\n    const STATUS_BANNED = 'banned';\n}\n\n\/\/ \u79fb\u884c\u5f8c\uff08enum\u4f7f\u7528\uff09\nenum UserStatus: string\n{\n    case Active = 'active';\n    case Inactive = 'inactive';\n    case Banned = 'banned';\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">2. \u6bb5\u968e\u7684\u306a\u79fb\u884c\u624b\u9806<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>enum\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65e2\u5b58\u306e\u5b9a\u6570\u5024\u3092\u78ba\u8a8d<\/li>\n\n\n\n<li>\u5bfe\u5fdc\u3059\u308benum\u30b1\u30fc\u30b9\u3092\u5b9a\u7fa9<\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u30e1\u30bd\u30c3\u30c9\u3092\u8ffd\u52a0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30c7\u30eb\u306e\u66f4\u65b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Models\/User.php\nclass User extends Model\n{\n    \/\/ \u53e4\u3044\u5b9a\u6570\u5b9a\u7fa9\u306f\u3057\u3070\u3089\u304f\u6b8b\u3057\u3066\u304a\u304f\uff08\u5f8c\u65b9\u4e92\u63db\u6027\u306e\u305f\u3081\uff09\n    const STATUS_ACTIVE = UserStatus::Active-&gt;value;\n\n    protected $casts = [\n        'status' =&gt; UserStatus::class,\n    ];\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u66f4\u65b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Http\/Requests\/UpdateUserRequest.php\nclass UpdateUserRequest extends FormRequest\n{\n    public function rules()\n    {\n        return [\n            'status' =&gt; ['required', new Enum(UserStatus::class)],\n        ];\n    }\n}<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u65e2\u5b58\u306e\u30af\u30a8\u30ea\u306e\u66f4\u65b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u79fb\u884c\u524d\n$activeUsers = User::where('status', User::STATUS_ACTIVE)-&gt;get();\n\n\/\/ \u79fb\u884c\u5f8c\n$activeUsers = User::where('status', UserStatus::Active)-&gt;get();\n\/\/ \u307e\u305f\u306f\n$activeUsers = User::active()-&gt;get();<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u6bb5\u968e\u7684\u306a\u79fb\u884c\u306b\u3088\u308a\u3001\u65e2\u5b58\u306e\u6a5f\u80fd\u3092\u58ca\u3059\u3053\u3068\u306a\u304f\u3001\u5b89\u5168\u306bLaravel Enum\u3092\u5c0e\u5165\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">Laravel Enum\u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3<\/h2>\n\n\n\n<p>\u672c\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u52d9\u3067\u7279\u306b\u6709\u7528\u306aLaravel Enum\u306e\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3\u30925\u3064\u7d39\u4ecb\u3057\u307e\u3059\u3002\u5404\u30d1\u30bf\u30fc\u30f3\u306b\u3064\u3044\u3066\u3001\u5b9f\u88c5\u65b9\u6cd5\u3068\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3092\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30b9\u30c6\u30fc\u30bf\u30b9\u7ba1\u7406\u3067\u306e\u6d3b\u7528\u4f8b<\/h3>\n\n\n\n<p>\u30b9\u30c6\u30fc\u30bf\u30b9\u7ba1\u7406\u306f\u3001Laravel Enum\u306e\u6700\u3082\u4e00\u822c\u7684\u3067\u52b9\u679c\u7684\u306a\u4f7f\u7528\u4f8b\u306e1\u3064\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">enum OrderStatus: string\n{\n    case Pending = 'pending';\n    case Confirmed = 'confirmed';\n    case Processing = 'processing';\n    case Shipped = 'shipped';\n    case Delivered = 'delivered';\n    case Cancelled = 'cancelled';\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u9032\u884c\u53ef\u5426\u3092\u30c1\u30a7\u30c3\u30af\n    public function canProgressTo(self $newStatus): bool\n    {\n        return match($this) {\n            self::Pending =&gt; $newStatus === self::Confirmed,\n            self::Confirmed =&gt; $newStatus === self::Processing,\n            self::Processing =&gt; $newStatus === self::Shipped,\n            self::Shipped =&gt; $newStatus === self::Delivered,\n            self::Delivered =&gt; false,\n            self::Cancelled =&gt; false,\n        };\n    }\n\n    \/\/ \u30ad\u30e3\u30f3\u30bb\u30eb\u53ef\u80fd\u304b\u3069\u3046\u304b\u3092\u30c1\u30a7\u30c3\u30af\n    public function canBeCancelled(): bool\n    {\n        return match($this) {\n            self::Pending, self::Confirmed =&gt; true,\n            default =&gt; false,\n        };\n    }\n\n    \/\/ \u8868\u793a\u7528\u306e\u30d0\u30c3\u30b8\u30ab\u30e9\u30fc\n    public function badgeColor(): string\n    {\n        return match($this) {\n            self::Pending =&gt; 'gray',\n            self::Confirmed =&gt; 'blue',\n            self::Processing =&gt; 'yellow',\n            self::Shipped =&gt; 'purple',\n            self::Delivered =&gt; 'green',\n            self::Cancelled =&gt; 'red',\n        };\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u6d3b\u7528\u4f8b<\/h3>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0\u30ea\u30af\u30a8\u30b9\u30c8\u3084\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3067\u306eEnum\u6d3b\u7528\u306b\u3088\u308a\u3001\u5165\u529b\u5024\u306e\u691c\u8a3c\u304c\u5f37\u529b\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderController extends Controller\n{\n    public function update(Request $request, Order $order)\n    {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\u306e\u4f5c\u6210\n        $validator = Validator::make($request-&gt;all(), [\n            'status' =&gt; [\n                'required',\n                new Enum(OrderStatus::class),\n                function ($attribute, $value, $fail) use ($order) {\n                    $newStatus = OrderStatus::from($value);\n                    if (!$order-&gt;status-&gt;canProgressTo($newStatus)) {\n                        $fail('Invalid status transition.');\n                    }\n                },\n            ]\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return response()-&gt;json(['errors' =&gt; $validator-&gt;errors()], 422);\n        }\n\n        $order-&gt;update($request-&gt;validated());\n        return response()-&gt;json($order);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Eloquent\u30e2\u30c7\u30eb\u3068\u306e\u9023\u643a\u3092\u6700\u5927\u9650\u306b\u6d3b\u7528\u3059\u308b\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Order extends Model\n{\n    protected $casts = [\n        'status' =&gt; OrderStatus::class,\n    ];\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u306b\u57fa\u3065\u304f\u30b9\u30b3\u30fc\u30d7\n    public function scopeInProgress($query)\n    {\n        return $query-&gt;whereIn('status', [\n            OrderStatus::Confirmed-&gt;value,\n            OrderStatus::Processing-&gt;value,\n        ]);\n    }\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u5909\u66f4\u30e1\u30bd\u30c3\u30c9\n    public function updateStatus(OrderStatus $newStatus): bool\n    {\n        if (!$this-&gt;status-&gt;canProgressTo($newStatus)) {\n            return false;\n        }\n\n        \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5185\u3067\u30b9\u30c6\u30fc\u30bf\u30b9\u66f4\u65b0\u3068\u30a4\u30d9\u30f3\u30c8\u767a\u884c\n        return DB::transaction(function () use ($newStatus) {\n            $oldStatus = $this-&gt;status;\n            $this-&gt;status = $newStatus;\n            $this-&gt;save();\n\n            event(new OrderStatusChanged($this, $oldStatus, $newStatus));\n            return true;\n        });\n    }\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u5c65\u6b74\u306e\u8a18\u9332\n    public function statusLogs()\n    {\n        return $this-&gt;hasMany(OrderStatusLog::class);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">API\u5fdc\u7b54\u3067\u306e\u6d3b\u7528\u4f8b<\/h3>\n\n\n\n<p>API\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u3088\u308a\u8c4a\u304b\u3067\u4f7f\u3044\u3084\u3059\u3044\u3082\u306e\u306b\u3059\u308b\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderResource extends JsonResource\n{\n    public function toArray($request): array\n    {\n        return [\n            'id' =&gt; $this-&gt;id,\n            'status' =&gt; [\n                'code' =&gt; $this-&gt;status-&gt;value,\n                'label' =&gt; $this-&gt;status-&gt;label(),\n                'color' =&gt; $this-&gt;status-&gt;badgeColor(),\n                'can_cancel' =&gt; $this-&gt;status-&gt;canBeCancelled(),\n                'can_progress' =&gt; $this-&gt;status-&gt;canProgressTo(OrderStatus::next($this-&gt;status)),\n            ],\n            'created_at' =&gt; $this-&gt;created_at,\n            'updated_at' =&gt; $this-&gt;updated_at,\n        ];\n    }\n}\n\n\/\/ API\u5fdc\u7b54\u4f8b\n{\n    \"id\": 1,\n    \"status\": {\n        \"code\": \"confirmed\",\n        \"label\": \"\u6ce8\u6587\u78ba\u8a8d\u6e08\u307f\",\n        \"color\": \"blue\",\n        \"can_cancel\": true,\n        \"can_progress\": true\n    },\n    \"created_at\": \"2024-02-05T10:00:00Z\",\n    \"updated_at\": \"2024-02-05T10:30:00Z\"\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u591a\u8a00\u8a9e\u5bfe\u5fdc\u3067\u306e\u6d3b\u7528\u4f8b<\/h3>\n\n\n\n<p>\u56fd\u969b\u5316\u5bfe\u5fdc\uff08i18n\uff09\u3092\u30b9\u30de\u30fc\u30c8\u306b\u5b9f\u88c5\u3059\u308b\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Contracts\/HasTranslation.php\ninterface HasTranslation\n{\n    public function translate(?string $locale = null): string;\n}\n\nenum OrderStatus: string implements HasTranslation\n{\n    case Pending = 'pending';\n    case Confirmed = 'confirmed';\n    case Processing = 'processing';\n    case Shipped = 'shipped';\n    case Delivered = 'delivered';\n    case Cancelled = 'cancelled';\n\n    public function translate(?string $locale = null): string\n    {\n        $locale = $locale ?? app()-&gt;getLocale();\n\n        return match($this) {\n            self::Pending =&gt; __('orders.status.pending', locale: $locale),\n            self::Confirmed =&gt; __('orders.status.confirmed', locale: $locale),\n            self::Processing =&gt; __('orders.status.processing', locale: $locale),\n            self::Shipped =&gt; __('orders.status.shipped', locale: $locale),\n            self::Delivered =&gt; __('orders.status.delivered', locale: $locale),\n            self::Cancelled =&gt; __('orders.status.cancelled', locale: $locale),\n        };\n    }\n\n    \/\/ \u8a00\u8a9e\u30d5\u30a1\u30a4\u30eb\u7528\u306e\u30ad\u30fc\u53d6\u5f97\n    public static function translationKeys(): array\n    {\n        return [\n            'orders.status.pending',\n            'orders.status.confirmed',\n            'orders.status.processing',\n            'orders.status.shipped',\n            'orders.status.delivered',\n            'orders.status.cancelled',\n        ];\n    }\n}\n\n\/\/ resources\/lang\/ja\/orders.php\nreturn [\n    'status' =&gt; [\n        'pending' =&gt; '\u4fdd\u7559\u4e2d',\n        'confirmed' =&gt; '\u78ba\u8a8d\u6e08\u307f',\n        'processing' =&gt; '\u51e6\u7406\u4e2d',\n        'shipped' =&gt; '\u767a\u9001\u6e08\u307f',\n        'delivered' =&gt; '\u914d\u9054\u5b8c\u4e86',\n        'cancelled' =&gt; '\u30ad\u30e3\u30f3\u30bb\u30eb',\n    ],\n];<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6d3b\u7528\u30d1\u30bf\u30fc\u30f3\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3050\u306b\u5fdc\u7528\u3067\u304d\u308b\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-22\">Laravel Enum \u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p>Laravel Enum\u3092\u5b9f\u52d9\u3067\u6d3b\u7528\u3059\u308b\u969b\u306e\u91cd\u8981\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u3001\u5177\u4f53\u4f8b\u3068\u3068\u3082\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u547d\u540d\u898f\u5247\u3068\u30a2\u30a6\u30c8\u30e9\u30a4\u30f3<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">1. \u547d\u540d\u898f\u5247\u306e\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u826f\u3044\u4f8b\uff1a\u660e\u78ba\u3067\u5177\u4f53\u7684\u306a\u540d\u524d\nenum OrderStatus: string\n{\n    case Pending = 'pending';\n    case Processing = 'processing';\n}\n\n\/\/ \u60aa\u3044\u4f8b\uff1a\u62bd\u8c61\u7684\u3067\u4e0d\u660e\u78ba\u306a\u540d\u524d\nenum Status: string\n{\n    case State1 = 'state1';\n    case State2 = 'state2';\n}<\/pre>\n\n\n\n<p>\u547d\u540d\u898f\u5247\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Enum\u30af\u30e9\u30b9\u540d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5358\u6570\u5f62\u3092\u4f7f\u7528\uff08Orders \u3067\u306f\u306a\u304f Order\uff09<\/li>\n\n\n\n<li>\u76ee\u7684\u3092\u660e\u78ba\u306b\u793a\u3059\u63a5\u5c3e\u8f9e\uff08Status, Type, Category \u306a\u3069\uff09<\/li>\n\n\n\n<li>\u30c9\u30e1\u30a4\u30f3\u56fa\u6709\u306e\u7528\u8a9e\u3092\u512a\u5148<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b1\u30fc\u30b9\u540d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PascalCase\u5f62\u5f0f\u3067\u8a18\u8ff0<\/li>\n\n\n\n<li>\u52d5\u8a5e\u307e\u305f\u306f\u5f62\u5bb9\u8a5e\uff0b\u540d\u8a5e\u306e\u7d44\u307f\u5408\u308f\u305b<\/li>\n\n\n\n<li>\u3067\u304d\u308b\u3060\u3051\u81ea\u5df1\u8aac\u660e\u7684\u306a\u540d\u524d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5024\u306e\u547d\u540d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>snake_case\u5f62\u5f0f\u3092\u63a8\u5968<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30ab\u30e9\u30e0\u540d\u3068\u306e\u6574\u5408\u6027\u3092\u8003\u616e<\/li>\n\n\n\n<li>\u610f\u5473\u304c\u660e\u78ba\u306a\u7c21\u6f54\u306a\u540d\u524d<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">2. \u30d5\u30a1\u30a4\u30eb\u69cb\u6210\u3068\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u9020<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">app\/\n\u251c\u2500\u2500 Enums\/\n\u2502   \u251c\u2500\u2500 Order\/\n\u2502   \u2502   \u251c\u2500\u2500 OrderStatus.php\n\u2502   \u2502   \u251c\u2500\u2500 OrderType.php\n\u2502   \u2502   \u2514\u2500\u2500 PaymentMethod.php\n\u2502   \u251c\u2500\u2500 User\/\n\u2502   \u2502   \u251c\u2500\u2500 UserRole.php\n\u2502   \u2502   \u2514\u2500\u2500 UserStatus.php\n\u2502   \u2514\u2500\u2500 Shared\/\n\u2502       \u2514\u2500\u2500 Currency.php<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u66f8\u304d\u65b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">1. \u57fa\u672c\u7684\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderStatusTest extends TestCase\n{\n    \/** @test *\/\n    public function it_can_create_enum_from_valid_value()\n    {\n        $status = OrderStatus::from('pending');\n        $this-&gt;assertInstanceOf(OrderStatus::class, $status);\n        $this-&gt;assertEquals(OrderStatus::Pending, $status);\n    }\n\n    \/** @test *\/\n    public function it_throws_exception_for_invalid_value()\n    {\n        $this-&gt;expectException(ValueError::class);\n        OrderStatus::from('invalid_status');\n    }\n\n    \/** @test *\/\n    public function it_correctly_handles_status_transitions()\n    {\n        $status = OrderStatus::Pending;\n\n        $this-&gt;assertTrue($status-&gt;canTransitionTo(OrderStatus::Processing));\n        $this-&gt;assertFalse($status-&gt;canTransitionTo(OrderStatus::Delivered));\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">2. \u9ad8\u5ea6\u306a\u30c6\u30b9\u30c8\u30d1\u30bf\u30fc\u30f3<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderStatusTest extends TestCase\n{\n    \/** @test *\/\n    public function it_correctly_serializes_to_database()\n    {\n        $order = Order::factory()-&gt;create([\n            'status' =&gt; OrderStatus::Processing\n        ]);\n\n        $this-&gt;assertDatabaseHas('orders', [\n            'id' =&gt; $order-&gt;id,\n            'status' =&gt; OrderStatus::Processing-&gt;value\n        ]);\n    }\n\n    \/** @test *\/\n    public function it_handles_translations_correctly()\n    {\n        $status = OrderStatus::Processing;\n\n        App::setLocale('en');\n        $this-&gt;assertEquals('Processing', $status-&gt;label());\n\n        App::setLocale('ja');\n        $this-&gt;assertEquals('\u51e6\u7406\u4e2d', $status-&gt;label());\n    }\n\n    \/** @test *\/\n    public function it_validates_enum_values_in_requests()\n    {\n        $response = $this-&gt;postJson('\/api\/orders', [\n            'status' =&gt; 'invalid_status'\n        ]);\n\n        $response-&gt;assertStatus(422)\n            -&gt;assertJsonValidationErrors(['status']);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3078\u306e\u5f71\u97ff\u3068\u6700\u9069\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">1. \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u63a8\u5968\uff1a\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u5b9f\u88c5\nenum OrderStatus: string\n{\n    case Pending = 'pending';\n    case Processing = 'processing';\n\n    \/\/ \u9759\u7684\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\n    private static array $labels = [];\n\n    public function label(): string\n    {\n        if (!isset(self::$labels[$this-&gt;value])) {\n            self::$labels[$this-&gt;value] = match($this) {\n                self::Pending =&gt; __('orders.status.pending'),\n                self::Processing =&gt; __('orders.status.processing'),\n            };\n        }\n\n        return self::$labels[$this-&gt;value];\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">2. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u975e\u52b9\u7387\u306a\u5b9f\u88c5\n$orders = Order::all()-&gt;filter(fn ($order) =&gt; \n    $order-&gt;status === OrderStatus::Processing\n);\n\n\/\/ \u6700\u9069\u5316\u3055\u308c\u305f\u5b9f\u88c5\n$orders = Order::where('status', OrderStatus::Processing-&gt;value)-&gt;get();<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">3. \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderService\n{\n    public function getOrdersByStatus(OrderStatus $status): Collection\n    {\n        $cacheKey = \"orders.status.{$status-&gt;value}\";\n\n        return Cache::remember($cacheKey, now()-&gt;addHours(1), function () use ($status) {\n            return Order::where('status', $status)\n                       -&gt;with(['user', 'items'])\n                       -&gt;get();\n        });\n    }\n\n    public function updateOrderStatus(Order $order, OrderStatus $newStatus): void\n    {\n        DB::transaction(function () use ($order, $newStatus) {\n            $order-&gt;status = $newStatus;\n            $order-&gt;save();\n\n            \/\/ \u95a2\u9023\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u524a\u9664\n            Cache::tags(['orders', \"order.{$order-&gt;id}\"])-&gt;flush();\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9759\u7684\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u751f\u6210\u3092\u907f\u3051\u308b<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>Eager Loading\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u8a2d\u8a08<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30ad\u30fc\u306e\u8a2d\u8a08<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u671f\u9593\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u30bf\u30b0\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u826f\u3044Enum\u5b9f\u88c5\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u5fdc\u7528\u4f8b\u3068\u5b9f\u52d9\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-34\">Laravel Enum\u306e\u5fdc\u7528\u3068\u767a\u5c55\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<p>\u672c\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001Laravel Enum\u306e\u3088\u308a\u9ad8\u5ea6\u306a\u4f7f\u7528\u65b9\u6cd5\u3068\u3001\u5b9f\u52d9\u3067\u306e\u5177\u4f53\u7684\u306a\u6d3b\u7528\u4e8b\u4f8b\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">\u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">1. \u8907\u96d1\u306a\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">enum OrderStatus: string\n{\n    case Draft = 'draft';\n    case Pending = 'pending';\n    case Confirmed = 'confirmed';\n    case Processing = 'processing';\n    case ReadyToShip = 'ready_to_ship';\n    case Shipped = 'shipped';\n    case Delivered = 'delivered';\n    case Cancelled = 'cancelled';\n\n    \/\/ \u9ad8\u5ea6\u306a\u30b9\u30c6\u30fc\u30bf\u30b9\u30d5\u30ed\u30fc\u7ba1\u7406\n    public function nextPossibleStatuses(): array\n    {\n        return match($this) {\n            self::Draft =&gt; [self::Pending],\n            self::Pending =&gt; [self::Confirmed, self::Cancelled],\n            self::Confirmed =&gt; [self::Processing, self::Cancelled],\n            self::Processing =&gt; [self::ReadyToShip, self::Cancelled],\n            self::ReadyToShip =&gt; [self::Shipped],\n            self::Shipped =&gt; [self::Delivered],\n            self::Delivered =&gt; [],\n            self::Cancelled =&gt; [],\n        };\n    }\n\n    \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u5909\u66f4\u306b\u5fc5\u8981\u306a\u6a29\u9650\u30c1\u30a7\u30c3\u30af\n    public function requiredPermissions(): array\n    {\n        return match($this) {\n            self::Draft =&gt; ['order.create'],\n            self::Pending =&gt; ['order.update'],\n            self::Confirmed =&gt; ['order.confirm'],\n            self::Processing =&gt; ['order.process'],\n            self::ReadyToShip =&gt; ['order.ship'],\n            self::Shipped, self::Delivered =&gt; ['order.deliver'],\n            self::Cancelled =&gt; ['order.cancel'],\n        };\n    }\n\n    \/\/ \u30e1\u30fc\u30eb\u901a\u77e5\u304c\u5fc5\u8981\u306a\u30b9\u30c6\u30fc\u30bf\u30b9\u5909\u66f4\u304b\u5224\u5b9a\n    public function requiresNotification(): bool\n    {\n        return in_array($this, [\n            self::Confirmed,\n            self::Shipped,\n            self::Delivered,\n            self::Cancelled\n        ]);\n    }\n}\n\n\/\/ \u9ad8\u5ea6\u306a\u30b9\u30c6\u30fc\u30bf\u30b9\u7ba1\u7406\u30b5\u30fc\u30d3\u30b9\nclass OrderStatusManager\n{\n    public function __construct(\n        private NotificationService $notificationService,\n        private PermissionService $permissionService\n    ) {}\n\n    public function canChangeStatus(\n        Order $order,\n        OrderStatus $newStatus,\n        User $user\n    ): bool {\n        \/\/ \u73fe\u5728\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u304b\u3089\u9077\u79fb\u53ef\u80fd\u304b\u78ba\u8a8d\n        if (!in_array($newStatus, $order-&gt;status-&gt;nextPossibleStatuses())) {\n            return false;\n        }\n\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u304c\u5fc5\u8981\u306a\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\n        return $this-&gt;permissionService-&gt;hasPermissions(\n            $user,\n            $newStatus-&gt;requiredPermissions()\n        );\n    }\n\n    public function changeStatus(\n        Order $order,\n        OrderStatus $newStatus,\n        User $user\n    ): bool {\n        if (!$this-&gt;canChangeStatus($order, $newStatus, $user)) {\n            return false;\n        }\n\n        DB::transaction(function () use ($order, $newStatus) {\n            $oldStatus = $order-&gt;status;\n            $order-&gt;status = $newStatus;\n            $order-&gt;save();\n\n            \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u5c65\u6b74\u306e\u8a18\u9332\n            $order-&gt;statusLogs()-&gt;create([\n                'from_status' =&gt; $oldStatus-&gt;value,\n                'to_status' =&gt; $newStatus-&gt;value,\n                'changed_by' =&gt; $user-&gt;id,\n            ]);\n\n            \/\/ \u5fc5\u8981\u306a\u5834\u5408\u306f\u901a\u77e5\u3092\u9001\u4fe1\n            if ($newStatus-&gt;requiresNotification()) {\n                $this-&gt;notificationService-&gt;notifyStatusChange(\n                    $order,\n                    $oldStatus,\n                    $newStatus\n                );\n            }\n        });\n\n        return true;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u4ed6\u306eLaravel\u306e\u6a5f\u80fd\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">1. \u30a4\u30d9\u30f3\u30c8\u3068\u30ea\u30b9\u30ca\u30fc\u3068\u306e\u9023\u643a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Events\/OrderStatusChanged.php\nclass OrderStatusChanged\n{\n    public function __construct(\n        public Order $order,\n        public OrderStatus $oldStatus,\n        public OrderStatus $newStatus\n    ) {}\n}\n\n\/\/ app\/Listeners\/HandleOrderStatusChange.php\nclass HandleOrderStatusChange\n{\n    public function handle(OrderStatusChanged $event): void\n    {\n        match($event-&gt;newStatus) {\n            OrderStatus::Confirmed =&gt; $this-&gt;handleConfirmed($event-&gt;order),\n            OrderStatus::ReadyToShip =&gt; $this-&gt;handleReadyToShip($event-&gt;order),\n            OrderStatus::Shipped =&gt; $this-&gt;handleShipped($event-&gt;order),\n            OrderStatus::Delivered =&gt; $this-&gt;handleDelivered($event-&gt;order),\n            default =&gt; null,\n        };\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">2. \u30dd\u30ea\u30b7\u30fc\u3068\u306e\u7d71\u5408<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderPolicy\n{\n    public function update(User $user, Order $order): bool\n    {\n        \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u306b\u57fa\u3065\u3044\u3066\u66f4\u65b0\u6a29\u9650\u3092\u5224\u5b9a\n        return match($order-&gt;status) {\n            OrderStatus::Draft =&gt; $user-&gt;can('edit_draft_orders'),\n            OrderStatus::Pending =&gt; $user-&gt;can('edit_pending_orders'),\n            OrderStatus::Confirmed =&gt; $user-&gt;can('edit_confirmed_orders'),\n            default =&gt; false,\n        };\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u5b9f\u52d9\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5c0e\u5165\u6642\u306e\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">1. \u5927\u898f\u6a21EC\u30b5\u30a4\u30c8\u3067\u306e\u6d3b\u7528\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">enum ProductStatus: string implements HasColor, HasIcon\n{\n    case Draft = 'draft';\n    case PendingApproval = 'pending_approval';\n    case Active = 'active';\n    case OutOfStock = 'out_of_stock';\n    case Discontinued = 'discontinued';\n\n    \/\/ \u5728\u5eab\u7ba1\u7406\u3068\u306e\u9023\u643a\n    public function affectsInventory(): bool\n    {\n        return in_array($this, [\n            self::Active,\n            self::OutOfStock\n        ]);\n    }\n\n    \/\/ \u4fa1\u683c\u8868\u793a\u306e\u5236\u5fa1\n    public function shouldDisplayPrice(): bool\n    {\n        return in_array($this, [\n            self::Active,\n            self::OutOfStock\n        ]);\n    }\n\n    \/\/ \u691c\u7d22\u7d50\u679c\u3078\u306e\u8868\u793a\u5236\u5fa1\n    public function visibleInSearch(): bool\n    {\n        return $this === self::Active;\n    }\n}\n\nclass ProductService\n{\n    public function updateProductStatus(Product $product, ProductStatus $newStatus): void\n    {\n        DB::transaction(function () use ($product, $newStatus) {\n            $oldStatus = $product-&gt;status;\n            $product-&gt;status = $newStatus;\n\n            \/\/ \u5728\u5eab\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3068\u306e\u9023\u643a\n            if ($oldStatus-&gt;affectsInventory() !== $newStatus-&gt;affectsInventory()) {\n                $this-&gt;inventoryService-&gt;syncProductStatus($product);\n            }\n\n            \/\/ \u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u66f4\u65b0\n            if ($oldStatus-&gt;visibleInSearch() !== $newStatus-&gt;visibleInSearch()) {\n                $this-&gt;searchService-&gt;updateProductVisibility($product);\n            }\n\n            $product-&gt;save();\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-42\">2. \u5c0e\u5165\u6642\u306e\u6ce8\u610f\u70b9\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u5c0e\u5165\u6226\u7565<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u898f\u6a5f\u80fd\u304b\u3089\u5c0e\u5165\u3092\u958b\u59cb<\/li>\n\n\n\n<li>\u65e2\u5b58\u30b3\u30fc\u30c9\u306e\u6bb5\u968e\u7684\u306a\u79fb\u884c<\/li>\n\n\n\n<li>\u5341\u5206\u306a\u30c6\u30b9\u30c8\u30ab\u30d0\u30ec\u30c3\u30b8\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3078\u306e\u914d\u616e<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u6700\u9069\u5316\n   class ProductRepository\n   {\n       public function getProductsByStatus(ProductStatus $status): Collection\n       {\n           return Cache::tags(['products'])\n               -&gt;remember(\n                   \"products.status.{$status-&gt;value}\",\n                   now()-&gt;addHour(),\n                   fn () =&gt; Product::where('status', $status)-&gt;get()\n               );\n       }\n   }<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u62e1\u5f35\u6027\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u5c06\u6765\u306e\u6a5f\u80fd\u8ffd\u52a0\u3092\u898b\u636e\u3048\u305f\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u8a2d\u8a08\n   interface StatusInterface\n   {\n       public function nextPossibleStatuses(): array;\n       public function requiredPermissions(): array;\n       public function requiresNotification(): bool;\n       public function label(): string;\n   }\n\n   enum OrderStatus: string implements StatusInterface\n   {\n       \/\/ \u5b9f\u88c5\n   }<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u9ad8\u5ea6\u306a\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3068\u5b9f\u52d9\u3067\u306e\u6d3b\u7528\u4f8b\u3092\u53c2\u8003\u306b\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5408\u308f\u305b\u3066\u9069\u5207\u306bLaravel Enum\u3092\u6d3b\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u9069\u5207\u306b\u8a2d\u8a08\u30fb\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u62e1\u5f35\u6027\u306e\u3042\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2565","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2565"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2565\/revisions"}],"predecessor-version":[{"id":2567,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2565\/revisions\/2567"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}