{"id":2491,"date":"2025-03-24T08:47:10","date_gmt":"2025-03-23T23:47:10","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2491"},"modified":"2025-03-24T08:47:40","modified_gmt":"2025-03-23T23:47:40","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-admin%e3%81%a7%e4%bd%9c%e3%82%8b%e6%9c%80%e5%bc%b7%e3%81%ae%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%ef%bc%81%e5%ae%9f%e8%a3%85%e3%81%8b%e3%82%89","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2491","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Admin\u3067\u4f5c\u308b\u6700\u5f37\u306e\u7ba1\u7406\u753b\u9762\uff01\u5b9f\u88c5\u304b\u3089\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u307e\u3067\u5b8c\u5168\u89e3\u8aac"},"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 Admin \u3068\u306f\uff1f \u7ba1\u7406\u753b\u9762\u69cb\u7bc9\u306e\u6551\u4e16\u4e3b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Laravel Admin \u8a95\u751f\u306e\u80cc\u666f\u3068\u7279\u5fb4<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u5f93\u6765\u306e\u7ba1\u7406\u753b\u9762\u958b\u767a\u3068\u6bd4\u3079\u3066\u306e\u30e1\u30ea\u30c3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">Laravel Admin\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u521d\u671f\u8a2d\u5b9a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u5fc5\u8981\u306a\u74b0\u5883\u8981\u4ef6\u3068\u5c0e\u5165\u624b\u9806<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u57fa\u672c\u7684\u306a\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u8aac<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-13\">\u521d\u671f\u8a2d\u5b9a\u3067\u3064\u307e\u305a\u304d\u3084\u3059\u3044\u30dd\u30a4\u30f3\u30c8\u3068\u89e3\u6c7a\u7b56<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-18\">\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-19\">\u30e2\u30c7\u30eb\u3068\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-23\">\u30c7\u30fc\u30bf\u30b0\u30ea\u30c3\u30c9\u306e\u5b9f\u88c5\u3068\u6d3b\u7528<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-25\">\u30d5\u30a9\u30fc\u30e0\u8981\u7d20\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-28\">Laravel Admin\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-29\">\u6a29\u9650\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-33\">XSS\u5bfe\u7b56\u3068CSRF\u5bfe\u7b56<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-36\">\u30bb\u30ad\u30e5\u30a2\u306a\u7ba1\u7406\u753b\u9762\u904b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-41\">Laravel Admin\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u8853<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-42\">\u30c6\u30fc\u30de\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-46\">\u72ec\u81ea\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u4f5c\u6210\u3068\u7d71\u5408<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-49\">\u9ad8\u5ea6\u306a\u6a5f\u80fd\u62e1\u5f35\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-53\">Laravel Admin\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-54\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6700\u9069\u5316<\/a>      <\/li>      <li>        <a href=\"#i-58\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-62\">\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u52b9\u7387\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-66\">\u5b9f\u8df5\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-67\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-71\">\u30c7\u30d0\u30c3\u30b0\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-75\">\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30ea\u30bd\u30fc\u30b9\u306e\u6d3b\u7528\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 Admin \u3068\u306f\uff1f \u7ba1\u7406\u753b\u9762\u69cb\u7bc9\u306e\u6551\u4e16\u4e3b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Laravel Admin \u8a95\u751f\u306e\u80cc\u666f\u3068\u7279\u5fb4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Admin\u306f\u3001Laravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u304a\u3051\u308b\u7ba1\u7406\u753b\u9762\u958b\u767a\u306e\u52b9\u7387\u3092\u5287\u7684\u306b\u5411\u4e0a\u3055\u305b\u308b\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u3059\u3002\u5f93\u6765\u3001\u958b\u767a\u8005\u306f\u7ba1\u7406\u753b\u9762\u306e\u69cb\u7bc9\u306b\u591a\u5927\u306a\u6642\u9593\u3068\u30ea\u30bd\u30fc\u30b9\u3092\u8cbb\u3084\u3057\u3066\u304d\u307e\u3057\u305f\u304c\u3001Laravel Admin\u306f\u3053\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3059\u308b\u5f37\u529b\u306a\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u3068\u3057\u3066\u6ce8\u76ee\u3092\u96c6\u3081\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-2\">\u4e3b\u8981\u306a\u7279\u5fb4<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9ad8\u901f\u306a\u958b\u767a\u74b0\u5883\u306e\u63d0\u4f9b<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3059\u308b\u3060\u3051\u3067\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u76f4\u611f\u7684\u306aUI\u30d3\u30eb\u30c0\u30fc\u306b\u3088\u308b\u753b\u9762\u69cb\u7bc9<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u30d5\u30a9\u30fc\u30e0\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u3068\u30b0\u30ea\u30c3\u30c9\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u67d4\u8edf\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/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=\"\">   \/\/ \u30ab\u30b9\u30bf\u30e0\u30d5\u30a3\u30fc\u30eb\u30c9\u30bf\u30a4\u30d7\u306e\u5b9a\u7fa9\u4f8b\n   $form-&gt;custom('field_name', function ($value) {\n       return view('custom-field', ['value' =&gt; $value]);\n   });<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6a5f\u80fd\u306e\u6a19\u6e96\u88c5\u5099<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ed\u30fc\u30eb\u30d9\u30fc\u30b9\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\uff08RBAC\uff09<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30b9\u30af\u30ea\u30d7\u30c6\u30a3\u30f3\u30b0\uff08XSS\uff09\u5bfe\u7b56<\/li>\n\n\n\n<li>CSRF\u4fdd\u8b77\u6a5f\u80fd<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u5f93\u6765\u306e\u7ba1\u7406\u753b\u9762\u958b\u767a\u3068\u6bd4\u3079\u3066\u306e\u30e1\u30ea\u30c3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">1. \u958b\u767a\u6642\u9593\u306e\u5927\u5e45\u524a\u6e1b<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f93\u6765\u306e\u7ba1\u7406\u753b\u9762\u958b\u767a\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5b9f\u88c5\u304c\u5fc5\u8981\u3067\u3057\u305f\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=\"\">\/\/ \u5f93\u6765\u306e\u5b9f\u88c5\u4f8b\nclass AdminUserController extends Controller\n{\n    public function index()\n    {\n        $users = User::paginate(20);\n        return view('admin.users.index', compact('users'));\n    }\n\n    public function create()\n    {\n        return view('admin.users.create');\n    }\n    \/\/ ... \u4ed6\u591a\u6570\u306e\u30e1\u30bd\u30c3\u30c9\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Admin\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u540c\u3058\u6a5f\u80fd\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u30b7\u30f3\u30d7\u30eb\u306b\u5b9f\u88c5\u3067\u304d\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=\"\">\/\/ Laravel Admin \u3067\u306e\u5b9f\u88c5\u4f8b\nuse Encore\\Admin\\Controllers\\AdminController;\n\nclass UserController extends AdminController\n{\n    protected $title = '\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406';\n\n    protected function grid()\n    {\n        $grid = new Grid(new User());\n        $grid-&gt;column('id', 'ID');\n        $grid-&gt;column('name', '\u540d\u524d');\n        $grid-&gt;column('email', '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9');\n        return $grid;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">2. \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u306e\u5411\u4e0a<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u7d71\u4e00\u3055\u308c\u305f\u8a2d\u8a08\u601d\u60f3<\/strong><\/li>\n\n\n\n<li>MVC\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306b\u6e96\u62e0<\/li>\n\n\n\n<li>\u4e00\u8cab\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\u69cb\u9020<\/li>\n\n\n\n<li>\u62e1\u5f35\u6027\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08<\/li>\n\n\n\n<li><strong>\u81ea\u52d5\u751f\u6210\u3055\u308c\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/strong><\/li>\n\n\n\n<li>API\u4ed5\u69d8\u66f8\u306e\u81ea\u52d5\u751f\u6210<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u69cb\u9020\u306e\u53ef\u8996\u5316<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u4e00\u89a7\u5316<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">3. \u904b\u7528\u30b3\u30b9\u30c8\u306e\u524a\u6e1b<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d3\u30eb\u30c8\u30a4\u30f3\u306e\u7ba1\u7406\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u30ed\u30b0\u306e\u53ef\u8996\u5316<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\/\u30ea\u30b9\u30c8\u30a2<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4eca\u65e5\u306eWeb\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u52b9\u7387\u7684\u306a\u7ba1\u7406\u753b\u9762\u306e\u69cb\u7bc9\u306f\u91cd\u8981\u306a\u8ab2\u984c\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002Laravel Admin\u306f\u3001\u3053\u306e\u8ab2\u984c\u306b\u5bfe\u3059\u308b\u5305\u62ec\u7684\u306a\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u3092\u63d0\u4f9b\u3057\u3001\u958b\u767a\u8005\u306e\u751f\u7523\u6027\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u308b\u5f37\u529b\u306a\u30c4\u30fc\u30eb\u3068\u3057\u3066\u4f4d\u7f6e\u3065\u3051\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001Laravel Admin\u306e\u5177\u4f53\u7684\u306a\u5c0e\u5165\u624b\u9806\u3068\u521d\u671f\u8a2d\u5b9a\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">Laravel Admin\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u521d\u671f\u8a2d\u5b9a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u5fc5\u8981\u306a\u74b0\u5883\u8981\u4ef6\u3068\u5c0e\u5165\u624b\u9806<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Admin\u3092\u5c0e\u5165\u3059\u308b\u524d\u306b\u3001\u4ee5\u4e0b\u306e\u8981\u4ef6\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHP &gt;= 7.4.0<\/li>\n\n\n\n<li>Laravel &gt;= 8.0<\/li>\n\n\n\n<li>MySQL &gt;= 5.7 \u307e\u305f\u306f MariaDB &gt;= 10.2<\/li>\n\n\n\n<li>Composer<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-9\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Composer\u3092\u4f7f\u7528\u3057\u305f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/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=\"\">cd your-project\ncomposer require encore\/laravel-admin<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3068\u30a2\u30bb\u30c3\u30c8\u306e\u516c\u958b<\/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=\"\">php artisan vendor:publish --provider=\"Encore\\Admin\\AdminServiceProvider\"<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c<\/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=\"\">php artisan admin:install<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u57fa\u672c\u7684\u306a\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u8aac<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">config\/admin.php \u306e\u4e3b\u8981\u306a\u8a2d\u5b9a\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=\"\">return [\n    \/\/ \u7ba1\u7406\u753b\u9762\u306e\u30eb\u30fc\u30c8\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\u306f 'admin'\uff09\n    'route' =&gt; [\n        'prefix' =&gt; 'admin',\n        'namespace' =&gt; 'App\\\\Admin\\\\Controllers',\n        'middleware' =&gt; ['web', 'admin'],\n    ],\n\n    \/\/ \u8a8d\u8a3c\u8a2d\u5b9a\n    'auth' =&gt; [\n        'controller' =&gt; App\\Admin\\Controllers\\AuthController::class,\n        'guards' =&gt; [\n            'admin' =&gt; [\n                'driver'   =&gt; 'session',\n                'provider' =&gt; 'admin',\n            ],\n        ],\n    ],\n\n    \/\/ \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\n    'upload' =&gt; [\n        'disk' =&gt; 'admin',\n        'directory' =&gt; [\n            'image'  =&gt; 'images',\n            'file'   =&gt; 'files',\n        ],\n    ],\n];<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">\u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u72ec\u81ea\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u8ffd\u52a0\u3059\u308b\u5834\u5408\u306f\u3001<code>app\/Admin\/bootstrap.php<\/code> \u3067\u8a2d\u5b9a\u3057\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=\"\">use Encore\\Admin\\Form;\nuse App\\Admin\\Extensions\\CustomComponent;\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30d5\u30a9\u30fc\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u767b\u9332\nForm::extend('custom', CustomComponent::class);\n\n\/\/ \u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30bf\u30a4\u30eb\u3084\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u8ffd\u52a0\nAdmin::css('\/css\/custom.css');\nAdmin::js('\/js\/custom.js');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u521d\u671f\u8a2d\u5b9a\u3067\u3064\u307e\u305a\u304d\u3084\u3059\u3044\u30dd\u30a4\u30f3\u30c8\u3068\u89e3\u6c7a\u7b56<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">1. \u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u95a2\u9023\u306e\u554f\u984c<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u75c7\u72b6<\/strong>: \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3084\u30ed\u30b0\u304c\u66f8\u304d\u8fbc\u3081\u306a\u3044<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u89e3\u6c7a\u7b56<\/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=\"\"># \u30b9\u30c8\u30ec\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a\nchmod -R 775 storage\nchmod -R 775 bootstrap\/cache\n\n# \u6240\u6709\u8005\u306e\u5909\u66f4\uff08Nginx\u306e\u5834\u5408\uff09\nchown -R www-data:www-data storage\nchown -R www-data:www-data bootstrap\/cache<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">2. \u753b\u50cf\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306e\u554f\u984c<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u75c7\u72b6<\/strong>: \u753b\u50cf\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u5931\u6557\u3059\u308b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u89e3\u6c7a\u7b56<\/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=\"\">\/\/ config\/filesystems.php \u306b\u4ee5\u4e0b\u3092\u8ffd\u52a0\n'disks' =&gt; [\n    'admin' =&gt; [\n        'driver' =&gt; 'local',\n        'root' =&gt; storage_path('app\/public\/admin'),\n        'url' =&gt; env('APP_URL').'\/storage\/admin',\n        'visibility' =&gt; 'public',\n    ],\n],<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u305d\u306e\u5f8c\u3001\u30b7\u30f3\u30dc\u30ea\u30c3\u30af\u30ea\u30f3\u30af\u3092\u4f5c\u6210\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=\"\">php artisan storage:link<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">3. \u8a8d\u8a3c\u95a2\u9023\u306e\u554f\u984c<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u75c7\u72b6<\/strong>: \u30ed\u30b0\u30a4\u30f3\u3067\u304d\u306a\u3044\u3001\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u7dad\u6301\u3055\u308c\u306a\u3044<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u89e3\u6c7a\u7b56<\/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=\"\">\/\/ config\/auth.php \u306b\u7ba1\u7406\u8005\u7528\u306e\u30ac\u30fc\u30c9\u3092\u8ffd\u52a0\n'guards' =&gt; [\n    'admin' =&gt; [\n        'driver' =&gt; 'session',\n        'provider' =&gt; 'admin',\n    ],\n],\n\n'providers' =&gt; [\n    'admin' =&gt; [\n        'driver' =&gt; 'eloquent',\n        'model' =&gt; Encore\\Admin\\Auth\\Database\\Administrator::class,\n    ],\n],<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-17\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ed\u30b0\u306e\u78ba\u8a8d<\/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\/logging.php \u3067\u30ed\u30b0\u30ec\u30d9\u30eb\u3092\u8abf\u6574\n'channels' =&gt; [\n    'admin' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/admin.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n],<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u6d3b\u7528<\/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=\"\">\/\/ .env \u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\nAPP_DEBUG=true\nADMIN_HTTPS=true  \/\/ HTTPS\u74b0\u5883\u3067\u306e\u52d5\u4f5c\u78ba\u8a8d<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2<\/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=\"\">php artisan config:clear\nphp artisan cache:clear\nphp artisan view:clear\ncomposer dump-autoload<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001<code>http:\/\/your-domain\/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\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u7ba1\u7406\u8005\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30fc\u30b6\u30fc\u540d: admin<\/li>\n\n\n\n<li>\u30d1\u30b9\u30ef\u30fc\u30c9: admin<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u305f\u3081\u3001\u521d\u56de\u30ed\u30b0\u30a4\u30f3\u5f8c\u306f\u5fc5\u305a\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\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\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">\u57fa\u672c\u7684\u306aCRUD\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30e2\u30c7\u30eb\u3068\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6e96\u5099<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u3001\u5546\u54c1\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u4f8b\u306b\u5b9f\u88c5\u3092\u9032\u3081\u3066\u3044\u304d\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=\"\">\/\/ database\/migrations\/2024_02_01_create_products_table.php\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nclass CreateProductsTable extends Migration\n{\n    public function up()\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;string('image')-&gt;nullable();\n            $table-&gt;boolean('is_active')-&gt;default(true);\n            $table-&gt;timestamps();\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-21\">\u30e2\u30c7\u30eb\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\/Models\/Product.php\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Product extends Model\n{\n    protected $fillable = [\n        'name', 'description', 'price', 'stock', \n        'image', 'is_active'\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-22\">\u7ba1\u7406\u753b\u9762\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\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\/Admin\/Controllers\/ProductController.php\nnamespace App\\Admin\\Controllers;\n\nuse App\\Models\\Product;\nuse Encore\\Admin\\Controllers\\AdminController;\nuse Encore\\Admin\\Form;\nuse Encore\\Admin\\Grid;\nuse Encore\\Admin\\Show;\n\nclass ProductController extends AdminController\n{\n    protected $title = '\u5546\u54c1\u7ba1\u7406';\n\n    \/\/ \u30b0\u30ea\u30c3\u30c9\u8868\u793a\u306e\u8a2d\u5b9a\n    protected function grid()\n    {\n        $grid = new Grid(new Product());\n\n        \/\/ \u5217\u306e\u5b9a\u7fa9\n        $grid-&gt;column('id', 'ID')-&gt;sortable();\n        $grid-&gt;column('name', '\u5546\u54c1\u540d')-&gt;filter('like');\n        $grid-&gt;column('price', '\u4fa1\u683c')\n            -&gt;display(function($price) {\n                return '\u00a5' . number_format($price);\n            })\n            -&gt;sortable();\n        $grid-&gt;column('stock', '\u5728\u5eab\u6570')-&gt;sortable();\n        $grid-&gt;column('is_active', '\u72b6\u614b')\n            -&gt;display(function($active) {\n                return $active ? '\u8ca9\u58f2\u4e2d' : '\u505c\u6b62\u4e2d';\n            })\n            -&gt;badge([\n                1 =&gt; 'success',\n                0 =&gt; 'danger',\n            ]);\n\n        \/\/ \u30d5\u30a3\u30eb\u30bf\u30fc\u6a5f\u80fd\u306e\u8ffd\u52a0\n        $grid-&gt;filter(function($filter) {\n            $filter-&gt;like('name', '\u5546\u54c1\u540d');\n            $filter-&gt;between('price', '\u4fa1\u683c');\n            $filter-&gt;equal('is_active', '\u72b6\u614b')-&gt;select([\n                1 =&gt; '\u8ca9\u58f2\u4e2d',\n                0 =&gt; '\u505c\u6b62\u4e2d'\n            ]);\n        });\n\n        return $grid;\n    }\n\n    \/\/ \u8a73\u7d30\u8868\u793a\u306e\u8a2d\u5b9a\n    protected function detail($id)\n    {\n        $show = new Show(Product::findOrFail($id));\n\n        $show-&gt;field('id', 'ID');\n        $show-&gt;field('name', '\u5546\u54c1\u540d');\n        $show-&gt;field('description', '\u5546\u54c1\u8aac\u660e');\n        $show-&gt;field('price', '\u4fa1\u683c')-&gt;as(function($price) {\n            return '\u00a5' . number_format($price);\n        });\n        $show-&gt;field('stock', '\u5728\u5eab\u6570');\n        $show-&gt;field('image', '\u5546\u54c1\u753b\u50cf')-&gt;image();\n        $show-&gt;field('is_active', '\u72b6\u614b')-&gt;as(function($active) {\n            return $active ? '\u8ca9\u58f2\u4e2d' : '\u505c\u6b62\u4e2d';\n        });\n        $show-&gt;field('created_at', '\u4f5c\u6210\u65e5\u6642');\n        $show-&gt;field('updated_at', '\u66f4\u65b0\u65e5\u6642');\n\n        return $show;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u30c7\u30fc\u30bf\u30b0\u30ea\u30c3\u30c9\u306e\u5b9f\u88c5\u3068\u6d3b\u7528<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">\u9ad8\u5ea6\u306a\u30b0\u30ea\u30c3\u30c9\u6a5f\u80fd\u306e\u6d3b\u7528<\/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=\"\">protected function grid()\n{\n    $grid = new Grid(new Product());\n\n    \/\/ \u4e00\u62ec\u64cd\u4f5c\u306e\u8ffd\u52a0\n    $grid-&gt;batchActions(function ($batch) {\n        $batch-&gt;disableDelete();\n        $batch-&gt;add('\u5728\u5eab\u88dc\u5145', new ReplenishStock());\n    });\n\n    \/\/ \u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u6a5f\u80fd\u306e\u8ffd\u52a0\n    $grid-&gt;export(function ($export) {\n        $export-&gt;filename('products-' . date('Y-m-d'));\n        $export-&gt;except(['image']);\n    });\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30c4\u30fc\u30eb\u306e\u8ffd\u52a0\n    $grid-&gt;tools(function ($tools) {\n        $tools-&gt;append(new ImportButton());\n    });\n\n    return $grid;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u30d5\u30a9\u30fc\u30e0\u8981\u7d20\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">\u767b\u9332\u30fb\u7de8\u96c6\u30d5\u30a9\u30fc\u30e0\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=\"\">protected function form()\n{\n    $form = new Form(new Product());\n\n    \/\/ \u57fa\u672c\u60c5\u5831\u30bf\u30d6\n    $form-&gt;tab('\u57fa\u672c\u60c5\u5831', function ($form) {\n        $form-&gt;text('name', '\u5546\u54c1\u540d')\n            -&gt;required()\n            -&gt;rules('required|max:255');\n\n        $form-&gt;textarea('description', '\u5546\u54c1\u8aac\u660e')\n            -&gt;rows(5);\n\n        $form-&gt;decimal('price', '\u4fa1\u683c')\n            -&gt;required()\n            -&gt;rules('required|numeric|min:0')\n            -&gt;help('\u7a0e\u629c\u304d\u4fa1\u683c\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044');\n\n        $form-&gt;number('stock', '\u5728\u5eab\u6570')\n            -&gt;default(0)\n            -&gt;rules('required|integer|min:0');\n    });\n\n    \/\/ \u753b\u50cf\u30fb\u72b6\u614b\u30bf\u30d6\n    $form-&gt;tab('\u753b\u50cf\u30fb\u72b6\u614b', function ($form) {\n        $form-&gt;image('image', '\u5546\u54c1\u753b\u50cf')\n            -&gt;move('products')\n            -&gt;uniqueName()\n            -&gt;rules('image|max:2048')\n            -&gt;help('2MB\u4ee5\u4e0b\u306eJPG\/PNG\u5f62\u5f0f\u306e\u753b\u50cf\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044');\n\n        $form-&gt;switch('is_active', '\u8ca9\u58f2\u72b6\u614b')\n            -&gt;default(1)\n            -&gt;states([\n                'on'  =&gt; ['value' =&gt; 1, 'text' =&gt; '\u8ca9\u58f2\u4e2d'],\n                'off' =&gt; ['value' =&gt; 0, 'text' =&gt; '\u505c\u6b62\u4e2d'],\n            ]);\n    });\n\n    \/\/ \u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u524d\u306e\u51e6\u7406\n    $form-&gt;saving(function (Form $form) {\n        if ($form-&gt;price) {\n            $form-&gt;price = round($form-&gt;price, 2);\n        }\n    });\n\n    return $form;\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">\u30ab\u30b9\u30bf\u30e0\u30d5\u30a9\u30fc\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\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\/Admin\/Extensions\/Form\/ProductStatus.php\nnamespace App\\Admin\\Extensions\\Form;\n\nuse Encore\\Admin\\Form\\Field;\n\nclass ProductStatus extends Field\n{\n    protected $view = 'admin.form.product-status';\n\n    public function render()\n    {\n        $this-&gt;script = &lt;&lt;&lt;EOT\n        $(document).ready(function() {\n            \/\/ \u30ab\u30b9\u30bf\u30e0\u30b9\u30c6\u30fc\u30bf\u30b9\u9078\u629e\u306eJavaScript\u5b9f\u88c5\n        });\nEOT;\n        return parent::render();\n    }\n}\n\n\/\/ Form::extend('product_status', ProductStatus::class);\u3067\u767b\u9332<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u5b9f\u88c5\u3057\u305fCRUD\u6a5f\u80fd\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u64cd\u4f5c\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5546\u54c1\u4e00\u89a7\u306e\u8868\u793a\u3068\u691c\u7d22<\/li>\n\n\n\n<li>\u5546\u54c1\u8a73\u7d30\u306e\u8868\u793a<\/li>\n\n\n\n<li>\u65b0\u898f\u5546\u54c1\u306e\u767b\u9332<\/li>\n\n\n\n<li>\u5546\u54c1\u60c5\u5831\u306e\u7de8\u96c6<\/li>\n\n\n\n<li>\u5546\u54c1\u306e\u524a\u9664\uff08\u8ad6\u7406\u524a\u9664\uff09<\/li>\n\n\n\n<li>\u5728\u5eab\u6570\u306e\u4e00\u62ec\u66f4\u65b0<\/li>\n\n\n\n<li>\u5546\u54c1\u30c7\u30fc\u30bf\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\/\u30a4\u30f3\u30dd\u30fc\u30c8<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u6a5f\u80fd\u306f\u3001Laravel Admin\u306e\u63d0\u4f9b\u3059\u308b\u57fa\u672c\u6a5f\u80fd\u3092\u62e1\u5f35\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u30d3\u30b8\u30cd\u30b9\u30cb\u30fc\u30ba\u306b\u5bfe\u5fdc\u3067\u304d\u308b\u3088\u3046\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u30bb\u30ad\u30e5\u30a2\u306b\u904b\u7528\u3059\u308b\u305f\u3081\u306e\u5bfe\u7b56\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-28\">Laravel Admin\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u6a29\u9650\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Admin\u306f\u3001\u5805\u7262\u306a\u6a29\u9650\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\uff08RBAC: Role-Based Access Control\uff09\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u3067\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">1. \u6a29\u9650\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\/Admin\/Controllers\/PermissionController.php\nuse Encore\\Admin\\Auth\\Database\\Permission;\n\nclass PermissionController extends AdminController\n{\n    protected function form()\n    {\n        $form = new Form(new Permission());\n\n        $form-&gt;text('name', '\u6a29\u9650\u540d')\n            -&gt;required()\n            -&gt;rules('required|unique:admin_permissions,name,{{id}}');\n\n        $form-&gt;text('slug', '\u30b9\u30e9\u30c3\u30b0')\n            -&gt;required()\n            -&gt;rules('required|unique:admin_permissions,slug,{{id}}');\n\n        $form-&gt;textarea('http_method', 'HTTP\u30e1\u30bd\u30c3\u30c9')\n            -&gt;help('GET,POST,PUT,DELETE');\n\n        $form-&gt;textarea('http_path', 'HTTP\u30d1\u30b9')\n            -&gt;help('\u8907\u6570\u306e\u30d1\u30b9\u306f\u6539\u884c\u3067\u533a\u5207\u3063\u3066\u304f\u3060\u3055\u3044');\n\n        return $form;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">2. \u30ed\u30fc\u30eb\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\/Admin\/Controllers\/RoleController.php\nuse Encore\\Admin\\Auth\\Database\\Role;\n\nclass RoleController extends AdminController\n{\n    protected function form()\n    {\n        $form = new Form(new Role());\n\n        $form-&gt;text('name', '\u30ed\u30fc\u30eb\u540d')\n            -&gt;required();\n\n        $form-&gt;text('slug', '\u30b9\u30e9\u30c3\u30b0')\n            -&gt;required();\n\n        $form-&gt;listbox('permissions', '\u6a29\u9650')\n            -&gt;options(Permission::all()-&gt;pluck('name', 'id'));\n\n        return $form;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">3. \u30a2\u30af\u30bb\u30b9\u5236\u5fa1\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\/Admin\/bootstrap.php\nEncore\\Admin\\Admin::auth()-&gt;extend('check', function ($permission) {\n    $user = Admin::user();\n\n    \/\/ \u30b9\u30fc\u30d1\u30fc\u30e6\u30fc\u30b6\u30fc\u306e\u30c1\u30a7\u30c3\u30af\n    if ($user-&gt;isAdministrator()) {\n        return true;\n    }\n\n    \/\/ \u6a29\u9650\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\n    return $user-&gt;can($permission);\n});\n\n\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\u4f8b\nclass ProductController extends AdminController\n{\n    public function __construct()\n    {\n        $this-&gt;middleware('admin.permission:product-management');\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">XSS\u5bfe\u7b56\u3068CSRF\u5bfe\u7b56<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">1. XSS\u5bfe\u7b56\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=\"\">\/\/ config\/admin.php\n'html_purifier' =&gt; [\n    'HTML.Allowed' =&gt; 'div,b,strong,i,em,u,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src]',\n    'CSS.AllowedProperties' =&gt; 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align',\n    'AutoFormat.AutoParagraph' =&gt; true,\n    'AutoFormat.RemoveEmpty' =&gt; true,\n],\n\n\/\/ \u30d5\u30a9\u30fc\u30e0\u3067\u306e\u4f7f\u7528\u4f8b\nprotected function form()\n{\n    $form = new Form(new Product());\n\n    $form-&gt;text('name')-&gt;escape(true);\n    $form-&gt;textarea('description')-&gt;purify();\n\n    return $form;\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">2. CSRF\u5bfe\u7b56\u306e\u5f37\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\/Http\/Middleware\/VerifyCsrfToken.php\nprotected $except = [\n    'admin\/api\/*', \/\/ API\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306f\u9664\u5916\n];\n\n\/\/ Ajax\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u306e\u30c8\u30fc\u30af\u30f3\u8a2d\u5b9a\n$.ajaxSetup({\n    headers: {\n        'X-CSRF-TOKEN': $('meta[name=\"csrf-token\"]').attr('content')\n    }\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">\u30bb\u30ad\u30e5\u30a2\u306a\u7ba1\u7406\u753b\u9762\u904b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">1. \u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u5f37\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\/admin.php\n'auth' =&gt; [\n    'remember' =&gt; true,\n    'session' =&gt; [\n        'lifetime' =&gt; 120, \/\/ minutes\n        'expire_on_close' =&gt; true,\n    ],\n    'throttle' =&gt; [\n        'max_attempts' =&gt; 5,\n        'lockout_duration' =&gt; 15, \/\/ minutes\n    ],\n],<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">2. \u30ed\u30b0\u30a4\u30f3\u8a66\u884c\u306e\u5236\u9650\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\/Admin\/Controllers\/AuthController.php\nuse Illuminate\\Cache\\RateLimiter;\n\nclass AuthController extends \\Encore\\Admin\\Controllers\\AuthController\n{\n    protected function attemptLogin(Request $request)\n    {\n        $username = $request-&gt;input($this-&gt;username());\n\n        \/\/ \u30ec\u30fc\u30c8\u30ea\u30df\u30c3\u30bf\u30fc\u306e\u8a2d\u5b9a\n        $limiter = app(RateLimiter::class);\n        $key = 'login.' . $username . '.' . $request-&gt;ip();\n\n        if ($limiter-&gt;tooManyAttempts($key, 5)) {\n            $seconds = $limiter-&gt;availableIn($key);\n            return back()-&gt;withErrors([\n                $this-&gt;username() =&gt; \n                    \"\u30ed\u30b0\u30a4\u30f3\u8a66\u884c\u56de\u6570\u304c\u4e0a\u9650\u3092\u8d85\u3048\u307e\u3057\u305f\u3002{$seconds}\u79d2\u5f8c\u306b\u518d\u8a66\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\n            ]);\n        }\n\n        if ($this-&gt;guard()-&gt;attempt($credentials)) {\n            $limiter-&gt;clear($key);\n            return true;\n        }\n\n        $limiter-&gt;hit($key, 15 * 60);\n        return false;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">3. \u4e8c\u8981\u7d20\u8a8d\u8a3c\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\/Admin\/Controllers\/AuthController.php\nuse PragmaRX\\Google2FA\\Google2FA;\n\nclass AuthController extends \\Encore\\Admin\\Controllers\\AuthController\n{\n    public function verify2fa(Request $request)\n    {\n        $google2fa = new Google2FA();\n\n        $valid = $google2fa-&gt;verifyKey(\n            auth()-&gt;user()-&gt;google2fa_secret,\n            $request-&gt;input('one_time_password'),\n            8 \/\/ \u8a31\u5bb9\u3059\u308b\u6642\u9593\u306e\u30ba\u30ec\uff08\u5206\uff09\n        );\n\n        if ($valid) {\n            $request-&gt;session()-&gt;put('2fa_verified', true);\n            return redirect()-&gt;intended(admin_base_path());\n        }\n\n        return back()-&gt;withErrors(['one_time_password' =&gt; '\u8a8d\u8a3c\u30b3\u30fc\u30c9\u304c\u7121\u52b9\u3067\u3059\u3002']);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/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\u9069\u7528<\/li>\n\n\n\n<li>[ ] \u30bb\u30c3\u30b7\u30e7\u30f3\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] IP\u30db\u30ef\u30a4\u30c8\u30ea\u30b9\u30c8\u306e\u8a2d\u5b9a\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09<\/li>\n\n\n\n<li>[ ] SSL\/TLS\u306e\u5f37\u5236<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u9069\u5207\u306a\u6a29\u9650\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] \u30ed\u30fc\u30eb\u306e\u5b9a\u671f\u7684\u306a\u898b\u76f4\u3057<\/li>\n\n\n\n<li>[ ] \u4e0d\u8981\u306a\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u524a\u9664<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u76e3\u67fb\u3068\u30ed\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u64cd\u4f5c\u30ed\u30b0\u306e\u8a18\u9332<\/li>\n\n\n\n<li>[ ] \u5b9a\u671f\u7684\u306a\u30ed\u30b0\u30ec\u30d3\u30e5\u30fc<\/li>\n\n\n\n<li>[ ] \u7570\u5e38\u691c\u77e5\u306e\u4ed5\u7d44\u307f<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001Laravel Admin\u306e\u7ba1\u7406\u753b\u9762\u3092\u5b89\u5168\u306b\u904b\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-41\">Laravel Admin\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u8853<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">\u30c6\u30fc\u30de\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">1. \u57fa\u672c\u7684\u306a\u30b9\u30bf\u30a4\u30eb\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\/Admin\/bootstrap.php\nAdmin::style('.content-header { background: #f8f9fa; }');\nAdmin::style(&lt;&lt;&lt;CSS\n    .navbar-default {\n        background-color: #2d3748;\n    }\n    .navbar-default .navbar-brand {\n        color: #ffffff;\n    }\n    .sidebar-menu &gt; li &gt; a {\n        padding: 12px 15px;\n    }\nCSS\n);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">2. \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=\"\"># \u30c6\u30fc\u30de\u7528\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u9020\npublic\/\n\u2514\u2500\u2500 vendor\/\n    \u2514\u2500\u2500 laravel-admin\/\n        \u2514\u2500\u2500 themes\/\n            \u2514\u2500\u2500 custom-theme\/\n                \u251c\u2500\u2500 css\/\n                \u2502   \u2514\u2500\u2500 custom.css\n                \u2514\u2500\u2500 js\/\n                    \u2514\u2500\u2500 custom.js<\/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=\"\">\/\/ config\/admin.php\n'theme' =&gt; [\n    'use' =&gt; 'custom-theme',\n    'options' =&gt; [\n        'color' =&gt; '#2d3748',\n        'layout' =&gt; 'fixed',\n        'sidebar_collapsed' =&gt; false,\n    ],\n],<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">3. Blade \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\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=\"\">\/\/ resources\/views\/admin\/partials\/footer.blade.php\n&lt;footer class=\"main-footer\"&gt;\n    &lt;div class=\"pull-right hidden-xs\"&gt;\n        &lt;strong&gt;Version&lt;\/strong&gt; {{ config('admin.version') }}\n    &lt;\/div&gt;\n    &lt;strong&gt;Copyright &amp;copy; {{ date('Y') }}\n        &lt;a href=\"{{ config('admin.footer.company_url') }}\"&gt;\n            {{ config('admin.footer.company_name') }}\n        &lt;\/a&gt;\n    &lt;\/strong&gt;\n&lt;\/footer&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">\u72ec\u81ea\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u4f5c\u6210\u3068\u7d71\u5408<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">1. \u30ab\u30b9\u30bf\u30e0\u30d5\u30a9\u30fc\u30e0\u30d5\u30a3\u30fc\u30eb\u30c9\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\/Admin\/Extensions\/Form\/TagInput.php\nnamespace App\\Admin\\Extensions\\Form;\n\nuse Encore\\Admin\\Form\\Field;\n\nclass TagInput extends Field\n{\n    protected $view = 'admin.form.tag-input';\n\n    public function render()\n    {\n        $this-&gt;script = &lt;&lt;&lt;EOT\n$(document).ready(function() {\n    $('#{$this-&gt;id}').select2({\n        tags: true,\n        tokenSeparators: [',', ' '],\n        createTag: function(params) {\n            return {\n                id: params.term,\n                text: params.term,\n                newTag: true\n            };\n        }\n    });\n});\nEOT;\n        return parent::render();\n    }\n}\n\n\/\/ resources\/views\/admin\/form\/tag-input.blade.php\n&lt;div class=\"form-group {!! !$errors-&gt;has($errorKey) ?: 'has-error' !!}\"&gt;\n    &lt;label class=\"col-sm-2 control-label\"&gt;{{ $label }}&lt;\/label&gt;\n    &lt;div class=\"col-sm-8\"&gt;\n        &lt;select class=\"form-control {{ $class }}\" id=\"{{ $id }}\" name=\"{{ $name }}[]\" multiple&gt;\n            @foreach($value as $tag)\n                &lt;option value=\"{{ $tag }}\" selected&gt;{{ $tag }}&lt;\/option&gt;\n            @endforeach\n        &lt;\/select&gt;\n        @include('admin::form.error')\n        @include('admin::form.help-block')\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">2. \u30ab\u30b9\u30bf\u30e0\u30b0\u30ea\u30c3\u30c9\u30ab\u30e9\u30e0\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\/Admin\/Extensions\/Column\/ProgressBar.php\nnamespace App\\Admin\\Extensions\\Column;\n\nuse Encore\\Admin\\Admin;\nuse Encore\\Admin\\Grid\\Displayers\\AbstractDisplayer;\n\nclass ProgressBar extends AbstractDisplayer\n{\n    public function display($color = 'primary')\n    {\n        Admin::style('.progress { margin-bottom: 0; }');\n\n        return &lt;&lt;&lt;EOT\n&lt;div class=\"progress\"&gt;\n    &lt;div class=\"progress-bar progress-bar-{$color}\" \n         role=\"progressbar\" \n         aria-valuenow=\"{$this-&gt;value}\" \n         aria-valuemin=\"0\" \n         aria-valuemax=\"100\" \n         style=\"width: {$this-&gt;value}%;\"&gt;\n        {$this-&gt;value}%\n    &lt;\/div&gt;\n&lt;\/div&gt;\nEOT;\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\n$grid-&gt;column('progress')-&gt;progressBar('success');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u9ad8\u5ea6\u306a\u6a5f\u80fd\u62e1\u5f35\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-50\">1. \u30ab\u30b9\u30bf\u30e0\u30da\u30fc\u30b8\u306e\u8ffd\u52a0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Admin\/Controllers\/DashboardController.php\nuse App\\Http\\Controllers\\Controller;\nuse Encore\\Admin\\Layout\\Content;\nuse Encore\\Admin\\Widgets\\Box;\nuse Encore\\Admin\\Widgets\\Chart\\Bar;\n\nclass DashboardController extends Controller\n{\n    public function index(Content $content)\n    {\n        return $content\n            -&gt;title('\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9')\n            -&gt;description('\u30b7\u30b9\u30c6\u30e0\u6982\u8981')\n            -&gt;row(function($row) {\n                $row-&gt;column(4, new Box('\u58f2\u4e0a\u7d71\u8a08', $this-&gt;salesChart()));\n                $row-&gt;column(4, new Box('\u5728\u5eab\u72b6\u6cc1', $this-&gt;stockStatus()));\n                $row-&gt;column(4, new Box('\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3', $this-&gt;recentActivity()));\n            });\n    }\n\n    protected function salesChart()\n    {\n        $chart = new Bar([\n            '\u30c7\u30fc\u30bf\u30bb\u30c3\u30c81' =&gt; [10, 20, 30, 40],\n            '\u30c7\u30fc\u30bf\u30bb\u30c3\u30c82' =&gt; [15, 25, 35, 45],\n        ]);\n\n        return $chart-&gt;render();\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">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\/Admin\/Actions\/Post\/BatchRestore.php\nnamespace App\\Admin\\Actions\\Post;\n\nuse Encore\\Admin\\Actions\\BatchAction;\nuse Illuminate\\Database\\Eloquent\\Collection;\n\nclass BatchRestore extends BatchAction\n{\n    public $name = '\u4e00\u62ec\u5fa9\u5143';\n\n    public function handle(Collection $collection)\n    {\n        $collection-&gt;each-&gt;restore();\n\n        return $this-&gt;response()-&gt;success('\u9078\u629e\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9\u3092\u5fa9\u5143\u3057\u307e\u3057\u305f')-&gt;refresh();\n    }\n\n    public function dialog()\n    {\n        $this-&gt;confirm('\u9078\u629e\u3055\u308c\u305f\u30ec\u30b3\u30fc\u30c9\u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b\uff1f');\n    }\n}\n\n\/\/ \u30b0\u30ea\u30c3\u30c9\u3067\u306e\u4f7f\u7528\n$grid-&gt;batchActions(function ($batch) {\n    $batch-&gt;add(new BatchRestore());\n});<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-52\">3. \u30ab\u30b9\u30bf\u30e0\u30e1\u30cb\u30e5\u30fc\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\/Admin\/bootstrap.php\nAdmin::menu()-&gt;add([\n    [\n        'title' =&gt; '\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9',\n        'icon'  =&gt; 'fa-dashboard',\n        'uri'   =&gt; '\/admin\/dashboard'\n    ],\n    [\n        'title' =&gt; '\u5546\u54c1\u7ba1\u7406',\n        'icon'  =&gt; 'fa-shopping-cart',\n        'children' =&gt; [\n            [\n                'title' =&gt; '\u5546\u54c1\u4e00\u89a7',\n                'icon'  =&gt; 'fa-list',\n                'uri'   =&gt; '\/admin\/products'\n            ],\n            [\n                'title' =&gt; '\u30ab\u30c6\u30b4\u30ea\u30fc\u7ba1\u7406',\n                'icon'  =&gt; 'fa-tags',\n                'uri'   =&gt; '\/admin\/categories'\n            ]\n        ]\n    ]\n]);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6280\u8853\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001Laravel Admin\u3092\u3088\u308a\u67d4\u8edf\u3067\u4f7f\u3044\u3084\u3059\u3044\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u306b\u767a\u5c55\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3092\u884c\u3063\u305f\u5f8c\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-53\">Laravel Admin\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-54\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-55\">1. \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\/Admin\/Controllers\/ProductController.php\nprotected function grid()\n{\n    $grid = new Grid(new Product());\n\n    \/\/ N+1\u554f\u984c\u306e\u89e3\u6c7a\n    $grid-&gt;model()-&gt;with(['category', 'brand']);\n\n    \/\/ \u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u53d6\u5f97\n    $grid-&gt;model()-&gt;select(['id', 'name', 'price', 'stock', 'is_active']);\n\n    \/\/ \u5927\u91cf\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\n    $grid-&gt;paginate(50);\n\n    \/\/ \u30ab\u30e9\u30e0\u306e\u30bd\u30fc\u30c8\u6642\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u5411\u4e0a\n    $grid-&gt;column('price', '\u4fa1\u683c')-&gt;sortable()-&gt;display(function ($price) {\n        return number_format($price);\n    })-&gt;sortableColumn();\n\n    return $grid;\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-56\">2. \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\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=\"\">\/\/ database\/migrations\/2024_02_01_add_indexes_to_products_table.php\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nclass AddIndexesToProductsTable extends Migration\n{\n    public function up()\n    {\n        Schema::table('products', function (Blueprint $table) {\n            \/\/ \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u8ffd\u52a0\n            $table-&gt;index(['category_id', 'is_active']);\n            \/\/ \u691c\u7d22\u7528\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\n            $table-&gt;fulltext(['name', 'description']);\n            \/\/ \u30bd\u30fc\u30c8\u7528\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\n            $table-&gt;index('created_at');\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-57\">3. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\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=\"\">\/\/ app\/Providers\/AppServiceProvider.php\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Log;\n\npublic function boot()\n{\n    if (config('app.debug')) {\n        DB::listen(function ($query) {\n            $sql = $query-&gt;sql;\n            $bindings = $query-&gt;bindings;\n            $time = $query-&gt;time;\n\n            Log::channel('query')-&gt;info(sprintf(\n                '[%.2fms] %s [%s]',\n                $time,\n                $sql,\n                implode(', ', $bindings)\n            ));\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-58\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-59\">1. \u30d3\u30e5\u30fc\u30ad\u30e3\u30c3\u30b7\u30e5\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\/Admin\/Controllers\/DashboardController.php\npublic function index(Content $content)\n{\n    $cacheKey = 'admin_dashboard_' . auth()-&gt;id();\n\n    $dashboard = Cache::remember($cacheKey, now()-&gt;addMinutes(30), function () {\n        return [\n            'total_sales' =&gt; Order::sum('total'),\n            'total_products' =&gt; Product::count(),\n            'recent_orders' =&gt; Order::latest()-&gt;take(5)-&gt;get(),\n            'stock_alerts' =&gt; Product::where('stock', '&lt;', 10)-&gt;get()\n        ];\n    });\n\n    return $content\n        -&gt;title('\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9')\n        -&gt;view('admin.dashboard', compact('dashboard'));\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-60\">2. \u30e2\u30c7\u30eb\u30ad\u30e3\u30c3\u30b7\u30e5\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\/Models\/Product.php\nuse Illuminate\\Support\\Facades\\Cache;\n\nclass Product extends Model\n{\n    protected static function boot()\n    {\n        parent::boot();\n\n        static::saved(function ($product) {\n            Cache::tags(['products'])-&gt;flush();\n        });\n\n        static::deleted(function ($product) {\n            Cache::tags(['products'])-&gt;flush();\n        });\n    }\n\n    public static function getCachedCategories()\n    {\n        return Cache::tags(['products'])-&gt;remember('product_categories', 60, function () {\n            return self::select('category_id')\n                -&gt;distinct()\n                -&gt;with('category')\n                -&gt;get()\n                -&gt;pluck('category');\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-61\">3. API\u5fdc\u7b54\u306e\u30ad\u30e3\u30c3\u30b7\u30e5<\/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\/Admin\/Controllers\/Api\/ProductController.php\npublic function index(Request $request)\n{\n    $cacheKey = 'api_products_' . md5($request-&gt;fullUrl());\n\n    return Cache::remember($cacheKey, now()-&gt;addMinutes(5), function () use ($request) {\n        return Product::filter($request-&gt;all())\n            -&gt;paginate($request-&gt;get('per_page', 15));\n    });\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-62\">\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u52b9\u7387\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-63\">1. \u30d0\u30c3\u30c1\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\/Admin\/Actions\/Post\/BatchImport.php\nnamespace App\\Admin\\Actions\\Post;\n\nuse Encore\\Admin\\Actions\\Action;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\Bus;\n\nclass BatchImport extends Action\n{\n    public $name = '\u5546\u54c1\u4e00\u62ec\u30a4\u30f3\u30dd\u30fc\u30c8';\n\n    protected function handleBatch(Collection $collection)\n    {\n        \/\/ \u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a\n        $chunks = $collection-&gt;chunk(1000);\n\n        $jobs = $chunks-&gt;map(function ($chunk) {\n            return new ImportProductsJob($chunk);\n        });\n\n        Bus::batch($jobs)\n            -&gt;allowFailures()\n            -&gt;dispatch();\n\n        return $this-&gt;response()-&gt;success('\u30a4\u30f3\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u307e\u3057\u305f');\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-64\">2. \u30ad\u30e5\u30fc\u306e\u6d3b\u7528<\/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\/Jobs\/ImportProductsJob.php\nnamespace App\\Jobs;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\n\nclass ImportProductsJob implements ShouldQueue\n{\n    use InteractsWithQueue, Queueable, SerializesModels;\n\n    protected $products;\n\n    public function __construct(Collection $products)\n    {\n        $this-&gt;products = $products;\n    }\n\n    public function handle()\n    {\n        foreach ($this-&gt;products as $product) {\n            Product::create($product);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-65\">3. \u975e\u540c\u671f\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\/Admin\/Controllers\/ProductController.php\npublic function export()\n{\n    \/\/ \u975e\u540c\u671f\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u51e6\u7406\n    $job = new ExportProductsJob(request()-&gt;all());\n    $this-&gt;dispatch($job);\n\n    admin_success('\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u307e\u3057\u305f\u3002\u5b8c\u4e86\u6642\u306b\u30e1\u30fc\u30eb\u901a\u77e5\u3055\u308c\u307e\u3059\u3002');\n    return back();\n}\n\n\/\/ \u30e1\u30fc\u30eb\u901a\u77e5\u306e\u5b9f\u88c5\nclass ExportCompletedMail extends Mailable\n{\n    public function build()\n    {\n        return $this-&gt;markdown('emails.exports.completed')\n            -&gt;attach(storage_path('app\/exports\/products.xlsx'));\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u6280\u8853\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001Laravel Admin\u306e\u7ba1\u7406\u753b\u9762\u306f\u5927\u898f\u6a21\u306a\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3067\u3082\u5feb\u9069\u306b\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u904b\u7528\u6642\u306b\u767a\u751f\u3057\u3046\u308b\u30c8\u30e9\u30d6\u30eb\u3078\u306e\u5bfe\u51e6\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-66\">\u5b9f\u8df5\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-67\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-68\">1. \u8a8d\u8a3c\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/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\u4f8b\nSession store not set on request.\n\n# \u89e3\u6c7a\u65b9\u6cd5\nphp artisan config:clear\nphp artisan config:cache<\/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=\"\">\/\/ config\/admin.php \u306e\u78ba\u8a8d\n'auth' =&gt; [\n    'guards' =&gt; [\n        'admin' =&gt; [\n            'driver'   =&gt; 'session',\n            'provider' =&gt; 'admin',\n        ],\n    ],\n\n    'providers' =&gt; [\n        'admin' =&gt; [\n            'driver' =&gt; 'eloquent',\n            'model'  =&gt; Encore\\Admin\\Auth\\Database\\Administrator::class,\n        ],\n    ],\n],<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-69\">2. \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u6a5f\u80fd\u306e\u30a8\u30e9\u30fc<\/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=\"\">\/\/ storage\/logs\/laravel.log \u306e\u30a8\u30e9\u30fc\nUnable to create the \"\/public\/upload\" directory\n\n\/\/ \u89e3\u6c7a\u65b9\u6cd5\n\/\/ app\/Admin\/bootstrap.php\nAdmin::configureUploadDriver();\n\n\/\/ \u30b9\u30c8\u30ec\u30fc\u30b8\u30ea\u30f3\u30af\u306e\u4f5c\u6210\nphp artisan storage:link\n\n\/\/ \u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\nchmod -R 775 storage\nchmod -R 775 public\/uploads<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-70\">3. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/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=\"\">\/\/ \u30c6\u30fc\u30d6\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u30a8\u30e9\u30fc\nSQLSTATE[42S02]: Base table or view not found\n\n\/\/ \u89e3\u6c7a\u65b9\u6cd5\n\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u78ba\u8a8d\nphp artisan migrate:status\n\n\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u518d\u5b9f\u884c\nphp artisan migrate:refresh --seed\n\n\/\/ \u30c6\u30fc\u30d6\u30eb\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306e\u78ba\u8a8d\n\/\/ config\/admin.php\n'database' =&gt; [\n    'connection' =&gt; '',\n    'users_table' =&gt; 'admin_users',\n    'users_model' =&gt; Encore\\Admin\\Auth\\Database\\Administrator::class,\n    'role_table' =&gt; 'admin_roles',\n    'permission_table' =&gt; 'admin_permissions',\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-71\">\u30c7\u30d0\u30c3\u30b0\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-72\">1. \u30ed\u30b0\u306e\u6d3b\u7528<\/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\/AppServiceProvider.php\nuse Illuminate\\Support\\Facades\\Log;\n\npublic function boot()\n{\n    if (config('app.debug')) {\n        \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u60c5\u5831\u306e\u30ed\u30b0\n        Log::channel('debug')-&gt;info('Request:', [\n            'url' =&gt; request()-&gt;fullUrl(),\n            'method' =&gt; request()-&gt;method(),\n            'input' =&gt; request()-&gt;all(),\n        ]);\n\n        \/\/ SQL\u30af\u30a8\u30ea\u306e\u30ed\u30b0\n        DB::listen(function($query) {\n            Log::channel('query')-&gt;info(\n                $query-&gt;sql,\n                $query-&gt;bindings,\n                $query-&gt;time\n            );\n        });\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-73\">2. \u30c7\u30d0\u30c3\u30b0\u30d0\u30fc\u306e\u6d3b\u7528<\/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=\"\">\/\/ composer.json \u306b\u8ffd\u52a0\n\"require-dev\": {\n    \"barryvdh\/laravel-debugbar\": \"^3.7\"\n}\n\n\/\/ config\/admin.php\n'extensions' =&gt; [\n    'debugbar' =&gt; [\n        'enable' =&gt; true,\n        'except' =&gt; [\n            'admin\/auth\/login',\n            'admin\/auth\/logout',\n        ],\n    ],\n],<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-74\">3. \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u6539\u5584<\/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\npublic function render($request, Throwable $exception)\n{\n    if ($request-&gt;is('admin\/*')) {\n        \/\/ \u7ba1\u7406\u753b\u9762\u5c02\u7528\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n        if ($exception instanceof AuthenticationException) {\n            return redirect()-&gt;guest('admin\/auth\/login');\n        }\n\n        if ($exception instanceof ValidationException) {\n            return back()-&gt;withErrors($exception-&gt;errors())\n                        -&gt;withInput();\n        }\n    }\n\n    return parent::render($request, $exception);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-75\">\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30ea\u30bd\u30fc\u30b9\u306e\u6d3b\u7528\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-76\">1. \u554f\u984c\u89e3\u6c7a\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u78ba\u8a8d<\/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=\"\">   # \u6700\u65b0\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u30af\u30ed\u30fc\u30f3\n   git clone https:\/\/github.com\/z-song\/laravel-admin.wiki.git<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>GitHub\u30a4\u30b7\u30e5\u30fc\u306e\u691c\u7d22<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30b7\u30e5\u30fc\u3092\u691c\u7d22\u3059\u308b\u969b\u306e\u52b9\u679c\u7684\u306a\u30ad\u30fc\u30ef\u30fc\u30c9:\n<ul class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u4e3b\u8981\u90e8\u5206<\/li>\n\n\n\n<li>\u95a2\u9023\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u540d<\/li>\n\n\n\n<li>\u30d0\u30fc\u30b8\u30e7\u30f3\u756a\u53f7<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306e\u53ce\u96c6<\/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=\"\">   \/\/ \u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306e\u51fa\u529b\n   dd([\n       'Laravel Version' =&gt; app()-&gt;version(),\n       'PHP Version' =&gt; PHP_VERSION,\n       'Admin Version' =&gt; \\Encore\\Admin\\Admin::VERSION,\n       'Config' =&gt; config('admin'),\n   ]);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-77\">2. \u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30b5\u30dd\u30fc\u30c8\u306e\u6d3b\u7528<\/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=\"\">\/\/ \u30d0\u30b0\u5831\u544a\u7528\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\n\/**\n * \u554f\u984c\u306e\u5831\u544a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\n *\n * \u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831:\n * - Laravel: {{ app()-&gt;version() }}\n * - Laravel Admin: {{ \\Encore\\Admin\\Admin::VERSION }}\n * - PHP: {{ PHP_VERSION }}\n *\n * \u554f\u984c\u306e\u8a73\u7d30:\n * - \u767a\u751f\u72b6\u6cc1:\n * - \u671f\u5f85\u3059\u308b\u52d5\u4f5c:\n * - \u5b9f\u969b\u306e\u52d5\u4f5c:\n * \n * \u518d\u73fe\u624b\u9806:\n * 1.\n * 2.\n * 3.\n *\/<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-78\">3. \u30ab\u30b9\u30bf\u30e0\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u306e\u5171\u6709<\/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\/Admin\/bootstrap.php\n\/\/ \u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u5171\u6709\u53ef\u80fd\u306a\u30ab\u30b9\u30bf\u30e0\u62e1\u5f35\u306e\u4f8b\nAdmin::extend('reporting', function ($app) {\n    $app-&gt;booted(function () {\n        \/\/ \u30ec\u30dd\u30fc\u30c8\u6a5f\u80fd\u306e\u62e1\u5f35\n    });\n});\n\n\/\/ \u62e1\u5f35\u6a5f\u80fd\u306e\u516c\u958b\u65b9\u6cd5\n\/**\n * 1. GitHub\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u4f5c\u6210\n * 2. composer.json\u306e\u4f5c\u6210\n * 3. README\u306e\u4f5c\u6210\n * 4. Packagist\u3078\u306e\u767b\u9332\n *\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u6280\u8853\u3092\u8eab\u306b\u3064\u3051\u308b\u3053\u3068\u3067\u3001Laravel Admin\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u767a\u751f\u3059\u308b\u554f\u984c\u306b\u52b9\u7387\u7684\u306b\u5bfe\u51e6\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u307e\u305f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3068\u306e\u9023\u643a\u306b\u3088\u308a\u3001\u3088\u308a\u826f\u3044\u89e3\u6c7a\u7b56\u3092\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-2491","post","type-post","status-publish","format-standard","category-php","nothumb"],"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2491","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=2491"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2491\/revisions"}],"predecessor-version":[{"id":2493,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2491\/revisions\/2493"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}