{"id":2590,"date":"2025-03-24T08:46:59","date_gmt":"2025-03-23T23:46:59","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2590"},"modified":"2025-03-24T08:47:28","modified_gmt":"2025-03-23T23:47:28","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-fillable%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a%e3%82%bb%e3%82%ad%e3%83%a5%e3%82%a2%e3%81%aa%e3%83%a2%e3%83%87%e3%83%ab","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2590","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Fillable\u306e\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a\u30bb\u30ad\u30e5\u30a2\u306a\u30e2\u30c7\u30eb\u5b9f\u88c5\u306e7\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9"},"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 Fillable\u3068\u306f\uff1aMass Assignment\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Mass Assignment\u306e\u8106\u5f31\u6027\u304b\u3089\u5b66\u3076Fillable\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">Guarded\u3068Fillable\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Fillable\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u6b63\u3057\u3044\u8a2d\u5b9a\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4fdd\u8b77\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u66f8\u304d\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-5\">\u8907\u6570\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4e00\u62ec\u3067\u8a2d\u5b9a\u3059\u308b\u52b9\u7387\u7684\u306a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-6\">\u30bb\u30ad\u30e5\u30a2\u306a\u30e2\u30c7\u30eb\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-7\">\u30b9\u30c6\u30c3\u30d7 1: \u5fc5\u8981\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u3060\u3051\u3092\u8a31\u53ef\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-8\">\u30b9\u30c6\u30c3\u30d7 2: \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u7279\u5b9a\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30b9\u30c6\u30c3\u30d7 3: \u52d5\u7684\u306aFillable\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5b9f\u73fe<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30b9\u30c6\u30c3\u30d7 4: \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/a>      <\/li>      <li>        <a href=\"#i-11\">\u30b9\u30c6\u30c3\u30d7 5: \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>      <li>        <a href=\"#i-12\">\u30b9\u30c6\u30c3\u30d7 6: \u30dd\u30ea\u30b7\u30fc\u3068\u306e\u9023\u643a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-13\">\u30b9\u30c6\u30c3\u30d7 7: \u6b63\u3057\u3044\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-14\">Fillable\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u5225\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-15\">\u7ba1\u7406\u753b\u9762\u3067\u306e\u67d4\u8edf\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-16\">API\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3067\u306e\u5229\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u8907\u6570\u74b0\u5883\u3067\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u7ba1\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-18\">\u3088\u304f\u3042\u308bFillable\u95a2\u9023\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-19\">Mass Assignment\u4f8b\u5916\u306e\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">\u4e88\u671f\u305b\u306c\u5c5e\u6027\u66f4\u65b0\u306e\u9632\u6b62\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-25\">Fillable\u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-26\">\u6761\u4ef6\u4ed8\u304dFillable\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-27\">\u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30b3\u30fc\u30d7\u3068\u306e\u4f75\u7528<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-28\">\u307e\u3068\u3081\uff1a\u30bb\u30ad\u30e5\u30a2\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30c6\u30af\u30cb\u30c3\u30af\u8a2d\u8a08\u306e\u305f\u3081\u306b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-29\">Fillable\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u5b9f\u88c5\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-32\">\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u306e\u7d39\u4ecb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-37\">\u6700\u5f8c\u306b<\/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 Fillable\u3068\u306f\uff1aMass Assignment\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<p>Laravel\u3067\u30e2\u30c7\u30eb\u3092\u6271\u3046\u969b\u306b\u907f\u3051\u3066\u901a\u308c\u306a\u3044\u91cd\u8981\u306a\u6982\u5ff5\u304c\u300cFillable\u300d\u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001Mass Assignment\u8106\u5f31\u6027\u306e\u89b3\u70b9\u304b\u3089\u3001\u306a\u305cFillable\u304c\u5fc5\u8981\u306a\u306e\u304b\u3001\u305d\u3057\u3066\u3069\u306e\u3088\u3046\u306b\u4f7f\u7528\u3059\u3079\u304d\u304b\u3092\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\">Mass Assignment\u306e\u8106\u5f31\u6027\u304b\u3089\u5b66\u3076Fillable\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Mass Assignment\u8106\u5f31\u6027\u3068\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u4e88\u671f\u305b\u306c\u30c7\u30fc\u30bf\u3092\u30e2\u30c7\u30eb\u306b\u4e00\u62ec\u4ee3\u5165\u3067\u304d\u3066\u3057\u307e\u3046\u8106\u5f31\u6027\u3067\u3059\u3002\u3053\u306e\u554f\u984c\u304c\u5b9f\u969b\u306b\u3069\u306e\u3088\u3046\u306a\u5f71\u97ff\u3092\u53ca\u307c\u3059\u306e\u304b\u3001\u5177\u4f53\u4f8b\u3067\u898b\u3066\u307f\u307e\u3057\u3087\u3046\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=\"\">\/\/ \u8106\u5f31\u6027\u306e\u3042\u308b\u4f8b\nclass User extends Model\n{\n    \/\/ Fillable\u306e\u8a2d\u5b9a\u304c\u306a\u3044\u5834\u5408\u3001\u5168\u3066\u306e\u30ab\u30e9\u30e0\u304c\u4ee3\u5165\u53ef\u80fd\n}\n\n\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u51e6\u7406\npublic function store(Request $request)\n{\n    $user = User::create($request-&gt;all());\n    return redirect()-&gt;route('users.index');\n}<\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u554f\u984c\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u60aa\u610f\u306e\u3042\u308b\u30e6\u30fc\u30b6\u30fc\u304c\u7ba1\u7406\u8005\u6a29\u9650\u3092\u4ed8\u4e0e<\/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=\"\">POST \/users\n{\n    \"name\": \"\u653b\u6483\u8005\",\n    \"email\": \"attacker@example.com\",\n    \"is_admin\": 1  \/\/ \u672c\u6765\u8a2d\u5b9a\u3067\u304d\u306a\u3044\u306f\u305a\u306e\u7ba1\u7406\u8005\u30d5\u30e9\u30b0\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u91cd\u8981\u306a\u60c5\u5831\u306e\u6539\u3056\u3093<\/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=\"\">POST \/users\n{\n    \"balance\": 999999,  \/\/ \u6b8b\u9ad8\u3092\u4e0d\u6b63\u306b\u64cd\u4f5c\n    \"verified\": true    \/\/ \u8a8d\u8a3c\u72b6\u614b\u3092\u4e0d\u6b63\u306b\u5909\u66f4\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u8106\u5f31\u6027\u3092\u9632\u3050\u305f\u3081\u306b\u3001Laravel\u306f<code>$fillable<\/code>\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u63d0\u4f9b\u3057\u3066\u3044\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=\"\">\/\/ \u9069\u5207\u306a\u5b9f\u88c5\u4f8b\nclass User extends Model\n{\n    protected $fillable = [\n        'name',\n        'email',\n        'password',\n    ];\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Guarded\u3068Fillable\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001Mass Assignment\u4fdd\u8b77\u306e\u305f\u3081\u306b<code>$fillable<\/code>\u3068<code>$guarded<\/code>\u3068\u3044\u30462\u3064\u306e\u65b9\u6cd5\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e2\u3064\u306f\u76f8\u53cd\u3059\u308b\u6982\u5ff5\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7279\u5fb4\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n<div id=\"id-232b737b-de0a-4e24-9b4f-f6703072122e\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u9805\u76ee<\/th><th>Fillable<\/th><th>Guarded<\/th><\/tr><\/thead><tbody><tr><td>\u5b9a\u7fa9\u306e\u610f\u5473<\/td><td>\u30db\u30ef\u30a4\u30c8\u30ea\u30b9\u30c8\uff08\u8a31\u53ef\u3059\u308b\u30ab\u30e9\u30e0\u3092\u6307\u5b9a\uff09<\/td><td>\u30d6\u30e9\u30c3\u30af\u30ea\u30b9\u30c8\uff08\u7981\u6b62\u3059\u308b\u30ab\u30e9\u30e0\u3092\u6307\u5b9a\uff09<\/td><\/tr><tr><td>\u30c7\u30d5\u30a9\u30eb\u30c8\u72b6\u614b<\/td><td>\u6307\u5b9a\u3057\u305f\u30ab\u30e9\u30e0\u306e\u307f\u4ee3\u5165\u53ef\u80fd<\/td><td>\u6307\u5b9a\u3057\u305f\u30ab\u30e9\u30e0\u4ee5\u5916\u3092\u4ee3\u5165\u53ef\u80fd<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u89b3\u70b9<\/td><td>\u3088\u308a\u5b89\u5168\uff08\u660e\u793a\u7684\u306a\u8a31\u53ef\u304c\u5fc5\u8981\uff09<\/td><td>\u3088\u308a\u5371\u967a\uff08\u3046\u3063\u304b\u308a\u6f0f\u308c\u308b\u53ef\u80fd\u6027\uff09<\/td><\/tr><tr><td>\u30b3\u30fc\u30c9\u4f8b<\/td><td><code>protected $fillable = ['name'];<\/code><\/td><td><code>protected $guarded = ['id'];<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u3057\u3066\u306f\u3001<code>$fillable<\/code>\u306e\u4f7f\u7528\u304c\u63a8\u5968\u3055\u308c\u307e\u3059\u3002\u305d\u306e\u7406\u7531\u306f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u660e\u793a\u7684\u306a\u8a31\u53ef\u304c\u5fc5\u8981\u306a\u305f\u3081\u3001\u65b0\u3057\u3044\u30ab\u30e9\u30e0\u3092\u8ffd\u52a0\u3057\u305f\u969b\u306e\u5b89\u5168\u6027\u304c\u9ad8\u3044<\/li>\n\n\n\n<li>\u610f\u56f3\u3057\u306a\u3044\u30ab\u30e9\u30e0\u306e\u66f4\u65b0\u3092\u78ba\u5b9f\u306b\u9632\u3052\u308b<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3067\u8a31\u53ef\u3055\u308c\u3066\u3044\u308b\u30ab\u30e9\u30e0\u304c\u4e00\u76ee\u3067\u5206\u304b\u308b<\/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=\"\">\/\/ \u63a8\u5968\u3055\u308c\u308b\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\nclass Article extends Model\n{\n    protected $fillable = [\n        'title',\n        'content',\n        'published_at',\n    ];\n\n    \/\/ \u30b7\u30b9\u30c6\u30e0\u3067\u7ba1\u7406\u3059\u308b\u5024\u306f$fillable\u306b\u542b\u3081\u306a\u3044\n    \/\/ - id\n    \/\/ - created_at\n    \/\/ - updated_at\n    \/\/ - deleted_at\n}<\/pre>\n\n\n\n<p>\u57fa\u790e\u77e5\u8b58\u3068\u3057\u3066\u91cd\u8981\u306a\u306e\u306f\u3001<code>$fillable<\/code>\u306f\u3042\u304f\u307e\u3067Mass Assignment\u306e\u5236\u5fa1\u3067\u3042\u308a\u3001\u500b\u5225\u306e\u4ee3\u5165\u306f\u5236\u9650\u3055\u308c\u306a\u3044\u3068\u3044\u3046\u70b9\u3067\u3059\uff1a<\/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=\"\">$article = new Article();\n$article-&gt;status = 'draft';  \/\/ $fillable\u306b\u542b\u307e\u308c\u3066\u3044\u306a\u304f\u3066\u3082\u4ee3\u5165\u53ef\u80fd\n$article-&gt;save();<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u57fa\u672c\u7684\u306a\u7406\u89e3\u306e\u4e0a\u306b\u7acb\u3063\u3066\u3001\u6b21\u7bc0\u3067\u306f\u5177\u4f53\u7684\u306a\u8a2d\u5b9a\u65b9\u6cd5\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">Fillable\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u6b63\u3057\u3044\u8a2d\u5b9a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4fdd\u8b77\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u66f8\u304d\u65b9<\/h3>\n\n\n\n<p>Fillable\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u8a2d\u5b9a\u306b\u306f\u3001\u3044\u304f\u3064\u304b\u306e\u91cd\u8981\u306a\u30d1\u30bf\u30fc\u30f3\u3068\u6ce8\u610f\u70b9\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3068\u305d\u306e\u8aac\u660e\u3092\u793a\u3057\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 Product extends Model\n{\n    \/**\n     * Mass Assignment\u3067\u4ee3\u5165\u3092\u8a31\u53ef\u3059\u308b\u5c5e\u6027\n     * \n     * @var array&lt;int, string&gt;\n     *\/\n    protected $fillable = [\n        'name',           \/\/ \u5546\u54c1\u540d\n        'description',    \/\/ \u5546\u54c1\u8aac\u660e\n        'price',         \/\/ \u4fa1\u683c\n        'stock',         \/\/ \u5728\u5eab\u6570\n        'category_id',   \/\/ \u30ab\u30c6\u30b4\u30eaID\n    ];\n\n    \/\/ \u4ee5\u4e0b\u306e\u3088\u3046\u306a\u91cd\u8981\u306a\u5c5e\u6027\u306f$fillable\u306b\u542b\u3081\u306a\u3044\n    \/\/ - id: \u4e3b\u30ad\u30fc\n    \/\/ - created_at: \u4f5c\u6210\u65e5\u6642\n    \/\/ - updated_at: \u66f4\u65b0\u65e5\u6642\n    \/\/ - deleted_at: \u524a\u9664\u65e5\u6642\n    \/\/ - total_sales: \u58f2\u4e0a\u96c6\u8a08\u5024\n}<\/pre>\n\n\n\n<p>\u8a2d\u5b9a\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u578b\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u660e\u8a18<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHPDoc\u3067<code>@var array&lt;int, string&gt;<\/code>\u3092\u6307\u5b9a<\/li>\n\n\n\n<li>\u9759\u7684\u89e3\u6790\u30c4\u30fc\u30eb\u3067\u306e\u30c1\u30a7\u30c3\u30af\u304c\u53ef\u80fd\u306b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u547d\u540d\u898f\u5247\u306e\u7d71\u4e00<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30cd\u30fc\u30af\u30b1\u30fc\u30b9\u3092\u4f7f\u7528\uff08Laravel\u306e\u898f\u7d04\u306b\u6e96\u62e0\uff09<\/li>\n\n\n\n<li>\u30c6\u30fc\u30d6\u30eb\u306e\u30ab\u30e9\u30e0\u540d\u3068\u4e00\u81f4\u3055\u305b\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30e1\u30f3\u30c8\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5404\u5c5e\u6027\u306e\u610f\u5473\u3092\u660e\u8a18<\/li>\n\n\n\n<li>\u9664\u5916\u3057\u305f\u5c5e\u6027\u306e\u7406\u7531\u3092\u8a18\u8f09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u8907\u6570\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4e00\u62ec\u3067\u8a2d\u5b9a\u3059\u308b\u52b9\u7387\u7684\u306a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u30e2\u30c7\u30eb\u3084\u3001\u72b6\u6cc1\u306b\u3088\u3063\u3066\u8a31\u53ef\u3059\u308b\u5c5e\u6027\u304c\u5909\u308f\u308b\u5834\u5408\u306e\u52b9\u7387\u7684\u306a\u8a2d\u5b9a\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\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 Order extends Model\n{\n    \/**\n     * \u57fa\u672c\u306e\u8a31\u53ef\u5c5e\u6027\n     *\/\n    private array $baseFields = [\n        'customer_name',\n        'email',\n        'phone',\n    ];\n\n    \/**\n     * \u914d\u9001\u95a2\u9023\u306e\u5c5e\u6027\n     *\/\n    private array $shippingFields = [\n        'shipping_address',\n        'shipping_method',\n        'tracking_number',\n    ];\n\n    \/**\n     * \u652f\u6255\u3044\u95a2\u9023\u306e\u5c5e\u6027\n     *\/\n    private array $paymentFields = [\n        'payment_method',\n        'payment_status',\n    ];\n\n    \/**\n     * \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067Fillable\u3092\u52d5\u7684\u306b\u8a2d\u5b9a\n     *\/\n    public function __construct(array $attributes = [])\n    {\n        parent::__construct($attributes);\n\n        \/\/ \u57fa\u672c\u30d5\u30a3\u30fc\u30eb\u30c9\u306f\u5e38\u306b\u8a31\u53ef\n        $allowedFields = $this-&gt;baseFields;\n\n        \/\/ \u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u8ffd\u52a0\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u8a31\u53ef\n        if (config('app.enable_shipping')) {\n            $allowedFields = array_merge($allowedFields, $this-&gt;shippingFields);\n        }\n\n        if (config('app.enable_payment')) {\n            $allowedFields = array_merge($allowedFields, $this-&gt;paymentFields);\n        }\n\n        $this-&gt;fillable = $allowedFields;\n    }\n\n    \/**\n     * \u7279\u5b9a\u306e\u72b6\u6cc1\u3067\u4e00\u6642\u7684\u306bFillable\u3092\u5909\u66f4\n     *\/\n    public function temporarilyFillable(array $attributes, callable $callback)\n    {\n        $originalFillable = $this-&gt;fillable;\n        $this-&gt;fillable = array_merge($this-&gt;fillable, $attributes);\n\n        try {\n            $result = $callback($this);\n            $this-&gt;fillable = $originalFillable;\n            return $result;\n        } catch (\\Exception $e) {\n            $this-&gt;fillable = $originalFillable;\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u52b9\u7387\u7684\u306a\u8a2d\u5b9a\u306e\u305f\u3081\u306e\u30c6\u30af\u30cb\u30c3\u30af\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5c5e\u6027\u306e\u30b0\u30eb\u30fc\u30d7\u5316<\/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=\"\">   \/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\u4f8b\n   $order = new Order();\n   $order-&gt;temporarilyFillable(['special_note'], function($order) use ($request) {\n       return $order-&gt;create($request-&gt;all());\n   });<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u306b\u3088\u308b\u5236\u5fa1<\/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=\"\">   \/\/ config\/app.php\n   return [\n       'enable_shipping' =&gt; env('ENABLE_SHIPPING', true),\n       'enable_payment' =&gt; env('ENABLE_PAYMENT', true),\n   ];<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u3067\u306e\u4e00\u6642\u7684\u306a\u8a31\u53ef<\/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=\"\">   \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u3067\u306e\u4f8b\n   $order-&gt;temporarilyFillable(['imported_at', 'import_batch_id'], function($order) {\n       return $order-&gt;updateFromBatch($batchData);\n   });<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u65b9\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u67d4\u8edf\u304b\u3064\u30bb\u30ad\u30e5\u30a2\u306a\u30e2\u30c7\u30eb\u5b9f\u88c5\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u672c\u3092\u8e0f\u307e\u3048\u305f\u4e0a\u3067\u306e\u5177\u4f53\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">\u30bb\u30ad\u30e5\u30a2\u306a\u30e2\u30c7\u30eb\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30a2\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044Laravel\u30e2\u30c7\u30eb\u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e7\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u3001\u5177\u4f53\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3068\u5171\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30b9\u30c6\u30c3\u30d7 1: \u5fc5\u8981\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u3060\u3051\u3092\u8a31\u53ef\u3059\u308b<\/h3>\n\n\n\n<p>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u57fa\u3065\u304d\u3001\u5fc5\u8981\u6700\u5c0f\u9650\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u307f\u3092\u8a31\u53ef\u3057\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 Article extends Model\n{\n    \/**\n     * \u8a31\u53ef\u3059\u308b\u5c5e\u6027\u3092\u6a5f\u80fd\u3054\u3068\u306b\u30b0\u30eb\u30fc\u30d7\u5316\n     *\/\n    private const CONTENT_FIELDS = [\n        'title',\n        'body',\n        'summary',\n    ];\n\n    private const META_FIELDS = [\n        'slug',\n        'published_at',\n        'featured_image',\n    ];\n\n    \/**\n     * \u30e6\u30fc\u30b6\u30fc\u306e\u5f79\u5272\u306b\u5fdc\u3058\u3066\u8a31\u53ef\u3059\u308b\u5c5e\u6027\u3092\u5236\u5fa1\n     *\/\n    public function getFillableFields(): array\n    {\n        $fields = self::CONTENT_FIELDS;\n\n        if (auth()-&gt;user()-&gt;can('manage_article_meta')) {\n            $fields = array_merge($fields, self::META_FIELDS);\n        }\n\n        return $fields;\n    }\n\n    public function __construct(array $attributes = [])\n    {\n        parent::__construct($attributes);\n        $this-&gt;fillable = $this-&gt;getFillableFields();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u30b9\u30c6\u30c3\u30d7 2: \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u7279\u5b9a\u3059\u308b<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4e0a\u91cd\u8981\u306a\u5c5e\u6027\u3092\u660e\u78ba\u306b\u5b9a\u7fa9\u3057\u3001\u4fdd\u8b77\u3057\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 User extends Model\n{\n    \/**\n     * \u6c7a\u3057\u3066\u4e00\u62ec\u4ee3\u5165\u3092\u8a31\u53ef\u3057\u3066\u306f\u3044\u3051\u306a\u3044\u5c5e\u6027\n     *\/\n    private const SENSITIVE_FIELDS = [\n        'password_hash',\n        'remember_token',\n        'api_key',\n        'is_admin',\n        'email_verified_at',\n    ];\n\n    \/**\n     * \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u5c5e\u6027\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n     *\/\n    protected static function boot()\n    {\n        parent::boot();\n\n        static::saving(function ($user) {\n            $changed = array_intersect(\n                array_keys($user-&gt;getDirty()),\n                self::SENSITIVE_FIELDS\n            );\n\n            if (!empty($changed)) {\n                \\Log::warning('Attempt to modify sensitive fields: ' . implode(', ', $changed));\n                throw new \\RuntimeException('Cannot modify sensitive fields directly');\n            }\n        });\n    }\n\n    \/**\n     * \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u5c5e\u6027\u3092\u5b89\u5168\u306b\u66f4\u65b0\u3059\u308b\u30e1\u30bd\u30c3\u30c9\n     *\/\n    public function updatePassword(string $newPassword): void\n    {\n        $this-&gt;password_hash = Hash::make($newPassword);\n        $this-&gt;save();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30b9\u30c6\u30c3\u30d7 3: \u52d5\u7684\u306aFillable\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5b9f\u73fe<\/h3>\n\n\n\n<p>\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u67d4\u8edf\u306bFillable\u3092\u5236\u5fa1\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 Product extends Model\n{\n    use HasFactory;\n\n    \/**\n     * \u52d5\u7684\u306aFillable\u5236\u5fa1\u306e\u305f\u3081\u306e\u30c8\u30ec\u30a4\u30c8\n     *\/\n    trait DynamicFillable\n    {\n        private array $originalFillable = [];\n\n        public function initializeDynamicFillable()\n        {\n            $this-&gt;originalFillable = $this-&gt;fillable;\n        }\n\n        public function setContextFillable(string $context)\n        {\n            $this-&gt;fillable = match($context) {\n                'admin' =&gt; array_merge(\n                    $this-&gt;originalFillable,\n                    ['price', 'stock', 'status']\n                ),\n                'api' =&gt; array_merge(\n                    $this-&gt;originalFillable,\n                    ['external_id', 'api_status']\n                ),\n                default =&gt; $this-&gt;originalFillable,\n            };\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30b9\u30c6\u30c3\u30d7 4: \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/h3>\n\n\n\n<p>Fillable\u3068\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092\u9023\u643a\u3055\u305b\u3001\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u3092\u4fdd\u8b77\u3057\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 ProjectRequest extends FormRequest\n{\n    \/**\n     * \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\u3068Fillable\u306e\u540c\u671f\u3092\u7dad\u6301\n     *\/\n    public function rules(): array\n    {\n        return array_fill_keys(\n            (new Project)-&gt;getFillable(),\n            'required|string|max:255'\n        ) + [\n            'start_date' =&gt; 'required|date',\n            'end_date' =&gt; 'required|date|after:start_date',\n            'budget' =&gt; 'required|numeric|min:0',\n        ];\n    }\n\n    \/**\n     * \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30bf\u3068\u306e\u9023\u643a\n     *\/\n    public function withValidator($validator)\n    {\n        $validator-&gt;after(function ($validator) {\n            $project = new Project($this-&gt;validated());\n            if (!$project-&gt;isValidBudgetAllocation()) {\n                $validator-&gt;errors()-&gt;add(\n                    'budget',\n                    'Invalid budget allocation'\n                );\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30b9\u30c6\u30c3\u30d7 5: \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u6642\u306e\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<p>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u542b\u3080\u30e2\u30c7\u30eb\u3067\u306eFillable\u8a2d\u5b9a\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\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 Post extends Model\n{\n    protected $fillable = [\n        'title',\n        'content',\n    ];\n\n    \/**\n     * \u30cd\u30b9\u30c8\u3055\u308c\u305f\u5c5e\u6027\u306e\u5236\u5fa1\n     *\/\n    protected $with = ['tags'];\n\n    \/**\n     * \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u66f4\u65b0\u6642\u306e\u5236\u5fa1\n     *\/\n    public function syncTags(array $tags)\n    {\n        return $this-&gt;tags()-&gt;sync(\n            collect($tags)\n                -&gt;filter(fn($tag) =&gt; auth()-&gt;user()-&gt;can('attach_tag', $tag))\n                -&gt;pluck('id')\n        );\n    }\n\n    \/**\n     * \u30bb\u30fc\u30d5\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u66f4\u65b0\n     *\/\n    public function safeUpdate(array $attributes)\n    {\n        DB::transaction(function () use ($attributes) {\n            \/\/ \u57fa\u672c\u5c5e\u6027\u306e\u66f4\u65b0\n            $this-&gt;fill($attributes)-&gt;save();\n\n            \/\/ \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u66f4\u65b0\n            if (isset($attributes['tags'])) {\n                $this-&gt;syncTags($attributes['tags']);\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30b9\u30c6\u30c3\u30d7 6: \u30dd\u30ea\u30b7\u30fc\u3068\u306e\u9023\u643a<\/h3>\n\n\n\n<p>Fillable\u306e\u5236\u5fa1\u3092\u30dd\u30ea\u30b7\u30fc\u3068\u9023\u643a\u3055\u305b\u3001\u3088\u308a\u7d30\u304b\u306a\u6a29\u9650\u7ba1\u7406\u3092\u5b9f\u73fe\u3057\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 ArticlePolicy\n{\n    \/**\n     * \u5c5e\u6027\u30ec\u30d9\u30eb\u3067\u306e\u6a29\u9650\u30c1\u30a7\u30c3\u30af\n     *\/\n    public function updateField(User $user, Article $article, string $field): bool\n    {\n        return match($field) {\n            'status' =&gt; $user-&gt;hasRole('editor'),\n            'published_at' =&gt; $user-&gt;hasRole('publisher'),\n            default =&gt; $user-&gt;can('edit_article', $article),\n        };\n    }\n}\n\nclass Article extends Model\n{\n    \/**\n     * \u30dd\u30ea\u30b7\u30fc\u3092\u8003\u616e\u3057\u305fFillable\u5236\u5fa1\n     *\/\n    public function getFillableForUser(User $user): array\n    {\n        return collect($this-&gt;fillable)\n            -&gt;filter(fn($field) =&gt; $user-&gt;can('updateField', [$this, $field]))\n            -&gt;toArray();\n    }\n\n    \/**\n     * \u30bb\u30ad\u30e5\u30a2\u306a\u66f4\u65b0\u51e6\u7406\n     *\/\n    public function secureUpdate(array $attributes, User $user)\n    {\n        $fillable = $this-&gt;getFillableForUser($user);\n        $this-&gt;fillable = $fillable;\n\n        return $this-&gt;update($attributes);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30b9\u30c6\u30c3\u30d7 7: \u6b63\u3057\u3044\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>Fillable\u306e\u8a2d\u5b9a\u3092\u78ba\u5b9f\u306b\u30c6\u30b9\u30c8\u3057\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u62c5\u4fdd\u3057\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 ArticleTest extends TestCase\n{\n    use RefreshDatabase;\n\n    \/**\n     * Fillable\u306e\u57fa\u672c\u30c6\u30b9\u30c8\n     *\/\n    public function test_fillable_attributes_are_mass_assignable()\n    {\n        $article = Article::factory()-&gt;create();\n        $newData = ['title' =&gt; 'New Title', 'content' =&gt; 'New Content'];\n\n        $article-&gt;fill($newData);\n        $this-&gt;assertEquals('New Title', $article-&gt;title);\n    }\n\n    \/**\n     * \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u5c5e\u6027\u306e\u4fdd\u8b77\u30c6\u30b9\u30c8\n     *\/\n    public function test_sensitive_attributes_are_protected()\n    {\n        $article = Article::factory()-&gt;create();\n\n        $this-&gt;expectException(\\Illuminate\\Database\\Eloquent\\MassAssignmentException::class);\n\n        $article-&gt;fill(['published_status' =&gt; 'approved']);\n    }\n\n    \/**\n     * \u52d5\u7684Fillable\u306e\u30c6\u30b9\u30c8\n     *\/\n    public function test_dynamic_fillable_changes_based_on_context()\n    {\n        $article = Article::factory()-&gt;create();\n        $user = User::factory()-&gt;create(['role' =&gt; 'editor']);\n\n        $this-&gt;actingAs($user);\n\n        $fillable = $article-&gt;getFillableForUser($user);\n        $this-&gt;assertContains('status', $fillable);\n\n        $regularUser = User::factory()-&gt;create(['role' =&gt; 'user']);\n        $this-&gt;actingAs($regularUser);\n\n        $fillable = $article-&gt;getFillableForUser($regularUser);\n        $this-&gt;assertNotContains('status', $fillable);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e7\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30bb\u30ad\u30e5\u30a2\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30e2\u30c7\u30eb\u5b9f\u88c5\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u5b9f\u969b\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u9069\u7528\u3059\u308b\u65b9\u6cd5\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-14\">Fillable\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u5225\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u906d\u9047\u3059\u308b\u4ee3\u8868\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u304a\u3051\u308b\u3001Fillable\u306e\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u7ba1\u7406\u753b\u9762\u3067\u306e\u67d4\u8edf\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u7ba1\u7406\u753b\u9762\u3067\u306f\u3001\u4e00\u822c\u30e6\u30fc\u30b6\u30fc\u5411\u3051\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3088\u308a\u3082\u591a\u304f\u306e\u5c5e\u6027\u3092\u7de8\u96c6\u53ef\u80fd\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\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 Product extends Model\n{\n    use HasFactory;\n\n    \/**\n     * \u57fa\u672c\u306e\u7de8\u96c6\u53ef\u80fd\u30d5\u30a3\u30fc\u30eb\u30c9\n     *\/\n    protected $baseFillable = [\n        'name',\n        'description',\n        'price',\n        'stock',\n    ];\n\n    \/**\n     * \u7ba1\u7406\u8005\u7528\u306e\u8ffd\u52a0\u30d5\u30a3\u30fc\u30eb\u30c9\n     *\/\n    protected $adminFillable = [\n        'cost_price',\n        'supplier_id',\n        'tax_category',\n        'featured_rank',\n        'internal_notes',\n    ];\n\n    \/**\n     * \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306e\u521d\u671f\u5316\n     *\/\n    public function __construct(array $attributes = [])\n    {\n        parent::__construct($attributes);\n        $this-&gt;initializeFillable();\n    }\n\n    \/**\n     * \u6a29\u9650\u306b\u57fa\u3065\u3044\u3066Fillable\u3092\u521d\u671f\u5316\n     *\/\n    protected function initializeFillable(): void\n    {\n        $this-&gt;fillable = $this-&gt;baseFillable;\n\n        if ($this-&gt;isAdminPanel()) {\n            $this-&gt;fillable = array_merge(\n                $this-&gt;fillable,\n                $this-&gt;adminFillable\n            );\n        }\n    }\n\n    \/**\n     * \u7ba1\u7406\u753b\u9762\u304b\u3089\u306e\u30a2\u30af\u30bb\u30b9\u304b\u3092\u5224\u5b9a\n     *\/\n    protected function isAdminPanel(): bool\n    {\n        return request()-&gt;segment(1) === 'admin' &amp;&amp; \n               auth()-&gt;user()?-&gt;can('access-admin');\n    }\n\n    \/**\n     * \u7ba1\u7406\u753b\u9762\u7528\u306eForm Request\n     *\/\n    public function adminUpdateRules(): array\n    {\n        return [\n            'name' =&gt; 'required|string|max:255',\n            'price' =&gt; 'required|numeric|min:0',\n            'cost_price' =&gt; 'required|numeric|min:0|lt:price',\n            'supplier_id' =&gt; 'required|exists:suppliers,id',\n            'tax_category' =&gt; 'required|in:standard,reduced,zero',\n            'featured_rank' =&gt; 'nullable|integer|min:0',\n            'internal_notes' =&gt; 'nullable|string',\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">API\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3067\u306e\u5229\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>API\u3067\u306f\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u3084\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u7a2e\u985e\u306b\u3088\u3063\u3066\u7570\u306a\u308bFillable\u8a2d\u5b9a\u304c\u5fc5\u8981\u306b\u306a\u308b\u3053\u3068\u304c\u3042\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 User extends Model\n{\n    \/**\n     * API\u7528\u306e\u30c8\u30ec\u30a4\u30c8\n     *\/\n    trait ApiVersionedFillable\n    {\n        \/**\n         * API\u30d0\u30fc\u30b8\u30e7\u30f3\u5225\u306e\u8a31\u53ef\u30d5\u30a3\u30fc\u30eb\u30c9\n         *\/\n        protected $apiFillable = [\n            'v1' =&gt; [\n                'name',\n                'email',\n                'preferences',\n            ],\n            'v2' =&gt; [\n                'name',\n                'email',\n                'preferences',\n                'notification_settings',\n                'timezone',\n            ]\n        ];\n\n        \/**\n         * \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u7a2e\u5225\u5225\u306e\u8ffd\u52a0\u30d5\u30a3\u30fc\u30eb\u30c9\n         *\/\n        protected $clientSpecificFields = [\n            'mobile' =&gt; [\n                'device_token',\n                'app_version',\n            ],\n            'web' =&gt; [\n                'theme_preference',\n                'layout_settings',\n            ]\n        ];\n\n        \/**\n         * API\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3067\u306eFillable\u8a2d\u5b9a\n         *\/\n        public function setApiFillable(string $version, string $client = 'web'): void\n        {\n            $this-&gt;fillable = array_merge(\n                $this-&gt;apiFillable[$version] ?? [],\n                $this-&gt;clientSpecificFields[$client] ?? []\n            );\n        }\n    }\n\n    \/**\n     * API\u7528\u306e\u30ea\u30bd\u30fc\u30b9\u30af\u30e9\u30b9\n     *\/\n    class UserApiResource extends JsonResource\n    {\n        public function toArray($request): array\n        {\n            $version = $request-&gt;route('version');\n            $fields = $this-&gt;apiFillable[$version] ?? [];\n\n            return collect(parent::toArray($request))\n                -&gt;only($fields)\n                -&gt;toArray();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u8907\u6570\u74b0\u5883\u3067\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u7ba1\u7406<\/h3>\n\n\n\n<p>\u958b\u767a\u30fb\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u30fb\u672c\u756a\u74b0\u5883\u3067\u7570\u306a\u308bFillable\u8a2d\u5b9a\u304c\u5fc5\u8981\u306a\u5834\u5408\u306e\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 Configuration extends Model\n{\n    \/**\n     * \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u7ba1\u7406\n     *\/\n    protected $environmentSettings = [\n        'local' =&gt; [\n            'fillable' =&gt; [\n                'app_name',\n                'debug_mode',\n                'mail_settings',\n                'test_accounts',\n                'mock_services',\n            ],\n            'validation' =&gt; [\n                'strict' =&gt; false,\n                'log_level' =&gt; 'debug',\n            ]\n        ],\n        'staging' =&gt; [\n            'fillable' =&gt; [\n                'app_name',\n                'mail_settings',\n                'feature_flags',\n                'monitoring_settings',\n            ],\n            'validation' =&gt; [\n                'strict' =&gt; true,\n                'log_level' =&gt; 'info',\n            ]\n        ],\n        'production' =&gt; [\n            'fillable' =&gt; [\n                'app_name',\n                'mail_settings',\n                'monitoring_settings',\n            ],\n            'validation' =&gt; [\n                'strict' =&gt; true,\n                'log_level' =&gt; 'error',\n            ]\n        ]\n    ];\n\n    \/**\n     * \u74b0\u5883\u306b\u5fdc\u3058\u305fFillable\u521d\u671f\u5316\n     *\/\n    public function initializeEnvironmentFillable(): void\n    {\n        $env = app()-&gt;environment();\n        $settings = $this-&gt;environmentSettings[$env] ?? \n                   $this-&gt;environmentSettings['production'];\n\n        $this-&gt;fillable = $settings['fillable'];\n\n        \/\/ \u74b0\u5883\u56fa\u6709\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u8a2d\u5b9a\n        Config::set('validation.strict', $settings['validation']['strict']);\n        Log::setDefaultDriver($settings['validation']['log_level']);\n    }\n\n    \/**\n     * \u74b0\u5883\u30c1\u30a7\u30c3\u30af\u7528\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\n     *\/\n    class EnvironmentConfigurationMiddleware\n    {\n        public function handle($request, Closure $next)\n        {\n            if (app()-&gt;environment('production')) {\n                $sensitiveParams = ['debug_mode', 'test_accounts'];\n\n                if ($request-&gt;hasAny($sensitiveParams)) {\n                    Log::warning('Attempt to modify sensitive configuration in production', [\n                        'ip' =&gt; $request-&gt;ip(),\n                        'user' =&gt; auth()-&gt;user()-&gt;id ?? null,\n                        'params' =&gt; $request-&gt;only($sensitiveParams)\n                    ]);\n\n                    abort(403, 'Cannot modify sensitive settings in production');\n                }\n            }\n\n            return $next($request);\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001Fillable\u95a2\u9023\u3067\u3088\u304f\u906d\u9047\u3059\u308b\u30c8\u30e9\u30d6\u30eb\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">\u3088\u304f\u3042\u308bFillable\u95a2\u9023\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">Mass Assignment\u4f8b\u5916\u306e\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<p>Mass Assignment\u4f8b\u5916\u306f\u958b\u767a\u4e2d\u306b\u3088\u304f\u906d\u9047\u3059\u308b\u554f\u984c\u306e\u4e00\u3064\u3067\u3059\u3002\u4e3b\u306a\u539f\u56e0\u3068\u89e3\u6c7a\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">1. MassAssignmentException \u306e\u57fa\u672c\u7684\u306a\u5bfe\u51e6<\/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=\"\">\/\/ \u30a8\u30e9\u30fc\u306e\u4f8b\nIlluminate\\Database\\Eloquent\\MassAssignmentException: Add [status] to fillable property to allow mass assignment.\n\n\/\/ \u539f\u56e0\u3068\u306a\u308b\u30b3\u30fc\u30c9\nclass Article extends Model\n{\n    protected $fillable = ['title', 'content'];\n}\n\n$article-&gt;update($request-&gt;all());  \/\/ status\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u542b\u3080\u30ea\u30af\u30a8\u30b9\u30c8<\/pre>\n\n\n\n<p><strong>\u89e3\u6c7a\u65b9\u6cd51: \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u306e\u8a73\u7d30\u78ba\u8a8d<\/strong><\/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 Article extends Model\n{\n    \/**\n     * Mass Assignment\u4f8b\u5916\u3092\u30c7\u30d0\u30c3\u30b0\u3057\u3084\u3059\u304f\u3059\u308b\n     *\/\n    public function fill(array $attributes)\n    {\n        try {\n            return parent::fill($attributes);\n        } catch (\\Illuminate\\Database\\Eloquent\\MassAssignmentException $e) {\n            logger()-&gt;debug('Mass Assignment Debug', [\n                'attempted_fields' =&gt; array_keys($attributes),\n                'fillable_fields' =&gt; $this-&gt;fillable,\n                'guarded_fields' =&gt; $this-&gt;guarded\n            ]);\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>\u89e3\u6c7a\u65b9\u6cd52: \u5b89\u5168\u306a\u5c5e\u6027\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0<\/strong><\/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 ArticleController extends Controller\n{\n    public function update(Request $request, Article $article)\n    {\n        \/\/ fillable\u306a\u5c5e\u6027\u306e\u307f\u3092\u62bd\u51fa\n        $fillableData = $request-&gt;only($article-&gt;getFillable());\n\n        \/\/ \u5b89\u5168\u306b\u66f4\u65b0\n        $article-&gt;update($fillableData);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-21\">2. \u30cd\u30b9\u30c8\u3055\u308c\u305f\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u554f\u984c<\/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=\"\">\/\/ \u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f3\nclass Post extends Model\n{\n    protected $fillable = ['title', 'content'];\n\n    public function comments()\n    {\n        return $this-&gt;hasMany(Comment::class);\n    }\n}\n\n\/\/ \u3053\u306e\u3088\u3046\u306b\u4e00\u62ec\u66f4\u65b0\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u30a8\u30e9\u30fc\n$post-&gt;update([\n    'title' =&gt; 'New Title',\n    'comments' =&gt; [\n        ['body' =&gt; 'New Comment']\n    ]\n]);<\/pre>\n\n\n\n<p><strong>\u89e3\u6c7a\u65b9\u6cd5: \u30ab\u30b9\u30bf\u30e0\u30df\u30e5\u30fc\u30c6\u30fc\u30bf\u306e\u4f7f\u7528<\/strong><\/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 Post extends Model\n{\n    protected $fillable = ['title', 'content'];\n\n    \/**\n     * \u30b3\u30e1\u30f3\u30c8\u306e\u5b89\u5168\u306a\u4e00\u62ec\u66f4\u65b0\n     *\/\n    public function setCommentsAttribute(array $comments)\n    {\n        \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5185\u3067\u5b89\u5168\u306b\u66f4\u65b0\n        DB::transaction(function () use ($comments) {\n            \/\/ \u65e2\u5b58\u306e\u30b3\u30e1\u30f3\u30c8\u3092\u53d6\u5f97\n            $existingComments = $this-&gt;comments-&gt;keyBy('id');\n\n            foreach ($comments as $comment) {\n                if (isset($comment['id'])) {\n                    \/\/ \u65e2\u5b58\u30b3\u30e1\u30f3\u30c8\u306e\u66f4\u65b0\n                    $existingComment = $existingComments-&gt;get($comment['id']);\n                    if ($existingComment) {\n                        $existingComment-&gt;update(\n                            Arr::only($comment, ['body'])\n                        );\n                    }\n                } else {\n                    \/\/ \u65b0\u898f\u30b3\u30e1\u30f3\u30c8\u306e\u4f5c\u6210\n                    $this-&gt;comments()-&gt;create(\n                        Arr::only($comment, ['body'])\n                    );\n                }\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u4e88\u671f\u305b\u306c\u5c5e\u6027\u66f4\u65b0\u306e\u9632\u6b62\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u3092\u4fdd\u3064\u305f\u3081\u3001\u4e88\u671f\u305b\u306c\u5c5e\u6027\u66f4\u65b0\u3092\u9632\u3050\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">1. \u66f4\u65b0\u524d\u306e\u5c5e\u6027\u691c\u8a3c<\/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 Order extends Model\n{\n    \/**\n     * \u66f4\u65b0\u524d\u306e\u5c5e\u6027\u691c\u8a3c\n     *\/\n    protected static function boot()\n    {\n        parent::boot();\n\n        static::updating(function ($order) {\n            $dirty = $order-&gt;getDirty();\n\n            \/\/ \u30b9\u30c6\u30fc\u30bf\u30b9\u9077\u79fb\u306e\u691c\u8a3c\n            if (isset($dirty['status'])) {\n                if (!$order-&gt;isValidStatusTransition($dirty['status'])) {\n                    throw new \\InvalidArgumentException(\n                        \"Invalid status transition from {$order-&gt;status} to {$dirty['status']}\"\n                    );\n                }\n            }\n\n            \/\/ \u91d1\u984d\u5909\u66f4\u306e\u691c\u8a3c\n            if (isset($dirty['amount']) &amp;&amp; $order-&gt;isPaid()) {\n                throw new \\InvalidArgumentException(\n                    \"Cannot modify amount of paid order\"\n                );\n            }\n\n            return true;\n        });\n    }\n\n    \/**\n     * \u30b9\u30c6\u30fc\u30bf\u30b9\u9077\u79fb\u306e\u691c\u8a3c\n     *\/\n    private function isValidStatusTransition(string $newStatus): bool\n    {\n        $allowedTransitions = [\n            'pending' =&gt; ['processing', 'cancelled'],\n            'processing' =&gt; ['completed', 'failed'],\n            'completed' =&gt; [],\n            'failed' =&gt; ['pending'],\n            'cancelled' =&gt; []\n        ];\n\n        return in_array($newStatus, $allowedTransitions[$this-&gt;status] ?? []);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">2. \u5c5e\u6027\u5909\u66f4\u306e\u76e3\u67fb\u30ed\u30b0<\/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 AuditableFillable extends Model\n{\n    \/**\n     * Fillable\u306a\u5c5e\u6027\u5909\u66f4\u306e\u76e3\u67fb\n     *\/\n    public function fill(array $attributes)\n    {\n        $before = $this-&gt;getAttributes();\n\n        parent::fill($attributes);\n\n        $after = $this-&gt;getAttributes();\n        $changes = array_diff_assoc($after, $before);\n\n        if (!empty($changes)) {\n            $this-&gt;logAttributeChanges($changes);\n        }\n\n        return $this;\n    }\n\n    \/**\n     * \u5c5e\u6027\u5909\u66f4\u306e\u30ed\u30b0\u8a18\u9332\n     *\/\n    protected function logAttributeChanges(array $changes): void\n    {\n        ActivityLog::create([\n            'model_type' =&gt; get_class($this),\n            'model_id' =&gt; $this-&gt;getKey(),\n            'changes' =&gt; $changes,\n            'user_id' =&gt; auth()-&gt;id(),\n            'ip_address' =&gt; request()-&gt;ip(),\n            'user_agent' =&gt; request()-&gt;userAgent()\n        ]);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u624b\u6cd5\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5168\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001Fillable\u306e\u3088\u308a\u9ad8\u5ea6\u306a\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-25\">Fillable\u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u6761\u4ef6\u4ed8\u304dFillable\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u52d5\u7684\u306bFillable\u3092\u5236\u5fa1\u3059\u308b\u9ad8\u5ea6\u306a\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\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 DynamicModel extends Model\n{\n    \/**\n     * \u6761\u4ef6\u4ed8\u304dFillable\u7528\u306e\u30c8\u30ec\u30a4\u30c8\n     *\/\n    trait ConditionalFillable\n    {\n        \/**\n         * \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u5225\u306eFillable\u5b9a\u7fa9\n         *\/\n        protected array $contextFillable = [\n            'default' =&gt; [\n                'name',\n                'description',\n            ],\n            'admin' =&gt; [\n                'internal_code',\n                'priority_rank',\n            ],\n            'api' =&gt; [\n                'external_id',\n                'sync_status',\n            ]\n        ];\n\n        \/**\n         * \u6761\u4ef6\u306b\u57fa\u3065\u304fFillable\u62e1\u5f35\n         *\/\n        protected array $conditionalFillable = [\n            'is_premium' =&gt; [\n                'premium_features',\n                'subscription_details',\n            ],\n            'has_special_permission' =&gt; [\n                'restricted_fields',\n                'special_notes',\n            ]\n        ];\n\n        \/**\n         * \u52d5\u7684\u306aFillable\u5236\u5fa1\n         *\/\n        public function initializeFillable(string $context = 'default'): void\n        {\n            \/\/ \u57fa\u672c\u306eFillable\u8a2d\u5b9a\n            $this-&gt;fillable = $this-&gt;contextFillable[$context] ?? \n                             $this-&gt;contextFillable['default'];\n\n            \/\/ \u6761\u4ef6\u306b\u57fa\u3065\u304f\u62e1\u5f35\n            foreach ($this-&gt;conditionalFillable as $condition =&gt; $fields) {\n                if ($this-&gt;$condition) {\n                    $this-&gt;fillable = array_merge($this-&gt;fillable, $fields);\n                }\n            }\n\n            \/\/ \u30ab\u30b9\u30bf\u30e0\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u7528\n            $this-&gt;applyCustomFillablePolicy();\n        }\n\n        \/**\n         * \u30ab\u30b9\u30bf\u30e0\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u7528\n         *\/\n        protected function applyCustomFillablePolicy(): void\n        {\n            $user = auth()-&gt;user();\n\n            if ($user &amp;&amp; method_exists($this, 'getFillableForUser')) {\n                $this-&gt;fillable = array_intersect(\n                    $this-&gt;fillable,\n                    $this-&gt;getFillableForUser($user)\n                );\n            }\n        }\n    }\n\n    \/**\n     * \u4f7f\u7528\u4f8b\n     *\/\n    class Product extends DynamicModel\n    {\n        use ConditionalFillable;\n\n        public function __construct(array $attributes = [])\n        {\n            parent::__construct($attributes);\n\n            \/\/ \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306b\u57fa\u3065\u3044\u3066\u521d\u671f\u5316\n            $context = $this-&gt;determineContext();\n            $this-&gt;initializeFillable($context);\n        }\n\n        \/**\n         * \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u5224\u5b9a\n         *\/\n        protected function determineContext(): string\n        {\n            if (request()-&gt;is('api\/*')) {\n                return 'api';\n            }\n\n            if (auth()-&gt;user()?-&gt;isAdmin()) {\n                return 'admin';\n            }\n\n            return 'default';\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30b3\u30fc\u30d7\u3068\u306e\u4f75\u7528<\/h3>\n\n\n\n<p>Fillable\u3068\u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30b3\u30fc\u30d7\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u9ad8\u5ea6\u306a\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=\"\">\/**\n * \u30bd\u30d5\u30c8\u30c7\u30ea\u30fc\u30c8 + \u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8\u74b0\u5883\u3067\u306e\u5b9f\u88c5\u4f8b\n *\/\nclass TenantScope implements Scope\n{\n    public function apply(Builder $builder, Model $model)\n    {\n        if (auth()-&gt;check()) {\n            $builder-&gt;where('tenant_id', auth()-&gt;user()-&gt;tenant_id);\n        }\n    }\n}\n\nclass TenantAwareFillable extends Model\n{\n    use SoftDeletes;\n\n    protected static function boot()\n    {\n        parent::boot();\n        static::addGlobalScope(new TenantScope);\n    }\n\n    \/**\n     * \u30c6\u30ca\u30f3\u30c8\u5225\u306eFillable\u5236\u5fa1\n     *\/\n    protected function initializeTenantFillable()\n    {\n        if (auth()-&gt;check()) {\n            $tenant = auth()-&gt;user()-&gt;tenant;\n\n            \/\/ \u30c6\u30ca\u30f3\u30c8\u8a2d\u5b9a\u306b\u57fa\u3065\u304fFillable\u5236\u5fa1\n            $this-&gt;fillable = array_merge(\n                $this-&gt;fillable,\n                $tenant-&gt;allowed_fields ?? []\n            );\n\n            \/\/ \u30c6\u30ca\u30f3\u30c8\u56fa\u6709\u306e\u5236\u9650\u306e\u9069\u7528\n            if ($tenant-&gt;restrictions) {\n                $this-&gt;fillable = array_diff(\n                    $this-&gt;fillable,\n                    $tenant-&gt;restrictions\n                );\n            }\n        }\n    }\n\n    \/**\n     * \u30a4\u30d9\u30f3\u30c8\u30d9\u30fc\u30b9\u306eFillable\u5236\u5fa1\n     *\/\n    protected static function booted()\n    {\n        static::saving(function ($model) {\n            $model-&gt;tenant_id = auth()-&gt;user()-&gt;tenant_id;\n        });\n\n        static::updating(function ($model) {\n            if ($model-&gt;isDirty('tenant_id')) {\n                throw new \\RuntimeException(\n                    'Cannot change tenant_id'\n                );\n            }\n        });\n    }\n\n    \/**\n     * \u4e00\u62ec\u66f4\u65b0\u306e\u62e1\u5f35\n     *\/\n    public function fill(array $attributes)\n    {\n        \/\/ \u30c6\u30ca\u30f3\u30c8ID\u306e\u81ea\u52d5\u8a2d\u5b9a\n        if (!isset($attributes['tenant_id'])) {\n            $attributes['tenant_id'] = auth()-&gt;user()-&gt;tenant_id;\n        }\n\n        \/\/ \u30c6\u30ca\u30f3\u30c8\u56fa\u6709\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n        $this-&gt;validateTenantAttributes($attributes);\n\n        return parent::fill($attributes);\n    }\n\n    \/**\n     * \u30c6\u30ca\u30f3\u30c8\u56fa\u6709\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n     *\/\n    protected function validateTenantAttributes(array $attributes)\n    {\n        $tenant = auth()-&gt;user()-&gt;tenant;\n\n        \/\/ \u30c6\u30ca\u30f3\u30c8\u56fa\u6709\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\n        $rules = $tenant-&gt;validation_rules ?? [];\n\n        if (!empty($rules)) {\n            $validator = Validator::make($attributes, $rules);\n\n            if ($validator-&gt;fails()) {\n                throw new ValidationException($validator);\n            }\n        }\n    }\n\n    \/**\n     * \u30ab\u30b9\u30bf\u30e0\u30af\u30a8\u30ea\u30b9\u30b3\u30fc\u30d7\n     *\/\n    public function scopeWithTenantContext($query)\n    {\n        return $query-&gt;with(['tenant' =&gt; function ($q) {\n            $q-&gt;select(['id', 'name', 'settings']);\n        }]);\n    }\n}\n\n\/**\n * \u4f7f\u7528\u4f8b\n *\/\nclass Document extends TenantAwareFillable\n{\n    protected $fillable = [\n        'title',\n        'content',\n        'status',\n    ];\n\n    public function tenant()\n    {\n        return $this-&gt;belongsTo(Tenant::class);\n    }\n\n    \/**\n     * \u30c6\u30ca\u30f3\u30c8\u56fa\u6709\u306e\u51e6\u7406\n     *\/\n    public function processWithTenantContext()\n    {\n        $tenant = $this-&gt;tenant;\n\n        if ($tenant-&gt;hasFeature('document_versioning')) {\n            $this-&gt;createVersion();\n        }\n\n        if ($tenant-&gt;hasFeature('document_approval')) {\n            $this-&gt;initiateApprovalFlow();\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u9ad8\u5ea6\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u67d4\u8edf\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001\u3053\u308c\u307e\u3067\u306e\u5185\u5bb9\u3092\u307e\u3068\u3081\u308b\u30bb\u30af\u30b7\u30e7\u30f3\u306b\u79fb\u308a\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-28\">\u307e\u3068\u3081\uff1a\u30bb\u30ad\u30e5\u30a2\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30c6\u30af\u30cb\u30c3\u30af\u8a2d\u8a08\u306e\u305f\u3081\u306b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">Fillable\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u5b9f\u88c5\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001Fillable\u306e\u5b9f\u88c5\u304c\u9069\u5207\u306b\u884c\u308f\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u30c1\u30a7\u30c3\u30af\u9805\u76ee<\/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=\"\">\/**\n * \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\u5b9f\u88c5\u4f8b\n *\/\ntrait FillableSecurityCheck\n{\n    public function runSecurityCheck(): array\n    {\n        $results = [];\n\n        \/\/ 1. \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u5c5e\u6027\u306e\u4fdd\u8b77\n        $sensitiveFields = ['password', 'remember_token', 'api_key'];\n        $exposedFields = array_intersect($this-&gt;getFillable(), $sensitiveFields);\n\n        if (!empty($exposedFields)) {\n            $results['sensitive_fields'] = [\n                'status' =&gt; 'warning',\n                'message' =&gt; 'Sensitive fields found in fillable: ' . implode(', ', $exposedFields)\n            ];\n        }\n\n        \/\/ 2. Mass Assignment\u8106\u5f31\u6027\u30c1\u30a7\u30c3\u30af\n        if (empty($this-&gt;fillable) &amp;&amp; empty($this-&gt;guarded)) {\n            $results['mass_assignment'] = [\n                'status' =&gt; 'error',\n                'message' =&gt; 'Neither fillable nor guarded is set'\n            ];\n        }\n\n        return $results;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">\u5b9f\u88c5\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u3059\u3079\u3066\u306e\u30e2\u30c7\u30eb\u3067<code>$fillable<\/code>\u307e\u305f\u306f<code>$guarded<\/code>\u304c\u660e\u793a\u7684\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u5c5e\u6027\u304c<code>$fillable<\/code>\u304b\u3089\u9664\u5916\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u4e3b\u30ad\u30fc\u3084\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u304c\u9069\u5207\u306b\u4fdd\u8b77\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u5c5e\u6027\u306e\u578b\u304c<code>PHPDoc<\/code>\u3067\u660e\u8a18\u3055\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Mass Assignment\u8106\u5f31\u6027\u3078\u306e\u5bfe\u7b56\u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u9023\u643a\u3057\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u30dd\u30ea\u30b7\u30fc\u306b\u3088\u308b\u6a29\u9650\u5236\u5fa1\u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u66f4\u65b0\u5c65\u6b74\u306e\u30ed\u30b0\u304c\u6b8b\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fdd\u5b88\u6027\u306e\u78ba\u8a8d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u30b3\u30fc\u30c9\u306b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u304c\u4ed8\u4e0e\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u30c6\u30b9\u30c8\u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u5c5e\u6027\u306e\u5909\u66f4\u304c\u8ffd\u8de1\u53ef\u80fd\u306b\u306a\u3063\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u304c\u9069\u5207\u306b\u7ba1\u7406\u3055\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u4e0d\u8981\u306a\u5c5e\u6027\u306e\u30ed\u30fc\u30c9\u3092\u907f\u3051\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] N+1\u554f\u984c\u306b\u5bfe\u51e6\u3057\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u9069\u5207\u306b\u5229\u7528\u3057\u3066\u3044\u308b<\/li>\n\n\n\n<li>[ ] \u30af\u30a8\u30ea\u306e\u6700\u9069\u5316\u304c\u884c\u308f\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-32\">\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u306e\u7d39\u4ecb<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Laravel\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8: Eloquent\u30e2\u30c7\u30eb<\/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=\"\">  \/\/ \u4f8b\uff1a\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\n  use Illuminate\\Database\\Eloquent\\Model;\n\n  class Article extends Model\n  {\n      \/**\n       * @link https:\/\/laravel.com\/docs\/eloquent\n       *\/\n      protected $fillable = [\n          'title',\n          'body',\n      ];\n  }<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\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=\"\">\/**\n * \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\n * @see https:\/\/owasp.org\/www-project-top-ten\/\n *\/\nclass SecureModel extends Model\n{\n    use FillableSecurityCheck;\n\n    protected function bootSecurityFeatures()\n    {\n        \/\/ 1. \u5165\u529b\u5024\u306e\u691c\u8a3c\n        static::saving(function ($model) {\n            $model-&gt;validateSensitiveData();\n        });\n\n        \/\/ 2. \u5909\u66f4\u306e\u76e3\u67fb\n        static::updated(function ($model) {\n            $model-&gt;auditChanges();\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u96c6<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u57fa\u672c\u30d1\u30bf\u30fc\u30f3<\/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=\"\">   protected $fillable = ['name', 'email'];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u52d5\u7684\u30d1\u30bf\u30fc\u30f3<\/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=\"\">   public function getFillable()\n   {\n       return array_merge(\n           parent::getFillable(),\n           $this-&gt;getContextualFillable()\n       );\n   }<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30dd\u30ea\u30b7\u30fc\u9023\u643a\u30d1\u30bf\u30fc\u30f3<\/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=\"\">   protected static function booted()\n   {\n       static::saving(function ($model) {\n           if (! auth()-&gt;user()-&gt;can('update', $model)) {\n               throw new AuthorizationException;\n           }\n       });\n   }<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">\u958b\u767a\u30c4\u30fc\u30eb<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Laravel Debugbar: \u30af\u30a8\u30ea\u3068\u5c5e\u6027\u306e\u30c7\u30d0\u30c3\u30b0<\/li>\n\n\n\n<li>PHPStan: \u9759\u7684\u89e3\u6790\u306b\u3088\u308b\u30a8\u30e9\u30fc\u691c\u51fa<\/li>\n\n\n\n<li>Laravel IDE Helper: IDE\u88dc\u5b8c\u306e\u5f37\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u6700\u5f8c\u306b<\/h3>\n\n\n\n<p>Fillable\u306e\u9069\u5207\u306a\u5b9f\u88c5\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u4fdd\u5b88\u6027\u3092\u5927\u304d\u304f\u5de6\u53f3\u3057\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u30d1\u30bf\u30fc\u30f3\u3092\u53c2\u8003\u306b\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u6700\u9069\u306a\u5b9f\u88c5\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>\u307e\u305f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306f\u5e38\u306b\u9032\u5316\u3057\u3066\u3044\u304f\u3082\u306e\u3067\u3059\u3002\u5b9a\u671f\u7684\u306b\u5b9f\u88c5\u3092\u898b\u76f4\u3057\u3001\u65b0\u3057\u3044\u8106\u5f31\u6027\u3084\u5bfe\u7b56\u306b\u3064\u3044\u3066\u60c5\u5831\u3092\u30ad\u30e3\u30c3\u30c1\u30a2\u30c3\u30d7\u3059\u308b\u3053\u3068\u3092\u63a8\u5968\u3057\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=\"\">\/\/ \u7d99\u7d9a\u7684\u306a\u6539\u5584\u306e\u305f\u3081\u306e\u30b3\u30e1\u30f3\u30c8\u4f8b\n\/**\n * @todo \u5b9a\u671f\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ec\u30d3\u30e5\u30fc\n * @todo \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\n * @todo \u30c6\u30b9\u30c8\u30ab\u30d0\u30ec\u30c3\u30b8\u306e\u5411\u4e0a\n *\/<\/pre>\n\n\n\n<p>\u3053\u306e\u8a18\u4e8b\u304c\u3001\u3088\u308a\u5b89\u5168\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044Laravel\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306e\u4e00\u52a9\u3068\u306a\u308c\u3070\u5e78\u3044\u3067\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-2590","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\/2590","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=2590"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2590\/revisions"}],"predecessor-version":[{"id":2592,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2590\/revisions\/2592"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}