{"id":2584,"date":"2025-03-24T08:46:59","date_gmt":"2025-03-23T23:46:59","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2584"},"modified":"2025-03-24T08:47:28","modified_gmt":"2025-03-23T23:47:28","slug":"laravel-filament%e3%81%a7%e5%ae%9f%e7%8f%be%e3%81%99%e3%82%8b%e9%ab%98%e6%a9%9f%e8%83%bd%e3%81%aa%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e9%96%8b%e7%99%ba-%e3%80%8c%e5%b0%8e%e5%85%a5%e3%81%8b%e3%82%89","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2584","title":{"rendered":"Laravel Filament\u3067\u5b9f\u73fe\u3059\u308b\u9ad8\u6a5f\u80fd\u306a\u7ba1\u7406\u753b\u9762\u958b\u767a | \u300c\u5c0e\u5165\u304b\u3089\u5b9f\u88c5\u307e\u3067\u5b8c\u5168\u30ac\u30a4\u30c9"},"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 Filament\u3068\u306f\uff1a\u7ba1\u7406\u753b\u9762\u958b\u767a\u306e\u9769\u65b0\u7684\u30c4\u30fc\u30eb<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u5f93\u6765\u306e\u7ba1\u7406\u753b\u9762\u958b\u767a\u306b\u304a\u3051\u308b\u8ab2\u984c\u3068\u89e3\u6c7a\u7b56<\/a>      <\/li>      <li>        <a href=\"#i-2\">Filament\u304c\u63d0\u4f9b\u3059\u308b\u4e3b\u8981\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u4ed6\u306e\u7ba1\u7406\u753b\u9762\u30d1\u30c3\u30b1\u30fc\u30b8\u3068\u306e\u6bd4\u8f03<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Filament\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u521d\u671f\u8a2d\u5b9a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u5fc5\u8981\u306a\u8981\u4ef6\u3068\u958b\u767a\u74b0\u5883\u306e\u6e96\u5099<\/a>      <\/li>      <li>        <a href=\"#i-6\">Composer \u3092\u4f7f\u7528\u3057\u305f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u521d\u671f\u8a2d\u5b9a\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-13\">\u57fa\u672c\u7684\u306aCRUD\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-14\">\u30ea\u30bd\u30fc\u30b9\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u3068\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u30d5\u30a9\u30fc\u30e0\u306e\u4f5c\u6210\u3068\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u5b9f\u8df5\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-23\">\u9ad8\u6a5f\u80fd\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-24\">\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u306e\u6d3b\u7528\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-27\">\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-30\">\u30c6\u30fc\u30de\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3068UI\u306e\u6539\u5584<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-33\">\u5b9f\u8df5\u7684\u306a\u958b\u767a\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-34\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-37\">\u30c6\u30b9\u30c8\u306e\u66f8\u304d\u8fbc\u307f\u3068\u81ea\u52d5\u5316\u306e\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-40\">\u5b9f\u52d9\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5b9f\u8df5\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-44\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-45\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-49\">\u30d0\u30fc\u30b8\u30e7\u30f3\u30a2\u30c3\u30d7\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-52\">\u9577\u671f\u904b\u7528\u306e\u305f\u3081\u306e\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u65b9\u6cd5<\/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 Filament\u3068\u306f\uff1a\u7ba1\u7406\u753b\u9762\u958b\u767a\u306e\u9769\u65b0\u7684\u30c4\u30fc\u30eb<\/h2>\n\n\n\n<p>Laravel Filament\u306f\u3001PHP\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30afLaravel\u3067\u9ad8\u54c1\u8cea\u306a\u7ba1\u7406\u753b\u9762\uff08\u7ba1\u7406\u30d1\u30cd\u30eb\uff09\u3092\u7d20\u65e9\u304f\u958b\u767a\u3059\u308b\u305f\u3081\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u306e\u30a2\u30c9\u30df\u30f3\u69cb\u7bc9\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u3059\u3002\u5f93\u6765\u306e\u7ba1\u7406\u753b\u9762\u958b\u767a\u3067\u76f4\u9762\u3057\u3066\u3044\u305f\u7169\u96d1\u306a\u5b9f\u88c5\u4f5c\u696d\u3084\u4fdd\u5b88\u6027\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3057\u3001\u958b\u767a\u8005\u304c\u672c\u8cea\u7684\u306a\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306b\u96c6\u4e2d\u3067\u304d\u308b\u74b0\u5883\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u5f93\u6765\u306e\u7ba1\u7406\u753b\u9762\u958b\u767a\u306b\u304a\u3051\u308b\u8ab2\u984c\u3068\u89e3\u6c7a\u7b56<\/h3>\n\n\n\n<p>\u7ba1\u7406\u753b\u9762\u958b\u767a\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8ab2\u984c\u304c\u5e38\u306b\u3064\u304d\u307e\u3068\u3063\u3066\u3044\u307e\u3057\u305f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u5de5\u6570\u306e\u81a8\u5927\u3055<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u306e\u4e00\u89a7\u8868\u793a\u3001\u691c\u7d22\u3001\u30bd\u30fc\u30c8\u6a5f\u80fd\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30d5\u30a9\u30fc\u30e0\u4f5c\u6210\u3068\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u51e6\u7406<\/li>\n\n\n\n<li>\u6a29\u9650\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fdd\u5b88\u6027\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6a5f\u80fd\u8ffd\u52a0\u6642\u306e\u30b3\u30fc\u30c9\u8907\u96d1\u5316<\/li>\n\n\n\n<li>UI\u306e\u4e00\u8cab\u6027\u7dad\u6301\u306e\u96e3\u3057\u3055<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u4f5c\u6210\u3068\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<p>Filament\u306f\u3001\u3053\u308c\u3089\u306e\u8ab2\u984c\u306b\u5bfe\u3057\u3066\u4ee5\u4e0b\u306e\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u3092\u63d0\u4f9b\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u81ea\u52d5\u751f\u6210\u3055\u308c\u308b\u7ba1\u7406\u753b\u9762<\/strong>\uff1a\u30e2\u30c7\u30eb\u306e\u5b9a\u7fa9\u3060\u3051\u3067\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u753b\u9762\u3092\u81ea\u52d5\u751f\u6210<\/li>\n\n\n\n<li><strong>\u8c4a\u5bcc\u306aUI\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/strong>\uff1a\u4e00\u8cab\u6027\u306e\u3042\u308b\u30c7\u30b6\u30a4\u30f3\u306e\u7ba1\u7406\u753b\u9762\u3092\u7d20\u65e9\u304f\u69cb\u7bc9\u53ef\u80fd<\/li>\n\n\n\n<li><strong>\u67d4\u8edf\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/strong>\uff1a\u30d3\u30b8\u30cd\u30b9\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u305f\u62e1\u5f35\u304c\u5bb9\u6613<\/li>\n\n\n\n<li><strong>\u5805\u7262\u306a\u6a29\u9650\u7ba1\u7406<\/strong>\uff1aLaravel\u6a19\u6e96\u306e\u8a8d\u8a3c\u6a5f\u80fd\u3068\u306e seamless \u306a\u7d71\u5408<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Filament\u304c\u63d0\u4f9b\u3059\u308b\u4e3b\u8981\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30cd\u30eb\u30d3\u30eb\u30c0\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\uff08CRUD\uff09\u7ba1\u7406<\/li>\n\n\n\n<li>\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8<\/li>\n\n\n\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u691c\u7d22<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u30da\u30fc\u30b8\u4f5c\u6210<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d5\u30a9\u30fc\u30e0\u30d3\u30eb\u30c0\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>40\u7a2e\u985e\u4ee5\u4e0a\u306e\u30d5\u30a9\u30fc\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/li>\n\n\n\n<li>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306e\u7d71\u5408<\/li>\n\n\n\n<li>\u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u51e6\u7406<\/li>\n\n\n\n<li>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u7c21\u7d20\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30fc\u30d6\u30eb\u30d3\u30eb\u30c0\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9ad8\u5ea6\u306a\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u30a2\u30af\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30d0\u30eb\u30af\u64cd\u4f5c<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b7\u30d6\u5bfe\u5fdc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\u30fb\u8a8d\u53ef<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RBAC\u306b\u3088\u308b\u6a29\u9650\u7ba1\u7406<\/li>\n\n\n\n<li>\u30dd\u30ea\u30b7\u30fc\u30d9\u30fc\u30b9\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u8a8d\u8a3c\u306e\u7d71\u5408<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u4ed6\u306e\u7ba1\u7406\u753b\u9762\u30d1\u30c3\u30b1\u30fc\u30b8\u3068\u306e\u6bd4\u8f03<\/h3>\n\n\n<div id=\"id-5c2a09ac-da6b-4cf5-b4db-630e05e6b056\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>Filament<\/th><th>Nova<\/th><th>Voyager<\/th><\/tr><\/thead><tbody><tr><td>\u4fa1\u683c<\/td><td>\u7121\u6599<\/td><td>\u6709\u6599<\/td><td>\u7121\u6599<\/td><\/tr><tr><td>\u5b66\u7fd2\u66f2\u7dda<\/td><td>\u7de9\u3084\u304b<\/td><td>\u4e2d\u7a0b\u5ea6<\/td><td>\u6025<\/td><\/tr><tr><td>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/td><td>\u9ad8<\/td><td>\u4e2d<\/td><td>\u4f4e<\/td><\/tr><tr><td>\u30b3\u30df\u30e5\u30cb\u30c6\u30a3<\/td><td>\u6d3b\u767a<\/td><td>\u6d3b\u767a<\/td><td>\u4f4e\u8abf<\/td><\/tr><tr><td>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/td><td>\u5145\u5b9f<\/td><td>\u5145\u5b9f<\/td><td>\u666e\u901a<\/td><\/tr><tr><td>UI\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u6570<\/td><td>\u591a\u3044<\/td><td>\u4e2d\u7a0b\u5ea6<\/td><td>\u5c11\u306a\u3044<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>Filament\u306e\u7279\u7b46\u3059\u3079\u304d\u5f37\u307f\u306f\u3001\u7121\u6599\u3067\u3042\u308a\u306a\u304c\u3089\u9ad8\u5ea6\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u304c\u53ef\u80fd\u306a\u70b9\u3067\u3059\u3002\u307e\u305f\u3001\u6d3b\u767a\u306a\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u306b\u3088\u308b\u7d99\u7d9a\u7684\u306a\u6539\u5584\u3068\u3001\u5145\u5b9f\u3057\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u3088\u308a\u3001\u958b\u767a\u8005\u306f\u5fc5\u8981\u306a\u60c5\u5831\u3084\u30b5\u30dd\u30fc\u30c8\u3092\u5bb9\u6613\u306b\u5f97\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306bFilament\u3092\u5c0e\u5165\u3057\u3001\u57fa\u672c\u7684\u306a\u8a2d\u5b9a\u3092\u884c\u3046\u624b\u9806\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Filament\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u521d\u671f\u8a2d\u5b9a<\/h2>\n\n\n\n<p>Filament\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u9069\u5207\u306a\u74b0\u5883\u69cb\u7bc9\u3068\u521d\u671f\u8a2d\u5b9a\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u958b\u767a\u74b0\u5883\u306e\u6e96\u5099\u304b\u3089\u521d\u671f\u8a2d\u5b9a\u307e\u3067\u3001\u9806\u3092\u8ffd\u3063\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u5fc5\u8981\u306a\u8981\u4ef6\u3068\u958b\u767a\u74b0\u5883\u306e\u6e96\u5099<\/h3>\n\n\n\n<p>Filament\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u8981\u4ef6\u3092\u6e80\u305f\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<p><strong>\u5fc5\u9808\u8981\u4ef6\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHP 8.1\u4ee5\u4e0a<\/li>\n\n\n\n<li>Laravel 10.0\u4ee5\u4e0a<\/li>\n\n\n\n<li>Composer 2.0\u4ee5\u4e0a<\/li>\n\n\n\n<li>Node.js 16\u4ee5\u4e0a<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff08MySQL\u3001PostgreSQL\u3001SQLite\u306e\u3044\u305a\u308c\u304b\uff09<\/li>\n<\/ul>\n\n\n\n<p><strong>\u63a8\u5968\u8981\u4ef6\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\uff1a2GB\u4ee5\u4e0a\u306eRAM<\/li>\n\n\n\n<li>\u30b9\u30c8\u30ec\u30fc\u30b8\uff1a\u7a7a\u304d\u5bb9\u91cf1GB\u4ee5\u4e0a<\/li>\n\n\n\n<li>\u30e2\u30c0\u30f3\u306a\u30d6\u30e9\u30a6\u30b6\uff08Chrome\u3001Firefox\u3001Safari\u3001Edge\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806\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=\"\"># Laravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\ncomposer create-project laravel\/laravel filament-admin\n\n# \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3078\u79fb\u52d5\ncd filament-admin\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a\n# .env\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u60c5\u5831\u3092\u8a2d\u5b9a\nDB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=filament_admin\nDB_USERNAME=root\nDB_PASSWORD=<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">Composer \u3092\u4f7f\u7528\u3057\u305f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/h3>\n\n\n\n<p>Filament\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u3001Composer\u3092\u4f7f\u7528\u3057\u3066\u7c21\u5358\u306b\u884c\u3048\u307e\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=\"\"># Filament\u672c\u4f53\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require filament\/filament:\"^3.0\"\n\n# \u30d1\u30cd\u30eb\u4f5c\u6210\u306b\u5fc5\u8981\u306a\u30a2\u30bb\u30c3\u30c8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nphp artisan filament:install --panels\n\n# \u30a2\u30bb\u30c3\u30c8\u306e\u30d3\u30eb\u30c9\nnpm install\nnpm run build<\/pre>\n\n\n\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5f8c\u306e\u78ba\u8a8d\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>config\/filament.php<\/code> \u306e\u5b58\u5728\u78ba\u8a8d<\/li>\n\n\n\n<li><code>resources\/css<\/code> \u3068 <code>resources\/js<\/code> \u306bFilament\u306e\u30a2\u30bb\u30c3\u30c8\u304c\u8ffd\u52a0\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li><code>database\/migrations<\/code> \u306b\u30e6\u30fc\u30b6\u30fc\u30c6\u30fc\u30d6\u30eb\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308b\u304b<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u521d\u671f\u8a2d\u5b9a\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">1. \u7ba1\u7406\u8005\u30e6\u30fc\u30b6\u30fc\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=\"\"># \u7ba1\u7406\u8005\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\u30b3\u30de\u30f3\u30c9\nphp artisan make:filament-user\n\n# \u307e\u305f\u306f\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067\u30b7\u30fc\u30c0\u30fc\u3092\u4f5c\u6210\nphp artisan make:seeder AdminUserSeeder\n\n# AdminUserSeeder.php\u306e\u5185\u5bb9\nnamespace Database\\Seeders;\n\nuse App\\Models\\User;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\Hash;\n\nclass AdminUserSeeder extends Seeder\n{\n    public function run(): void\n    {\n        User::create([\n            'name' =&gt; 'Admin User',\n            'email' =&gt; 'admin@example.com',\n            'password' =&gt; Hash::make('password'),\n        ]);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-9\">2. \u30d1\u30cd\u30eb\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/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\/Providers\/Filament\/AdminPanelProvider.php\n\npublic function panel(Panel $panel): Panel\n{\n    return $panel\n        -&gt;default()\n        -&gt;id('admin')\n        -&gt;path('admin')  \/\/ URL\u30d1\u30b9\u306e\u8a2d\u5b9a\n        -&gt;login()  \/\/ \u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd\u306e\u6709\u52b9\u5316\n        -&gt;colors([\n            'primary' =&gt; Color::Amber,\n        ])\n        -&gt;discoverResources(in: app_path('Filament\/Resources'))\n        -&gt;discoverPages(in: app_path('Filament\/Pages'))\n        -&gt;pages([\n            Pages\\Dashboard::class,\n        ])\n        -&gt;middleware([\n            EncryptCookies::class,\n            AddQueuedCookiesToResponse::class,\n            StartSession::class,\n            AuthenticateSession::class,\n            ShareErrorsFromSession::class,\n            VerifyCsrfToken::class,\n            SubstituteBindings::class,\n            DisableBladeIconComponents::class,\n            DispatchServingFilamentEvent::class,\n        ]);\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-10\">3. \u591a\u8a00\u8a9e\u5bfe\u5fdc\u306e\u8a2d\u5b9a<\/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=\"\">\/\/ config\/app.php\n'locale' =&gt; 'ja',\n'fallback_locale' =&gt; 'en',\n\n\/\/ \u8a00\u8a9e\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\n\/\/ lang\/ja\/filament.php\nreturn [\n    'pages' =&gt; [\n        'dashboard' =&gt; [\n            'title' =&gt; '\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9',\n        ],\n    ],\n    'resources' =&gt; [\n        'title' =&gt; '\u30ea\u30bd\u30fc\u30b9',\n    ],\n];<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">4. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/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=\"\"># \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\nphp artisan migrate\n\n# \u30c6\u30fc\u30d6\u30eb\u306e\u78ba\u8a8d\nphp artisan db:show\n\n# \u30b7\u30fc\u30c0\u30fc\u306e\u5b9f\u884c\uff08\u7ba1\u7406\u8005\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\uff09\nphp artisan db:seed --class=AdminUserSeeder<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f37\u529b\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>HTTPS\u5f37\u5236\u306e\u8a2d\u5b9a<\/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>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a2\u30bb\u30c3\u30c8\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u74b0\u5883\u56fa\u6709\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u8abf\u6574<\/li>\n\n\n\n<li>\u958b\u767a\u7528\u306e\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001<code>http:\/\/localhost\/admin<\/code> \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u7ba1\u7406\u753b\u9762\u304c\u6b63\u3057\u304f\u8868\u793a\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-13\">\u57fa\u672c\u7684\u306aCRUD\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<p>Filament\u3092\u4f7f\u7528\u3057\u305fCRUD\uff08Create, Read, Update, Delete\uff09\u64cd\u4f5c\u306e\u5b9f\u88c5\u306b\u3064\u3044\u3066\u3001\u5b9f\u8df5\u7684\u306a\u4f8b\u3092\u4ea4\u3048\u306a\u304c\u3089\u89e3\u8aac\u3057\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u3001\u4e00\u822c\u7684\u306a\u300c\u5546\u54c1\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u300d\u3092\u4f8b\u306b\u3001\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u624b\u9806\u304b\u3089\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u307e\u3067\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30ea\u30bd\u30fc\u30b9\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u3068\u8a2d\u5b9a<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">1. \u30e2\u30c7\u30eb\u3068\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u6e96\u5099<\/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=\"\"># \u5546\u54c1\u30e2\u30c7\u30eb\u3068\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\nphp artisan make:model Product -m\n\n# Filament\u30ea\u30bd\u30fc\u30b9\u306e\u4f5c\u6210\nphp artisan make:filament-resource Product<\/pre>\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=\"\">\/\/ database\/migrations\/xxxx_xx_xx_create_products_table.php\npublic function up(): void\n{\n    Schema::create('products', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;string('name');\n        $table-&gt;text('description')-&gt;nullable();\n        $table-&gt;decimal('price', 10, 2);\n        $table-&gt;integer('stock')-&gt;default(0);\n        $table-&gt;boolean('is_active')-&gt;default(true);\n        $table-&gt;string('category')-&gt;nullable();\n        $table-&gt;timestamps();\n    });\n}\n\n\/\/ app\/Models\/Product.php\nclass Product extends Model\n{\n    protected $fillable = [\n        'name',\n        'description',\n        'price',\n        'stock',\n        'is_active',\n        'category'\n    ];\n\n    protected $casts = [\n        'price' =&gt; 'decimal:2',\n        'is_active' =&gt; 'boolean',\n    ];\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">2. \u30ea\u30bd\u30fc\u30b9\u30af\u30e9\u30b9\u306e\u8a2d\u5b9a<\/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\/Filament\/Resources\/ProductResource.php\nuse Filament\\Resources\\Resource;\nuse Filament\\Tables;\nuse Filament\\Forms;\n\nclass ProductResource extends Resource\n{\n    protected static ?string $model = Product::class;\n    protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';\n    protected static ?string $navigationGroup = '\u5546\u54c1\u7ba1\u7406';\n    protected static ?int $navigationSort = 1;\n\n    public static function form(Form $form): Form\n    {\n        return $form\n            -&gt;schema([\n                Forms\\Components\\Card::make()\n                    -&gt;schema([\n                        Forms\\Components\\TextInput::make('name')\n                            -&gt;label('\u5546\u54c1\u540d')\n                            -&gt;required()\n                            -&gt;maxLength(255),\n                        Forms\\Components\\RichEditor::make('description')\n                            -&gt;label('\u5546\u54c1\u8aac\u660e')\n                            -&gt;columnSpan('full'),\n                        Forms\\Components\\TextInput::make('price')\n                            -&gt;label('\u4fa1\u683c')\n                            -&gt;required()\n                            -&gt;numeric()\n                            -&gt;prefix('\u00a5'),\n                        Forms\\Components\\TextInput::make('stock')\n                            -&gt;label('\u5728\u5eab\u6570')\n                            -&gt;numeric()\n                            -&gt;default(0),\n                        Forms\\Components\\Select::make('category')\n                            -&gt;label('\u30ab\u30c6\u30b4\u30ea\u30fc')\n                            -&gt;options([\n                                'electronics' =&gt; '\u96fb\u5316\u88fd\u54c1',\n                                'clothing' =&gt; '\u8863\u985e',\n                                'food' =&gt; '\u98df\u54c1',\n                            ]),\n                        Forms\\Components\\Toggle::make('is_active')\n                            -&gt;label('\u8ca9\u58f2\u72b6\u614b')\n                            -&gt;default(true),\n                    ])\n                    -&gt;columns(2)\n            ]);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30d5\u30a9\u30fc\u30e0\u306e\u4f5c\u6210\u3068\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">1. \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\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\/Filament\/Resources\/ProductResource.php\nuse Illuminate\\Validation\\Rules\\Unique;\n\npublic static function form(Form $form): Form\n{\n    return $form\n        -&gt;schema([\n            Forms\\Components\\TextInput::make('name')\n                -&gt;label('\u5546\u54c1\u540d')\n                -&gt;required()\n                -&gt;maxLength(255)\n                -&gt;unique(ignoreRecord: true)\n                -&gt;rules([\n                    fn () =&gt; new Unique('products', 'name')\n                ]),\n            Forms\\Components\\TextInput::make('price')\n                -&gt;label('\u4fa1\u683c')\n                -&gt;required()\n                -&gt;numeric()\n                -&gt;rules([\n                    'min:0',\n                    'max:999999999'\n                ])\n                -&gt;mask(fn (Forms\\Components\\TextInput\\Mask $mask) =&gt; $mask\n                    -&gt;numeric()\n                    -&gt;thousandsSeparator(',')\n                ),\n        ]);\n}\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u5b9a\nprotected function getMessages(): array\n{\n    return [\n        'name.required' =&gt; '\u5546\u54c1\u540d\u306f\u5fc5\u9808\u3067\u3059',\n        'name.unique' =&gt; '\u3053\u306e\u5546\u54c1\u540d\u306f\u65e2\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059',\n        'price.min' =&gt; '\u4fa1\u683c\u306f0\u4ee5\u4e0a\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044',\n    ];\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u5b9f\u8df5\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">1. \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9a\u7fa9<\/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\/Product.php\npublic function category()\n{\n    return $this-&gt;belongsTo(Category::class);\n}\n\npublic function images()\n{\n    return $this-&gt;hasMany(ProductImage::class);\n}\n\n\/\/ app\/Filament\/Resources\/ProductResource.php\nuse Filament\\Forms\\Components\\SpatieMediaLibraryFileUpload;\n\npublic static function form(Form $form): Form\n{\n    return $form\n        -&gt;schema([\n            \/\/ ... \u4ed6\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\n            Forms\\Components\\Select::make('category_id')\n                -&gt;relationship('category', 'name')\n                -&gt;searchable()\n                -&gt;preload(),\n            SpatieMediaLibraryFileUpload::make('images')\n                -&gt;label('\u5546\u54c1\u753b\u50cf')\n                -&gt;multiple()\n                -&gt;maxFiles(5)\n                -&gt;image()\n                -&gt;imageResizeMode('cover')\n                -&gt;imageCropAspectRatio('16:9')\n                -&gt;imageResizeTargetWidth('1920')\n                -&gt;imageResizeTargetHeight('1080'),\n        ]);\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-21\">2. \u4e00\u62ec\u64cd\u4f5c\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\/Filament\/Resources\/ProductResource.php\nuse Filament\\Tables\\Actions\\BulkAction;\nuse Illuminate\\Database\\Eloquent\\Collection;\n\npublic static function table(Table $table): Table\n{\n    return $table\n        -&gt;columns([\n            \/\/ ... \u30ab\u30e9\u30e0\u306e\u5b9a\u7fa9\n        ])\n        -&gt;bulkActions([\n            Tables\\Actions\\DeleteBulkAction::make(),\n            BulkAction::make('updateStock')\n                -&gt;label('\u5728\u5eab\u6570\u66f4\u65b0')\n                -&gt;icon('heroicon-o-arrow-path')\n                -&gt;action(function (Collection $records, array $data): void {\n                    $records-&gt;each(function ($record) use ($data): void {\n                        $record-&gt;update([\n                            'stock' =&gt; $data['stock'],\n                        ]);\n                    });\n                })\n                -&gt;form([\n                    Forms\\Components\\TextInput::make('stock')\n                        -&gt;label('\u5728\u5eab\u6570')\n                        -&gt;required()\n                        -&gt;numeric()\n                        -&gt;default(0),\n                ]),\n        ]);\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\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>Eager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/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>\u5165\u529b\u5024\u306e\u9069\u5207\u306a\u30b5\u30cb\u30bf\u30a4\u30ba<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>CSRF\u30c8\u30fc\u30af\u30f3\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30fc\u30c9\u54c1\u8cea\u306e\u7dad\u6301<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PSR-12\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04\u306e\u9075\u5b88<\/li>\n\n\n\n<li>PHPDoc\u306b\u3088\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u540d\u524d\u7a7a\u9593\u306e\u4f7f\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u53ef\u80fd\u6027\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u4f5c\u6210<\/li>\n\n\n\n<li>\u30d5\u30a3\u30fc\u30c1\u30e3\u30fc\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>CI\u3067\u306e\u81ea\u52d5\u30c6\u30b9\u30c8\u5b9f\u884c<\/li>\n<\/ul>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u6a5f\u80fd\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">\u9ad8\u6a5f\u80fd\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/h2>\n\n\n\n<p>Filament\u306e\u57fa\u672c\u6a5f\u80fd\u3092\u62e1\u5f35\u3057\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u7ba1\u7406\u753b\u9762\u3092\u69cb\u7bc9\u3059\u308b\u305f\u3081\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u5145\u5b9f\u5316\u304b\u3089\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5\u3001UI\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u307e\u3067\u3001\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u306e\u6d3b\u7528\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">1. \u30ab\u30b9\u30bf\u30e0\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\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\/Filament\/Widgets\/StatsOverview.php\nuse Filament\\Widgets\\StatsOverviewWidget as BaseWidget;\nuse Filament\\Widgets\\StatsOverviewWidget\\Stat;\nuse App\\Models\\Product;\nuse App\\Models\\Order;\n\nclass StatsOverview extends BaseWidget\n{\n    protected function getStats(): array\n    {\n        return [\n            Stat::make('\u7dcf\u5546\u54c1\u6570', Product::count())\n                -&gt;description('\u5148\u6708\u6bd4 +20%')\n                -&gt;descriptionIcon('heroicon-m-arrow-trending-up')\n                -&gt;chart([7, 4, 6, 8, 5, 9, 10])\n                -&gt;color('success'),\n\n            Stat::make('\u672c\u65e5\u306e\u58f2\u4e0a', '\u00a5' . number_format(Order::whereDate('created_at', today())-&gt;sum('total')))\n                -&gt;description('\u6628\u65e5\u6bd4 -2%')\n                -&gt;descriptionIcon('heroicon-m-arrow-trending-down')\n                -&gt;color('danger'),\n\n            Stat::make('\u5728\u5eab\u5207\u308c\u5546\u54c1', Product::where('stock', 0)-&gt;count())\n                -&gt;description('\u8981\u5bfe\u5fdc')\n                -&gt;color('warning'),\n        ];\n    }\n}\n\n\/\/ app\/Filament\/Widgets\/LatestOrders.php\nuse Filament\\Widgets\\TableWidget as BaseWidget;\nuse Illuminate\\Database\\Eloquent\\Builder;\n\nclass LatestOrders extends BaseWidget\n{\n    protected int | string | array $columnSpan = 'full';\n\n    protected function getTableQuery(): Builder\n    {\n        return Order::query()\n            -&gt;latest()\n            -&gt;limit(5);\n    }\n\n    protected function getTableColumns(): array\n    {\n        return [\n            Tables\\Columns\\TextColumn::make('id')\n                -&gt;label('\u6ce8\u6587\u756a\u53f7'),\n            Tables\\Columns\\TextColumn::make('customer.name')\n                -&gt;label('\u9867\u5ba2\u540d'),\n            Tables\\Columns\\TextColumn::make('total')\n                -&gt;label('\u5408\u8a08\u91d1\u984d')\n                -&gt;money('jpy'),\n            Tables\\Columns\\BadgeColumn::make('status')\n                -&gt;label('\u72b6\u614b')\n                -&gt;colors([\n                    'warning' =&gt; 'pending',\n                    'success' =&gt; 'completed',\n                    'danger' =&gt; 'cancelled',\n                ]),\n        ];\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">2. \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\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\/Filament\/Widgets\/RealtimeStats.php\nuse Filament\\Widgets\\Widget;\nuse Livewire\\Component;\n\nclass RealtimeStats extends Widget implements HasFrontendInteractions\n{\n    public $listeners = ['echo:orders,OrderCreated' =&gt; '$refresh'];\n\n    protected static string $view = 'filament.widgets.realtime-stats';\n\n    protected int | string | array $columnSpan = 'full';\n\n    public function getFrontendData(): array\n    {\n        return [\n            'salesData' =&gt; $this-&gt;getSalesData(),\n            'orderCount' =&gt; $this-&gt;getOrderCount(),\n        ];\n    }\n\n    protected function getSalesData(): array\n    {\n        return Order::select(DB::raw('DATE(created_at) as date'), DB::raw('SUM(total) as total'))\n            -&gt;groupBy('date')\n            -&gt;get()\n            -&gt;toArray();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">1. \u30ab\u30b9\u30bf\u30e0\u8a8d\u8a3c\u306e\u8a2d\u5b9a<\/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\/Providers\/Filament\/AdminPanelProvider.php\nuse App\\Filament\\Auth\\Login;\n\npublic function panel(Panel $panel): Panel\n{\n    return $panel\n        -&gt;login(Login::class)\n        -&gt;authGuard('admin')\n        -&gt;authPasswordBroker('admins')\n        -&gt;registration(false)\n        -&gt;passwordReset(false)\n        -&gt;emailVerification(true);\n}\n\n\/\/ app\/Filament\/Auth\/Login.php\nuse Filament\\Pages\\Auth\\Login as BaseLogin;\n\nclass Login extends BaseLogin\n{\n    protected function getFormSchema(): array\n    {\n        return [\n            TextInput::make('email')\n                -&gt;label('\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9')\n                -&gt;email()\n                -&gt;required(),\n            TextInput::make('password')\n                -&gt;label('\u30d1\u30b9\u30ef\u30fc\u30c9')\n                -&gt;password()\n                -&gt;required(),\n            Toggle::make('remember')\n                -&gt;label('\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092\u4fdd\u6301'),\n        ];\n    }\n\n    protected function authenticate(): void\n    {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u8a8d\u8a3c\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">2. \u6a29\u9650\u7ba1\u7406\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\/Policies\/ProductPolicy.php\nclass ProductPolicy\n{\n    public function viewAny(User $user): bool\n    {\n        return $user-&gt;can('view_products');\n    }\n\n    public function create(User $user): bool\n    {\n        return $user-&gt;can('create_products');\n    }\n\n    \/\/ ... \u4ed6\u306e\u6a29\u9650\u30e1\u30bd\u30c3\u30c9\n}\n\n\/\/ app\/Filament\/Resources\/ProductResource.php\npublic static function getPermissionPrefixes(): array\n{\n    return [\n        'view',\n        'create',\n        'update',\n        'delete',\n        'restore',\n    ];\n}\n\nprotected static function getNavigationBadge(): ?string\n{\n    return static::getModel()::count();\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u30c6\u30fc\u30de\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3068UI\u306e\u6539\u5584<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">1. \u30ab\u30b9\u30bf\u30e0\u30c6\u30fc\u30de\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=\"\">\/\/ resources\/css\/filament\/admin\/theme.css\n@import '\/vendor\/filament\/filament\/resources\/css\/theme.css';\n\n:root {\n    --primary-50: 240 249 255;\n    --primary-100: 224 242 254;\n    --primary-200: 186 230 253;\n    --primary-300: 125 211 252;\n    --primary-400: 56 189 248;\n    --primary-500: 14 165 233;\n    --primary-600: 2 132 199;\n    --primary-700: 3 105 161;\n    --primary-800: 7 89 133;\n    --primary-900: 12 74 110;\n    --primary-950: 8 47 73;\n}\n\n\/\/ tailwind.config.js\nconst colors = require('tailwindcss\/colors')\n\nmodule.exports = {\n    content: [\n        '.\/resources\/**\/*.blade.php',\n        '.\/vendor\/filament\/**\/*.blade.php',\n    ],\n    theme: {\n        extend: {\n            colors: {\n                danger: colors.rose,\n                primary: colors.blue,\n                success: colors.green,\n                warning: colors.yellow,\n            },\n        },\n    },\n    plugins: [\n        require('@tailwindcss\/forms'),\n        require('@tailwindcss\/typography'),\n    ],\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">2. \u30ab\u30b9\u30bf\u30e0\u30ec\u30a4\u30a2\u30a6\u30c8\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\/Filament\/Pages\/CustomDashboard.php\nuse Filament\\Pages\\Dashboard as BaseDashboard;\n\nclass CustomDashboard extends BaseDashboard\n{\n    protected static string $view = 'filament.pages.dashboard';\n\n    protected function getHeaderWidgets(): array\n    {\n        return [\n            StatsOverview::class,\n            RealtimeStats::class,\n        ];\n    }\n\n    protected function getFooterWidgets(): array\n    {\n        return [\n            LatestOrders::class,\n        ];\n    }\n}\n\n\/\/ resources\/views\/filament\/pages\/dashboard.blade.php\n&lt;x-filament::page&gt;\n    &lt;div class=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\"&gt;\n        @foreach ($this-&gt;getHeaderWidgets() as $widget)\n            {{ $widget }}\n        @endforeach\n    &lt;\/div&gt;\n\n    &lt;div class=\"mt-4\"&gt;\n        @foreach ($this-&gt;getFooterWidgets() as $widget)\n            {{ $widget }}\n        @endforeach\n    &lt;\/div&gt;\n&lt;\/x-filament::page&gt;<\/pre>\n\n\n\n<p>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\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>\u30a2\u30bb\u30c3\u30c8\u306e\u6700\u9069\u5316\uff08\u30df\u30cb\u30d5\u30a1\u30a4\u3001\u5727\u7e2e\uff09<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u9045\u5ef6\u8aad\u307f\u8fbc\u307f\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306aCSRF\u4fdd\u8b77<\/li>\n\n\n\n<li>XSS\u5bfe\u7b56\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ec\u30fc\u30c8\u5236\u9650\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u8a2d\u8a08<\/li>\n\n\n\n<li>\u4e00\u8cab\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316<\/li>\n<\/ul>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u8df5\u7684\u306a\u958b\u767a\u30c6\u30af\u30cb\u30c3\u30af\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-33\">\u5b9f\u8df5\u7684\u306a\u958b\u767a\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<p>Filament\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u52d9\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3001\u30c6\u30b9\u30c8\u3001\u5b9f\u88c5\u306e\u5404\u5074\u9762\u306b\u304a\u3051\u308b\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002\u3053\u306e\u77e5\u8b58\u306f\u3001\u5927\u898f\u6a21\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3084\u9577\u671f\u7684\u306a\u904b\u7528\u306b\u304a\u3044\u3066\u7279\u306b\u91cd\u8981\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-34\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">1. \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=\"\">\/\/ app\/Filament\/Resources\/OrderResource.php\nuse Filament\\Resources\\Resource;\nuse Illuminate\\Database\\Eloquent\\Builder;\n\nclass OrderResource extends Resource\n{\n    public static function getEloquentQuery(): Builder\n    {\n        return parent::getEloquentQuery()\n            -&gt;with(['customer', 'products']) \/\/ Eager Loading\n            -&gt;withCount('products')\n            -&gt;withSum('products', 'price')\n            -&gt;latest();\n    }\n\n    public static function table(Table $table): Table\n    {\n        return $table\n            -&gt;columns([\n                \/\/ \u5fc5\u8981\u306a\u5217\u306e\u307f\u3092\u8868\u793a\n                Tables\\Columns\\TextColumn::make('id')\n                    -&gt;searchable()\n                    -&gt;sortable(),\n                Tables\\Columns\\TextColumn::make('customer.name')\n                    -&gt;searchable()\n                    -&gt;sortable(),\n            ])\n            -&gt;defaultSort('created_at', 'desc')\n            \/\/ \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u306e\u6700\u9069\u5316\n            -&gt;paginated([10, 25, 50, 100])\n            -&gt;persistFiltersInSession()\n            -&gt;persistSortInSession();\n    }\n}\n\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528\nclass ProductResource extends Resource\n{\n    protected static function getNavigationBadge(): ?string\n    {\n        return Cache::remember('products_count', 3600, function () {\n            return static::getModel()::count();\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">2. \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\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=\"\">\/\/ config\/filament.php\nreturn [\n    'assets' =&gt; [\n        'should_minify_scripts' =&gt; true,\n        'should_minify_styles' =&gt; true,\n    ],\n\n    'cache' =&gt; [\n        'ttl' =&gt; 3600,\n    ],\n];\n\n\/\/ Blade \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u6700\u9069\u5316\nclass CustomProductList extends Component\n{\n    use WithPagination;\n\n    public function render()\n    {\n        return view('livewire.custom-product-list', [\n            'products' =&gt; Product::query()\n                -&gt;when($this-&gt;search, fn ($query) =&gt; \n                    $query-&gt;where('name', 'like', \"%{$this-&gt;search}%\")\n                )\n                -&gt;paginate(10),\n        ]);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u30c6\u30b9\u30c8\u306e\u66f8\u304d\u8fbc\u307f\u3068\u81ea\u52d5\u5316\u306e\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">1. \u57fa\u672c\u7684\u306a\u30c6\u30b9\u30c8\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=\"\">\/\/ tests\/Feature\/ProductResourceTest.php\nnamespace Tests\\Feature;\n\nuse App\\Filament\\Resources\\ProductResource;\nuse App\\Models\\Product;\nuse App\\Models\\User;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Tests\\TestCase;\n\nclass ProductResourceTest extends TestCase\n{\n    use RefreshDatabase;\n\n    public function test_can_list_products()\n    {\n        $this-&gt;actingAs(User::factory()-&gt;create());\n\n        $products = Product::factory()-&gt;count(10)-&gt;create();\n\n        $response = $this-&gt;get(ProductResource::getUrl('index'));\n\n        $response-&gt;assertSuccessful();\n        $response-&gt;assertSee($products-&gt;first()-&gt;name);\n    }\n\n    public function test_can_create_product()\n    {\n        $this-&gt;actingAs(User::factory()-&gt;create());\n\n        $newProduct = Product::factory()-&gt;make();\n\n        $response = $this-&gt;post(ProductResource::getUrl('create'), [\n            'name' =&gt; $newProduct-&gt;name,\n            'price' =&gt; $newProduct-&gt;price,\n            'description' =&gt; $newProduct-&gt;description,\n        ]);\n\n        $response-&gt;assertRedirect();\n        $this-&gt;assertDatabaseHas('products', [\n            'name' =&gt; $newProduct-&gt;name,\n        ]);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">2. \u81ea\u52d5\u30c6\u30b9\u30c8\u306e\u8a2d\u5b9a<\/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=\"\"># .github\/workflows\/test.yml\nname: Test Suite\n\non: [push, pull_request]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\/checkout@v2\n\n      - name: Setup PHP\n        uses: shivammathur\/setup-php@v2\n        with:\n          php-version: '8.1'\n\n      - name: Install Dependencies\n        run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist\n\n      - name: Execute tests via PHPUnit\n        run: vendor\/bin\/phpunit<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u5b9f\u52d9\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5b9f\u8df5\u4f8b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">1. \u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\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\/Filament\/Resources\/ProductResource\/Pages\/ImportProducts.php\nuse Filament\\Resources\\Pages\\Page;\nuse Illuminate\\Support\\Facades\\Bus;\nuse Maatwebsite\\Excel\\Facades\\Excel;\n\nclass ImportProducts extends Page\n{\n    protected static string $resource = ProductResource::class;\n\n    protected static string $view = 'filament.resources.product-resource.pages.import-products';\n\n    public function import()\n    {\n        $this-&gt;validate([\n            'file' =&gt; ['required', 'file', 'mimes:xlsx,csv'],\n        ]);\n\n        $import = new ProductsImport;\n\n        \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u5927\u91cf\u30c7\u30fc\u30bf\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\n        Bus::batch([\n            new ProcessProductImport($this-&gt;file)\n        ])-&gt;dispatch();\n\n        Notification::make()\n            -&gt;title('\u30a4\u30f3\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u307e\u3057\u305f')\n            -&gt;success()\n            -&gt;send();\n    }\n}\n\n\/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u7528\u306e\u30b8\u30e7\u30d6\u30af\u30e9\u30b9\nclass ProcessProductImport implements ShouldQueue\n{\n    use Batchable, Queueable;\n\n    public function handle()\n    {\n        Excel::queueImport(new ProductsImport, $this-&gt;file);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-42\">2. \u30ab\u30b9\u30bf\u30e0\u30a2\u30af\u30b7\u30e7\u30f3\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\/Filament\/Resources\/OrderResource\/Actions\/GenerateInvoiceAction.php\nuse Filament\\Tables\\Actions\\Action;\nuse Filament\\Notifications\\Notification;\n\nclass GenerateInvoiceAction extends Action\n{\n    protected function setUp(): void\n    {\n        $this-&gt;label('\u8acb\u6c42\u66f8\u751f\u6210')\n            -&gt;icon('heroicon-o-document-text')\n            -&gt;action(function ($record) {\n                \/\/ PDF\u751f\u6210\u51e6\u7406\n                $pdf = PDF::loadView('invoices.template', [\n                    'order' =&gt; $record,\n                ]);\n\n                \/\/ S3\u3078\u306e\u4fdd\u5b58\n                Storage::disk('s3')-&gt;put(\n                    \"invoices\/{$record-&gt;id}.pdf\",\n                    $pdf-&gt;output()\n                );\n\n                Notification::make()\n                    -&gt;title('\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3057\u307e\u3057\u305f')\n                    -&gt;success()\n                    -&gt;send();\n            })\n            -&gt;requiresConfirmation();\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30fc\u30c9\u54c1\u8cea\u306e\u7dad\u6301<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHPStan\u306b\u3088\u308b\u9759\u7684\u89e3\u6790<\/li>\n\n\n\n<li>PHP_CodeSniffer\u306b\u3088\u308b\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>GitHubActions\u306b\u3088\u308b\u81ea\u52d5\u30c1\u30a7\u30c3\u30af<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u52b9\u7387\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5171\u901a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u4f5c\u6210<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u30d5\u30a9\u30fc\u30e0\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u518d\u5229\u7528\u53ef\u80fd\u306a\u30c8\u30ec\u30a4\u30c8\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u6ce8\u610f\u70b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u547d\u540d\u898f\u5247\u306e\u7d71\u4e00<\/li>\n\n\n\n<li>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u6574\u5099<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u57fa\u6e96\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-44\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9<\/h2>\n\n\n\n<p>Filament\u3092\u7528\u3044\u305f\u7ba1\u7406\u753b\u9762\u306e\u904b\u7528\u306b\u304a\u3044\u3066\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3001\u305d\u3057\u3066\u9577\u671f\u7684\u306a\u4fdd\u5b88\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-45\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-46\">1. \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30fb\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u6642\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=\"\"># 1. \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u7af6\u5408\u30a8\u30e9\u30fc\nComposer \u30a8\u30e9\u30fc: \"Package filament\/filament has requirements incompatible with your PHP version\"\n\n# \u89e3\u6c7a\u65b9\u6cd5\ncomposer update --ignore-platform-reqs\ncomposer install --ignore-platform-reqs\n\n# 2. \u30a2\u30bb\u30c3\u30c8\u306e\u30d3\u30eb\u30c9\u30a8\u30e9\u30fc\nnpm ERR! Failed at the build script\n\n# \u89e3\u6c7a\u65b9\u6cd5\nrm -rf node_modules\nrm package-lock.json\nnpm cache clean --force\nnpm install\nnpm run build<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">2. \u5b9f\u884c\u6642\u30a8\u30e9\u30fc\u306e\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=\"\">\/\/ 1. \u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc\u306e\u5bfe\u51e6\n\/\/ php.ini \u307e\u305f\u306f .htaccess \u3067\u8a2d\u5b9a\nini_set('memory_limit', '512M');\n\n\/\/ 2. \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u30a8\u30e9\u30fc\u306e\u5bfe\u51e6\n\/\/ app\/Providers\/AppServiceProvider.php\npublic function boot()\n{\n    ini_set('max_execution_time', 300); \/\/ 5\u5206\n}\n\n\/\/ 3. \u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30a8\u30e9\u30fc\u306e\u5bfe\u51e6\n\/\/ config\/filament.php\nreturn [\n    'max_upload_size' =&gt; 50 * 1024, \/\/ 50MB\n];\n\n\/\/ 4. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30af\u30a8\u30ea\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u5bfe\u51e6\n\/\/ config\/database.php\n'mysql' =&gt; [\n    'options' =&gt; [\n        PDO::ATTR_TIMEOUT =&gt; 60,\n    ],\n],<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">\u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u76e3\u8996\u3068\u5206\u6790<\/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\/Exceptions\/Handler.php\nuse Illuminate\\Support\\Facades\\Log;\n\nclass Handler extends ExceptionHandler\n{\n    public function register(): void\n    {\n        $this-&gt;reportable(function (Throwable $e) {\n            if ($this-&gt;shouldReport($e)) {\n                Log::error('Filament Error:', [\n                    'message' =&gt; $e-&gt;getMessage(),\n                    'file' =&gt; $e-&gt;getFile(),\n                    'line' =&gt; $e-&gt;getLine(),\n                    'trace' =&gt; $e-&gt;getTraceAsString(),\n                    'user' =&gt; auth()-&gt;user()?-&gt;id,\n                    'url' =&gt; request()-&gt;url(),\n                ]);\n            }\n        });\n    }\n}\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a\n\/\/ config\/logging.php\n'channels' =&gt; [\n    'filament' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/filament.log'),\n        'level' =&gt; env('LOG_LEVEL', 'debug'),\n        'days' =&gt; 14,\n    ],\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u30d0\u30fc\u30b8\u30e7\u30f3\u30a2\u30c3\u30d7\u6642\u306e\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-50\">1. \u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u624b\u9806\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\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=\"\"># 1. \u73fe\u5728\u306e\u74b0\u5883\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\nphp artisan backup:run\n\n# 2. \u4f9d\u5b58\u95a2\u4fc2\u306e\u66f4\u65b0\ncomposer update filament\/filament --with-dependencies\n\n# 3. \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\nphp artisan optimize:clear\nphp artisan view:clear\nphp artisan cache:clear\n\n# 4. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\nphp artisan migrate\n\n# 5. \u30a2\u30bb\u30c3\u30c8\u306e\u518d\u30d3\u30eb\u30c9\nnpm install\nnpm run build<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">2. \u7834\u58ca\u7684\u5909\u66f4\u3078\u306e\u5bfe\u5fdc<\/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=\"\">\/\/ 1. \u975e\u63a8\u5968\u6a5f\u80fd\u306e\u78ba\u8a8d\u3068\u66f4\u65b0\n\/\/ \u53e4\u3044\u5b9f\u88c5\nuse Filament\\Resources\\Table;\n\n\/\/ \u65b0\u3057\u3044\u5b9f\u88c5\nuse Filament\\Tables\\Table;\n\n\/\/ 2. \u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u4e92\u63db\u6027\u78ba\u4fdd\nclass CustomField extends Field\n{\n    protected function setUp(): void\n    {\n        \/\/ \u65b0\u3057\u3044API\u3078\u306e\u5bfe\u5fdc\n        parent::setUp();\n\n        \/\/ \u5f8c\u65b9\u4e92\u63db\u6027\u306e\u7dad\u6301\n        if (version_compare(Filament::VERSION, '3.0.0', '&lt;')) {\n            $this-&gt;legacy();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-52\">\u9577\u671f\u904b\u7528\u306e\u305f\u3081\u306e\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-53\">1. \u5b9a\u671f\u7684\u306a\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30bf\u30b9\u30af<\/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\/Console\/Kernel.php\nprotected function schedule(Schedule $schedule): void\n{\n    \/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6700\u9069\u5316\n    $schedule-&gt;command('db:optimize')-&gt;weekly();\n\n    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u66f4\u65b0\n    $schedule-&gt;command('filament:cache')-&gt;daily();\n\n    \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u4f5c\u6210\n    $schedule-&gt;command('backup:clean')-&gt;daily();\n    $schedule-&gt;command('backup:run')-&gt;daily();\n\n    \/\/ \u30ed\u30b0\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\n    $schedule-&gt;command('log:clean')-&gt;monthly();\n}\n\n\/\/ app\/Console\/Commands\/DbOptimize.php\nclass DbOptimize extends Command\n{\n    public function handle()\n    {\n        \/\/ \u30c6\u30fc\u30d6\u30eb\u306e\u6700\u9069\u5316\n        DB::statement('OPTIMIZE TABLE products, orders, users');\n\n        \/\/ \u53e4\u3044\u30c7\u30fc\u30bf\u306e\u6574\u7406\n        Order::where('created_at', '&lt;', now()-&gt;subYears(2))\n            -&gt;delete();\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-54\">2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\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=\"\">\/\/ config\/telescope.php\nreturn [\n    'enabled' =&gt; env('TELESCOPE_ENABLED', true),\n\n    'watchers' =&gt; [\n        Watchers\\QueryWatcher::class =&gt; [\n            'enabled' =&gt; env('TELESCOPE_QUERY_WATCHER', true),\n            'slow' =&gt; 100,\n        ],\n\n        Watchers\\RequestWatcher::class =&gt; [\n            'enabled' =&gt; env('TELESCOPE_REQUEST_WATCHER', true),\n            'size_limit' =&gt; env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64),\n        ],\n    ],\n];\n\n\/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6\nclass PerformanceMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        $start = microtime(true);\n\n        $response = $next($request);\n\n        $duration = microtime(true) - $start;\n\n        if ($duration &gt; 1.0) { \/\/ 1\u79d2\u4ee5\u4e0a\u304b\u304b\u308b\u30ea\u30af\u30a8\u30b9\u30c8\n            Log::warning('Slow request detected', [\n                'url' =&gt; $request-&gt;url(),\n                'duration' =&gt; $duration,\n                'user' =&gt; auth()-&gt;id(),\n            ]);\n        }\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-55\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9a\u671f\u7684\u306a\u5065\u5168\u6027\u30c1\u30a7\u30c3\u30af<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6709\u52b9\u6027\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u30c7\u30fc\u30bf\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7<\/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>\u4f9d\u5b58\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u8106\u5f31\u6027\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u8a8d\u8a3c\u8a66\u884c\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u5b8c\u5168\u6027\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API\u4ed5\u69d8\u66f8\u306e\u66f4\u65b0<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u5909\u66f4\u5c65\u6b74\u306e\u8a18\u9332<\/li>\n\n\n\n<li>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30ac\u30a4\u30c9\u306e\u6574\u5099<\/li>\n\n\n\n<li>\u904b\u7528\u624b\u9806\u66f8\u306e\u66f4\u65b0<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5bfe\u7b56\u3068\u624b\u9806\u3092\u9069\u5207\u306b\u5b9f\u65bd\u3059\u308b\u3053\u3068\u3067\u3001Filament\u3092\u4f7f\u7528\u3057\u305f\u7ba1\u7406\u753b\u9762\u306e\u5b89\u5b9a\u3057\u305f\u904b\u7528\u304c\u53ef\u80fd\u3068\u306a\u308a\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-2584","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\/2584","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=2584"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2584\/revisions"}],"predecessor-version":[{"id":2586,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2584\/revisions\/2586"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}