{"id":3184,"date":"2025-03-24T08:46:43","date_gmt":"2025-03-23T23:46:43","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3184"},"modified":"2025-03-24T08:47:12","modified_gmt":"2025-03-23T23:47:12","slug":"%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81laravel%e3%83%ab%e3%83%bc%e3%83%88%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e4%bd%bf%e3%81%84%e6%96%b9%e3%81%a8%e3%83%99%e3%82%b9%e3%83%88%e3%83%97","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3184","title":{"rendered":"\u5b8c\u5168\u89e3\u8aac\uff01Laravel\u30eb\u30fc\u30c8\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3010\u4fdd\u5b88\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3011"},"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\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Laravel\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304c\u679c\u305f\u3059\u91cd\u8981\u306a\u5f79\u5272<\/a>      <\/li>      <li>        <a href=\"#i-2\">\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u57fa\u672c\u69cb\u9020\u3068\u7279\u5fb4<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">HTTP\u30e1\u30bd\u30c3\u30c9\u3068\u30eb\u30fc\u30c8\u5b9a\u7fa9\u306e\u5bfe\u5fdc\u95a2\u4fc2<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">\u5b9f\u8df5\u7684\u306a\u30eb\u30fc\u30c8\u5b9a\u7fa9\u306e\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u30b7\u30f3\u30d7\u30eb\u306a\u30eb\u30fc\u30c8\u5b9a\u7fa9\u304b\u3089\u59cb\u3081\u308b\u57fa\u672c\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u30eb\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u6d3b\u7528\u3057\u305f\u52d5\u7684\u306aURL\u8a2d\u8a08<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8\u306b\u3088\u308b\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">CSRF\u306b\u3088\u308b\u4fdd\u8b77\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u6d3b\u7528\u3057\u305f\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u5165\u529b\u5024\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u9069\u5207\u306a\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30eb\u30fc\u30c8\u7ba1\u7406\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\u306b\u3088\u308b\u30b3\u30fc\u30c9\u6574\u7406\u306e\u5b9f\u8df5<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">API \u30eb\u30fc\u30c8\u306e\u8a2d\u8a08\u3068\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u8a2d\u8a08<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u5229\u7528\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-18\">N+1\u554f\u984c\u3092\u9632\u3050\u30eb\u30fc\u30c8\u8a2d\u8a08\u306e\u8003\u3048\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u30eb\u30fc\u30c8\u306e\u6d3b\u7528\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-20\">\u5b9f\u88c5\u306e\u969b\u306b\u3088\u304f\u3042\u308b\u30c8\u30e9\u30d6\u30eb\u3068\u89e3\u6c7a\u7b56<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u30eb\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u306e\u578b\u306e\u554f\u984c\u306e\u89e3\u6c7a<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u306e\u9632\u6b62\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">404\u30a8\u30e9\u30fc\u306e\u6b63\u3057\u3044\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/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\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Laravel\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304c\u679c\u305f\u3059\u91cd\u8981\u306a\u5f79\u5272<\/h3>\n\n\n\n<p>Laravel\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5168\u3066\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5165\u308a\u53e3\u3068\u3057\u3066\u6a5f\u80fd\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9069\u5207\u306a\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3084\u30a2\u30af\u30b7\u30e7\u30f3\u306b\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308b\u91cd\u8981\u306a\u5f79\u5272\u3092\u62c5\u3063\u3066\u3044\u307e\u3059\u3002\u9069\u5207\u306a\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u8a2d\u8a08\u306f\u3001\u4ee5\u4e0b\u306e\u89b3\u70b9\u304b\u3089\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u69cb\u9020\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>URL\u3068\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30ed\u30b8\u30c3\u30af\u306e\u660e\u78ba\u306a\u5bfe\u5fdc\u4ed8\u3051<\/li>\n\n\n\n<li>RESTful\u306aAPI\u8a2d\u8a08\u306e\u5b9f\u73fe<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u3068\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u6b63\u306a\u30a2\u30af\u30bb\u30b9\u306e\u5236\u5fa1<\/li>\n\n\n\n<li>\u30eb\u30fc\u30c8\u30ec\u30d9\u30eb\u3067\u306e\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u30d5\u30a9\u30fc\u30b8\u30a7\u30ea\uff08CSRF\uff09\u304b\u3089\u306e\u4fdd\u8b77<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u3088\u308b\u5fdc\u7b54\u901f\u5ea6\u306e\u5411\u4e0a<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u9069\u7528<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u57fa\u672c\u69cb\u9020\u3068\u7279\u5fb4<\/h3>\n\n\n\n<p>Laravel\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306f\u3001<code>routes<\/code>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u914d\u7f6e\u3055\u308c\u3001\u4e3b\u306b\u4ee5\u4e0b\u306e\u30d5\u30a1\u30a4\u30eb\u3067\u69cb\u6210\u3055\u308c\u3066\u3044\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=\"\">\/\/ routes\/web.php - Web\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u7528\u306e\u30eb\u30fc\u30c8\nRoute::get('\/', function () {\n    return view('welcome');\n});\n\n\/\/ routes\/api.php - API\u7528\u306e\u30eb\u30fc\u30c8\nRoute::get('\/users', [UserController::class, 'index']);\n\n\/\/ routes\/console.php - Artisan\u30b3\u30de\u30f3\u30c9\u7528\u306e\u30eb\u30fc\u30c8\nArtisan::command('inspire', function () {\n    $this-&gt;comment(Inspiring::quote());\n});<\/pre>\n\n\n\n<p>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30eb\u30fc\u30c8\u306e\u5206\u96e2\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>web.php<\/code>: \u30bb\u30c3\u30b7\u30e7\u30f3\u3001CSRF\u4fdd\u8b77\u3001\u30af\u30c3\u30ad\u30fc\u6697\u53f7\u5316\u3092\u542b\u3080Web\u30eb\u30fc\u30c8<\/li>\n\n\n\n<li><code>api.php<\/code>: \u30b9\u30c6\u30fc\u30c8\u30ec\u30b9\u3067\u30c8\u30fc\u30af\u30f3\u30d9\u30fc\u30b9\u306e\u8a8d\u8a3c\u3092\u4f7f\u7528\u3059\u308bAPI\u30eb\u30fc\u30c8<\/li>\n\n\n\n<li><code>console.php<\/code>: Artisan\u30b3\u30de\u30f3\u30c9\u306e\u5b9a\u7fa9<\/li>\n\n\n\n<li><code>channels.php<\/code>: WebSocket\u3068\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u5b9a\u7fa9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u81ea\u52d5\u30ed\u30fc\u30c9\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RouteServiceProvider\u306b\u3088\u308b\u81ea\u52d5\u8aad\u307f\u8fbc\u307f<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8d77\u52d5\u6642\u306e\u52b9\u7387\u7684\u306a\u30eb\u30fc\u30c8\u767b\u9332<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u540d\u524d\u7a7a\u9593\u306e\u81ea\u52d5\u9069\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RouteServiceProvider\u3067\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u540d\u524d\u7a7a\u9593\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30b0\u30eb\u30fc\u30d7\u5358\u4f4d\u3067\u306e\u540d\u524d\u7a7a\u9593\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">HTTP\u30e1\u30bd\u30c3\u30c9\u3068\u30eb\u30fc\u30c8\u5b9a\u7fa9\u306e\u5bfe\u5fdc\u95a2\u4fc2<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u5404HTTP\u30e1\u30bd\u30c3\u30c9\u306b\u5bfe\u5fdc\u3059\u308b\u30eb\u30fc\u30c8\u3092\u7c21\u6f54\u306b\u5b9a\u7fa9\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=\"\">\/\/ \u57fa\u672c\u7684\u306aHTTP\u30e1\u30bd\u30c3\u30c9\u306e\u5b9a\u7fa9\nRoute::get('\/users', [UserController::class, 'index']);     \/\/ GET\nRoute::post('\/users', [UserController::class, 'store']);    \/\/ POST\nRoute::put('\/users\/{id}', [UserController::class, 'update']);    \/\/ PUT\nRoute::delete('\/users\/{id}', [UserController::class, 'destroy']); \/\/ DELETE\n\n\/\/ \u8907\u6570\u306eHTTP\u30e1\u30bd\u30c3\u30c9\u306b\u5bfe\u5fdc\u3059\u308b\u30eb\u30fc\u30c8\nRoute::match(['get', 'post'], '\/', function () {\n    \/\/ GET\u307e\u305f\u306fPOST\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\n});\n\n\/\/ \u5168\u3066\u306eHTTP\u30e1\u30bd\u30c3\u30c9\u306b\u5bfe\u5fdc\u3059\u308b\u30eb\u30fc\u30c8\nRoute::any('\/', function () {\n    \/\/ \u5168\u3066\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\n});<\/pre>\n\n\n\n<p>HTTP\u30e1\u30bd\u30c3\u30c9\u3068\u305d\u306e\u4e00\u822c\u7684\u306a\u7528\u9014\uff1a<\/p>\n\n\n<div id=\"id-e8572dd1-7657-4a50-8cd5-3bf1ec08dab4\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>HTTP\u30e1\u30bd\u30c3\u30c9<\/th><th>\u4e3b\u306a\u7528\u9014<\/th><th>\u4e00\u822c\u7684\u306a\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>GET<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u53d6\u5f97<\/td><td>\u30e6\u30fc\u30b6\u30fc\u4e00\u89a7\u306e\u8868\u793a<\/td><\/tr><tr><td>POST<\/td><td>\u65b0\u898f\u30ea\u30bd\u30fc\u30b9\u306e\u4f5c\u6210<\/td><td>\u65b0\u898f\u30e6\u30fc\u30b6\u30fc\u306e\u767b\u9332<\/td><\/tr><tr><td>PUT\/PATCH<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u66f4\u65b0<\/td><td>\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u66f4\u65b0<\/td><\/tr><tr><td>DELETE<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664<\/td><td>\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>RESTful\u306a\u8a2d\u8a08\u539f\u5247<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u306b\u5bfe\u3059\u308b\u64cd\u4f5c\u3092HTTP\u30e1\u30bd\u30c3\u30c9\u3067\u8868\u73fe<\/li>\n\n\n\n<li>URL\u306f\u540d\u8a5e\u30d9\u30fc\u30b9\u3067\u8a2d\u8a08<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u8fd4\u5374<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30bd\u30c3\u30c9\u30b9\u30d7\u30fc\u30d5\u30a3\u30f3\u30b0<\/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=\"\">   &lt;!-- HTML\u30d5\u30a9\u30fc\u30e0\u3067PUT\/DELETE\/PATCH\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408 --&gt;\n   &lt;form method=\"POST\" action=\"\/users\/1\"&gt;\n       @method('PUT')\n       @csrf\n   &lt;\/form&gt;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30eb\u30fc\u30c8\u306e\u691c\u8a3c<\/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=\"\">   # \u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b\u30eb\u30fc\u30c8\u306e\u4e00\u89a7\u3092\u8868\u793a\n   php artisan route:list\n\n   # \u30ad\u30e3\u30c3\u30b7\u30e5\u3055\u308c\u305f\u30eb\u30fc\u30c8\u306e\u78ba\u8a8d\n   php artisan route:cache<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u57fa\u672c\u7684\u306a\u7406\u89e3\u306e\u4e0a\u306b\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u6a5f\u80fd\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">\u5b9f\u8df5\u7684\u306a\u30eb\u30fc\u30c8\u5b9a\u7fa9\u306e\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30b7\u30f3\u30d7\u30eb\u306a\u30eb\u30fc\u30c8\u5b9a\u7fa9\u304b\u3089\u59cb\u3081\u308b\u57fa\u672c\u30d1\u30bf\u30fc\u30f3<\/h3>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u30eb\u30fc\u30c8\u5b9a\u7fa9\u304b\u3089\u59cb\u3081\u308b\u3053\u3068\u3067\u3001Laravel\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u672c\u8cea\u3092\u7406\u89e3\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u57fa\u672c\u30d1\u30bf\u30fc\u30f3\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30af\u30ed\u30fc\u30b8\u30e3\u3092\u4f7f\u7528\u3057\u305f\u30b7\u30f3\u30d7\u30eb\u306a\u30eb\u30fc\u30c8<\/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=\"\">\/\/ \u57fa\u672c\u7684\u306aGET\u30eb\u30fc\u30c8\nRoute::get('\/hello', function () {\n    return 'Hello World';\n});\n\n\/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\nRoute::post('\/submit', function (Request $request) {\n    return 'Received: ' . $request-&gt;input('message');\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u30e1\u30bd\u30c3\u30c9\u306e\u547c\u3073\u51fa\u3057<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u5358\u4e00\u30a2\u30af\u30b7\u30e7\u30f3\nRoute::get('\/users', [UserController::class, 'index']);\n\n\/\/ \u8907\u6570\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u4e00\u62ec\u5b9a\u7fa9\nRoute::controller(UserController::class)-&gt;group(function () {\n    Route::get('\/users', 'index');\n    Route::post('\/users', 'store');\n    Route::get('\/users\/{id}', 'show');\n});<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d3\u30e5\u30fc\u306e\u76f4\u63a5\u8fd4\u5374<\/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=\"\">\/\/ \u30b7\u30f3\u30d7\u30eb\u306a\u30d3\u30e5\u30fc\u8fd4\u5374\nRoute::view('\/welcome', 'welcome');\n\n\/\/ \u30c7\u30fc\u30bf\u3092\u6e21\u3059\u30d3\u30e5\u30fc\nRoute::view('\/welcome', 'welcome', ['name' =&gt; 'Taylor']);<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30f3\u30d7\u30eb\u306a\u6a5f\u80fd\u304b\u3089\u59cb\u3081\u3066\u6bb5\u968e\u7684\u306b\u62e1\u5f35<\/li>\n\n\n\n<li>\u9069\u5207\u306aHTTP\u30e1\u30bd\u30c3\u30c9\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u660e\u78ba\u306a\u547d\u540d\u898f\u5247\u306e\u63a1\u7528<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30eb\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u6d3b\u7528\u3057\u305f\u52d5\u7684\u306aURL\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u52d5\u7684\u306aURL\u30d1\u30bf\u30fc\u30f3\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306b\u3001\u30eb\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5fc5\u9808\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u5b9a\u7fa9<\/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=\"\">\/\/ \u57fa\u672c\u7684\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\nRoute::get('\/users\/{id}', function ($id) {\n    return 'User ' . $id;\n});\n\n\/\/ \u8907\u6570\u30d1\u30e9\u30e1\u30fc\u30bf\nRoute::get('\/posts\/{post}\/comments\/{comment}', function ($postId, $commentId) {\n    return \"Post $postId, Comment $commentId\";\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u4f7f\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=\"\">\/\/ \u7701\u7565\u53ef\u80fd\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\nRoute::get('\/users\/{name?}', function ($name = null) {\n    return $name ?? 'Guest';\n});\n\n\/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u5024\u306e\u8a2d\u5b9a\nRoute::get('\/category\/{category?}', function ($category = 'all') {\n    return \"Category: $category\";\n});<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u6b63\u898f\u8868\u73fe\u306b\u3088\u308b\u5236\u7d04<\/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=\"\">\/\/ \u6570\u5024\u306e\u307f\u8a31\u53ef\nRoute::get('\/user\/{id}', function ($id) {\n    return \"User $id\";\n})-&gt;where('id', '[0-9]+');\n\n\/\/ \u8907\u6570\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u5236\u7d04\nRoute::get('\/user\/{name}\/{id}', function ($name, $id) {\n    return \"User $name with ID $id\";\n})-&gt;where(['name' =&gt; '[A-Za-z]+', 'id' =&gt; '[0-9]+']);\n\n\/\/ \u30b0\u30ed\u30fc\u30d0\u30eb\u30d1\u30bf\u30fc\u30f3\u5236\u7d04\uff08RouteServiceProvider\u5185\uff09\npublic function boot()\n{\n    Route::pattern('id', '[0-9]+');\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8\u306b\u3088\u308b\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/h3>\n\n\n\n<p>\u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001URL\u306e\u5909\u66f4\u306b\u5f37\u3044\u67d4\u8edf\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8<\/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=\"\">\/\/ \u30eb\u30fc\u30c8\u306b\u540d\u524d\u3092\u4ed8\u3051\u308b\nRoute::get('\/user\/profile', [UserProfileController::class, 'show'])\n    -&gt;name('profile');\n\n\/\/ \u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8\u306e\u4f7f\u7528\nreturn redirect()-&gt;route('profile');<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u542b\u3080\u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8<\/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=\"\">\/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u6301\u3064\u30eb\u30fc\u30c8\u306e\u5b9a\u7fa9\nRoute::get('\/user\/{id}\/profile', [UserProfileController::class, 'show'])\n    -&gt;name('user.profile');\n\n\/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u6307\u5b9a\u3057\u3066\u30eb\u30fc\u30c8\u3092\u751f\u6210\n$url = route('user.profile', ['id' =&gt; 1]);\nreturn redirect()-&gt;route('user.profile', ['id' =&gt; 1]);<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30eb\u30fc\u30c8\u540d\u306e\u4f53\u7cfb\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ea\u30bd\u30fc\u30b9\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u81ea\u52d5\u540d\u524d\u4ed8\u3051\nRoute::resource('photos', PhotoController::class);\n\n\/\/ \u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u4f7f\u7528\u3057\u305f\u540d\u524d\u306e\u4f53\u7cfb\u5316\nRoute::name('admin.')-&gt;group(function () {\n    Route::get('\/users', [AdminUserController::class, 'index'])\n        -&gt;name('users.index');\n    Route::get('\/posts', [AdminPostController::class, 'index'])\n        -&gt;name('posts.index');\n});<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u540d\u524d\u306e\u4e00\u8cab\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c9\u30c3\u30c8\u8a18\u6cd5\u306b\u3088\u308b\u968e\u5c64\u69cb\u9020\u306e\u8868\u73fe<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u95a2\u9023\u306e\u547d\u540d\u898f\u5247\u306e\u7d71\u4e00<\/li>\n\n\n\n<li>\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d3\u30e5\u30fc\u3067\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=\"\">\/\/ Blade\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306e\u4f7f\u7528\n&lt;a href=\"{{ route('user.profile', ['id' =&gt; $user-&gt;id]) }}\"&gt;\n    View Profile\n&lt;\/a&gt;\n\n\/\/ \u30d5\u30a9\u30fc\u30e0\u3067\u306e\u4f7f\u7528\n&lt;form action=\"{{ route('user.update', ['id' =&gt; $user-&gt;id]) }}\" method=\"POST\"&gt;\n    @method('PUT')\n    @csrf\n    &lt;!-- \u30d5\u30a9\u30fc\u30e0\u306e\u5185\u5bb9 --&gt;\n&lt;\/form&gt;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u306e\u5411\u4e0a<\/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=\"\">\/\/ \u30c6\u30b9\u30c8\u3067\u306e\u4f7f\u7528\u4f8b\npublic function test_user_can_view_profile()\n{\n    $user = User::factory()-&gt;create();\n\n    $response = $this-&gt;get(route('user.profile', ['id' =&gt; $user-&gt;id]));\n\n    $response-&gt;assertStatus(200);\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u30eb\u30fc\u30c8\u5b9a\u7fa9\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u62e1\u5f35\u6027\u306e\u3042\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u69cb\u9020\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">CSRF\u306b\u3088\u308b\u4fdd\u8b77\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>CSRF\u306f\u3001\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u30d5\u30a9\u30fc\u30b8\u30a7\u30ea\uff08Cross-Site Request Forgery\uff09\u306e\u7565\u3067\u3001Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u91cd\u8981\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u306e1\u3064\u3067\u3059\u3002Laravel\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u65b9\u6cd5\u3067CSRF\u4fdd\u8b77\u3092\u5b9f\u88c5\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>CSRF\u4fdd\u8b77\u306e\u57fa\u672c\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Http\/Kernel.php\nprotected $middlewareGroups = [\n    'web' =&gt; [\n        \\App\\Http\\Middleware\\VerifyCsrfToken::class,\n        \/\/ \u305d\u306e\u4ed6\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\n    ],\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d5\u30a9\u30fc\u30e0\u3067\u306eCSRF\u30c8\u30fc\u30af\u30f3\u306e\u4f7f\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=\"\">\/\/ Blade\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306e\u5b9f\u88c5\n&lt;form method=\"POST\" action=\"\/profile\"&gt;\n    @csrf\n    &lt;input type=\"text\" name=\"name\"&gt;\n    &lt;button type=\"submit\"&gt;\u9001\u4fe1&lt;\/button&gt;\n&lt;\/form&gt;\n\n\/\/ JavaScript\u3067\u306eAjax\u30ea\u30af\u30a8\u30b9\u30c8\n$.ajax({\n    url: '\/api\/user',\n    type: 'POST',\n    data: {\n        name: 'John'\n    },\n    headers: {\n        'X-CSRF-TOKEN': $('meta[name=\"csrf-token\"]').attr('content')\n    }\n});<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>CSRF\u4f8b\u5916\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Http\/Middleware\/VerifyCsrfToken.php\nprotected $except = [\n    'stripe\/*',  \/\/ Stripe\u306ewebhook\u306a\u3069\n    'api\/external\/*'  \/\/ \u5916\u90e8API\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\n];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u6d3b\u7528\u3057\u305f\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/h3>\n\n\n\n<p>\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u4f7f\u7528\u3057\u3066\u3001\u30eb\u30fc\u30c8\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u52b9\u679c\u7684\u306b\u5236\u5fa1\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f7f\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=\"\">\/\/ \u5358\u4e00\u30eb\u30fc\u30c8\u3067\u306e\u8a8d\u8a3c\u8981\u6c42\nRoute::get('\/dashboard', function () {\n    \/\/ \u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u51e6\u7406\n})-&gt;middleware('auth');\n\n\/\/ \u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\u3067\u306e\u8a8d\u8a3c\u8981\u6c42\nRoute::middleware(['auth'])-&gt;group(function () {\n    Route::get('\/dashboard', [DashboardController::class, 'index']);\n    Route::get('\/settings', [SettingController::class, 'index']);\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f5c\u6210\u3068\u9069\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=\"\">\/\/ php artisan make:middleware CheckRole\nclass CheckRole\n{\n    public function handle($request, Closure $next, $role)\n    {\n        if (!$request-&gt;user() || !$request-&gt;user()-&gt;hasRole($role)) {\n            abort(403, '\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093');\n        }\n        return $next($request);\n    }\n}\n\n\/\/ \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u767b\u9332\uff08app\/Http\/Kernel.php\uff09\nprotected $routeMiddleware = [\n    'role' =&gt; \\App\\Http\\Middleware\\CheckRole::class,\n];\n\n\/\/ \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f7f\u7528\nRoute::get('\/admin', function () {\n    \/\/\n})-&gt;middleware('role:admin');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u8907\u6570\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u7d44\u307f\u5408\u308f\u305b<\/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=\"\">Route::middleware(['auth', 'role:admin', 'verified'])-&gt;group(function () {\n    Route::get('\/admin\/users', [AdminUserController::class, 'index']);\n    Route::post('\/admin\/users', [AdminUserController::class, 'store']);\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u5165\u529b\u5024\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u9069\u5207\u306a\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u30eb\u30fc\u30c8\u3067\u53d7\u3051\u53d6\u308b\u5165\u529b\u5024\u306e\u9069\u5207\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/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=\"\">public function store(Request $request)\n{\n    $validated = $request-&gt;validate([\n        'title' =&gt; 'required|max:255',\n        'body' =&gt; 'required',\n        'email' =&gt; 'required|email|unique:users',\n        'password' =&gt; [\n            'required',\n            'min:8',\n            'regex:\/^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$\/'\n        ]\n    ]);\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6e08\u307f\u30c7\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u51e6\u7406\u3092\u7d99\u7d9a\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d5\u30a9\u30fc\u30e0\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u4f7f\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=\"\">\/\/ php artisan make:request StoreUserRequest\nclass StoreUserRequest extends FormRequest\n{\n    public function authorize()\n    {\n        return true;\n    }\n\n    public function rules()\n    {\n        return [\n            'name' =&gt; 'required|string|max:255',\n            'email' =&gt; 'required|email|unique:users,email,'.$this-&gt;id,\n            'role' =&gt; 'required|in:admin,user,editor'\n        ];\n    }\n\n    public function messages()\n    {\n        return [\n            'email.unique' =&gt; '\u3053\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u65e2\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002',\n            'role.in' =&gt; '\u6307\u5b9a\u3055\u308c\u305f\u5f79\u5272\u306f\u7121\u52b9\u3067\u3059\u3002'\n        ];\n    }\n}\n\n\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\npublic function store(StoreUserRequest $request)\n{\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6e08\u307f\u306e\u305f\u3081\u3001\u76f4\u63a5\u51e6\u7406\u3092\u5b9f\u884c\n    $user = User::create($request-&gt;validated());\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>API\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u51e6\u7406<\/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=\"\">\/\/ API\u30ea\u30bd\u30fc\u30b9\u3067\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\nclass UserResource extends JsonResource\n{\n    public function toArray($request)\n    {\n        return [\n            'id' =&gt; $this-&gt;id,\n            'name' =&gt; $this-&gt;name,\n            'email' =&gt; $this-&gt;email,\n            'created_at' =&gt; $this-&gt;created_at-&gt;format('Y-m-d H:i:s')\n        ];\n    }\n}\n\n\/\/ API\u30ec\u30b9\u30dd\u30f3\u30b9\u3067\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\npublic function store(Request $request)\n{\n    try {\n        $validated = $request-&gt;validate([\n            'name' =&gt; 'required|string|max:255',\n            'email' =&gt; 'required|email|unique:users'\n        ]);\n\n        $user = User::create($validated);\n\n        return new UserResource($user);\n    } catch (ValidationException $e) {\n        return response()-&gt;json([\n            'message' =&gt; '\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc',\n            'errors' =&gt; $e-&gt;errors()\n        ], 422);\n    }\n}<\/pre>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u591a\u5c64\u7684\u306a\u9632\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSRF\u30c8\u30fc\u30af\u30f3\u306e\u78ba\u5b9f\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5165\u529b\u5024\u306e\u53b3\u5bc6\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u306e\u4f8b\u5916\u51e6\u7406<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8<\/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<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=\"\">\/\/ \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u306e\u30ed\u30b0\u8a18\u9332\nLog::channel('security')-&gt;info('\u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a4\u30f3', [\n    'user_id' =&gt; $user-&gt;id,\n    'ip' =&gt; $request-&gt;ip(),\n    'user_agent' =&gt; $request-&gt;userAgent()\n]);<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u3067\u5b89\u5168\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30eb\u30fc\u30c8\u7ba1\u7406\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\u306b\u3088\u308b\u30b3\u30fc\u30c9\u6574\u7406\u306e\u5b9f\u8df5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30b3\u30fc\u30c9\u306e\u6574\u7406\u3068\u4fdd\u5b88\u6027\u306e\u5411\u4e0a\u304c\u56f3\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30b0\u30eb\u30fc\u30d7\u306e\u5b9a\u7fa9<\/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=\"\">\/\/ \u7ba1\u7406\u8005\u7528\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\nRoute::middleware(['auth', 'admin'])-&gt;group(function () {\n    Route::prefix('admin')-&gt;group(function () {\n        Route::get('\/dashboard', [AdminDashboardController::class, 'index']);\n        Route::resource('users', AdminUserController::class);\n        Route::resource('roles', RoleController::class);\n    });\n});\n\n\/\/ API\u7528\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\nRoute::middleware(['auth:sanctum'])-&gt;prefix('api\/v1')-&gt;group(function () {\n    Route::apiResource('products', ProductApiController::class);\n    Route::apiResource('orders', OrderApiController::class);\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u540d\u524d\u7a7a\u9593\u3068\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306e\u7d44\u307f\u5408\u308f\u305b<\/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=\"\">\/\/ \u6a5f\u80fd\u30e2\u30b8\u30e5\u30fc\u30eb\u5225\u306e\u30b0\u30eb\u30fc\u30d7\u5316\nRoute::prefix('shop')-&gt;name('shop.')-&gt;group(function () {\n    Route::prefix('products')-&gt;name('products.')-&gt;group(function () {\n        Route::get('\/', [ProductController::class, 'index'])-&gt;name('index');\n        Route::get('\/create', [ProductController::class, 'create'])-&gt;name('create');\n        Route::post('\/', [ProductController::class, 'store'])-&gt;name('store');\n    });\n\n    Route::prefix('orders')-&gt;name('orders.')-&gt;group(function () {\n        Route::get('\/', [OrderController::class, 'index'])-&gt;name('index');\n        Route::get('\/{order}', [OrderController::class, 'show'])-&gt;name('show');\n    });\n});<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u30b0\u30eb\u30fc\u30d7\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=\"\">\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u30b0\u30eb\u30fc\u30d7\u306e\u5b9a\u7fa9\nRoute::controller(ProductController::class)-&gt;group(function () {\n    Route::get('\/products', 'index');\n    Route::post('\/products', 'store');\n    Route::get('\/products\/{id}', 'show');\n    Route::put('\/products\/{id}', 'update');\n    Route::delete('\/products\/{id}', 'destroy');\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u6cd5<\/h3>\n\n\n\n<p>\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u6a5f\u80fd\u5225\u306e\u5206\u96e2\u3068\u7ba1\u7406\u304c\u5bb9\u6613\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u30eb\u30fc\u30c8<\/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=\"\">\/\/ \u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u30eb\u30fc\u30c8\u306e\u5b9a\u7fa9\nRoute::domain('{account}.example.com')-&gt;group(function () {\n    Route::get('\/', [AccountController::class, 'show']);\n    Route::get('\/users', [AccountUserController::class, 'index']);\n});\n\n\/\/ \u7279\u5b9a\u306e\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u6307\u5b9a\nRoute::domain('admin.example.com')-&gt;group(function () {\n    Route::get('\/', [AdminDashboardController::class, 'index']);\n    Route::resource('users', AdminUserController::class);\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u52d5\u7684\u30d1\u30e9\u30e1\u30fc\u30bf\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=\"\">\/\/ \u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u53d6\u5f97\u3068\u51e6\u7406\nRoute::domain('{tenant}.example.com')-&gt;group(function () {\n    Route::get('\/', function ($tenant) {\n        return \"Welcome to {$tenant}'s area\";\n    });\n\n    Route::get('\/dashboard', function ($tenant) {\n        return Tenant::where('subdomain', $tenant)-&gt;firstOrFail()\n            -&gt;dashboard();\n    });\n});<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5<\/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=\"\">\/\/ \u30c6\u30ca\u30f3\u30c8\u8b58\u5225\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f5c\u6210\nclass IdentifyTenant\n{\n    public function handle($request, Closure $next)\n    {\n        $tenant = Tenant::where('domain', $request-&gt;getHost())-&gt;first();\n\n        if (!$tenant) {\n            abort(404);\n        }\n\n        app()-&gt;instance('tenant', $tenant);\n        return $next($request);\n    }\n}\n\n\/\/ \u30eb\u30fc\u30c8\u3067\u306e\u4f7f\u7528\nRoute::domain('{tenant}.example.com')\n    -&gt;middleware('identify.tenant')\n    -&gt;group(function () {\n        Route::get('\/', [TenantController::class, 'dashboard']);\n        Route::resource('projects', ProjectController::class);\n    });<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">API \u30eb\u30fc\u30c8\u306e\u8a2d\u8a08\u3068\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>API\u30eb\u30fc\u30c8\u306e\u8a2d\u8a08\u306f\u3001\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u304a\u3044\u3066\u7279\u306b\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\u3068\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9<\/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=\"\">\/\/ API\u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\u306e\u5b9f\u88c5\nRoute::prefix('api\/v1')-&gt;middleware('auth:sanctum')-&gt;group(function () {\n    Route::apiResource('users', Api\\V1\\UserController::class);\n    Route::apiResource('posts', Api\\V1\\PostController::class);\n});\n\nRoute::prefix('api\/v2')-&gt;middleware('auth:sanctum')-&gt;group(function () {\n    Route::apiResource('users', Api\\V2\\UserController::class);\n    Route::apiResource('posts', Api\\V2\\PostController::class);\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5<\/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=\"\">\/\/ API\u30ea\u30bd\u30fc\u30b9\u306e\u5b9a\u7fa9\nclass UserResource extends JsonResource\n{\n    public function toArray($request)\n    {\n        return [\n            'id' =&gt; $this-&gt;id,\n            'name' =&gt; $this-&gt;name,\n            'email' =&gt; $this-&gt;email,\n            'created_at' =&gt; $this-&gt;created_at-&gt;toISOString(),\n            'posts' =&gt; PostResource::collection($this-&gt;whenLoaded('posts')),\n        ];\n    }\n}\n\n\/\/ API\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\nclass UserController extends Controller\n{\n    public function index()\n    {\n        $users = User::with('posts')-&gt;paginate();\n        return UserResource::collection($users);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>API\u8a8d\u8a3c\u3068\u30ec\u30fc\u30c8\u5236\u9650<\/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=\"\">\/\/ API\u8a8d\u8a3c\u3068\u30ec\u30fc\u30c8\u5236\u9650\u306e\u8a2d\u5b9a\nRoute::middleware(['auth:sanctum', 'throttle:api'])-&gt;prefix('api\/v1')-&gt;group(function () {\n    \/\/ \u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\n    Route::apiResource('users', UserController::class);\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30a2\u30af\u30b7\u30e7\u30f3\n    Route::post('users\/{user}\/verify', [UserController::class, 'verify']);\n\n    \/\/ \u30cd\u30b9\u30c8\u3055\u308c\u305f\u30ea\u30bd\u30fc\u30b9\n    Route::apiResource('users.posts', UserPostController::class);\n});<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3068\u30d5\u30a1\u30a4\u30eb\u5206\u5272<\/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=\"\">\/\/ routes\/modules\/admin.php\nRoute::prefix('admin')-&gt;group(function () {\n    require __DIR__.'\/admin\/users.php';\n    require __DIR__.'\/admin\/products.php';\n    require __DIR__.'\/admin\/orders.php';\n});\n\n\/\/ RouteServiceProvider\u3067\u306e\u8aad\u307f\u8fbc\u307f\npublic function boot()\n{\n    $this-&gt;mapAdminRoutes();\n    $this-&gt;mapApiRoutes();\n    $this-&gt;mapWebRoutes();\n}\n\nprotected function mapAdminRoutes()\n{\n    Route::middleware('web')\n         -&gt;group(base_path('routes\/modules\/admin.php'));\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\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=\"\"># \u30eb\u30fc\u30c8\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u751f\u6210\nphp artisan route:cache\n\n# \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\nphp artisan route:clear<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u751f\u6210\u3068\u306e\u9023\u643a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ OpenAPI\/Swagger \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u7528\u306e\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\n\/**\n * @OA\\Get(\n *     path=\"\/api\/v1\/users\",\n *     summary=\"\u30e6\u30fc\u30b6\u30fc\u4e00\u89a7\u306e\u53d6\u5f97\",\n *     @OA\\Response(response=200, description=\"\u6210\u529f\")\n * )\n *\/\npublic function index()\n{\n    \/\/ \u5b9f\u88c5\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u7ba1\u7406\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u3082\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u69cb\u9020\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u8a2d\u8a08<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u5229\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5927\u304d\u304f\u5411\u4e0a\u3055\u305b\u308b\u91cd\u8981\u306a\u6a5f\u80fd\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30eb\u30fc\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u57fa\u672c\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u751f\u6210\nphp artisan route:cache\n\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\nphp artisan route:clear\n\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u518d\u751f\u6210\nphp artisan route:cache --fresh<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u5229\u7528\u6642\u306e\u6ce8\u610f\u70b9<\/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=\"\">\/\/ \u52d5\u7684\u30eb\u30fc\u30c8\u767b\u9332\u3092\u907f\u3051\u308b\uff08\u30ad\u30e3\u30c3\u30b7\u30e5\u4e0d\u53ef\uff09\n\/\/ \u274c \u975e\u63a8\u5968\u306e\u65b9\u6cd5\nRoute::get('\/', function () {\n    $routes = DB::table('routes')-&gt;get();\n    foreach ($routes as $route) {\n        Route::get($route-&gt;path, $route-&gt;action);\n    }\n});\n\n\/\/ \u2705 \u63a8\u5968\u3055\u308c\u308b\u65b9\u6cd5\nRoute::get('\/{path}', [DynamicRouteController::class, 'handle'])\n    -&gt;where('path', '.*');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5225\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/app.php\n'debug' =&gt; env('APP_DEBUG', false),\n\n\/\/ RouteServiceProvider\u3067\u306e\u6761\u4ef6\u5206\u5c90\npublic function boot()\n{\n    if (!$this-&gt;app-&gt;environment('local')) {\n        $this-&gt;app['router']-&gt;middleware(['cache.headers:public;max_age=2628000;etag']);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">N+1\u554f\u984c\u3092\u9632\u3050\u30eb\u30fc\u30c8\u8a2d\u8a08\u306e\u8003\u3048\u65b9<\/h3>\n\n\n\n<p>N+1\u554f\u984c\u306f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u5927\u304d\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u308b\u4ee3\u8868\u7684\u306a\u554f\u984c\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Eager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\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=\"\">\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u5b9f\u88c5\nclass PostController extends Controller\n{\n    public function index()\n    {\n        \/\/ \u274c N+1\u554f\u984c\u304c\u767a\u751f\u3059\u308b\u30b3\u30fc\u30c9\n        $posts = Post::all();\n        foreach ($posts as $post) {\n            echo $post-&gt;user-&gt;name;  \/\/ \u5404\u6295\u7a3f\u306b\u5bfe\u3057\u3066\u30e6\u30fc\u30b6\u30fc\u30af\u30a8\u30ea\u304c\u767a\u751f\n        }\n\n        \/\/ \u2705 Eager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u30b3\u30fc\u30c9\n        $posts = Post::with(['user', 'comments', 'categories'])-&gt;get();\n        return view('posts.index', compact('posts'));\n    }\n\n    public function show($id)\n    {\n        \/\/ \u2705 \u5fc5\u8981\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u307f\u3092\u30ed\u30fc\u30c9\n        $post = Post::with(['user', 'comments' =&gt; function ($query) {\n            $query-&gt;latest()-&gt;limit(5);\n        }])-&gt;findOrFail($id);\n\n        return view('posts.show', compact('post'));\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>LazyEager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u4f7f\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=\"\">\/\/ \u30e2\u30c7\u30eb\u3067\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\nclass Post extends Model\n{\n    protected $with = ['user'];  \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u306eEager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\n\n    \/\/ \u5fc5\u8981\u306b\u5fdc\u3058\u3066Eager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u89e3\u9664\n    public function withoutDefaultRelations()\n    {\n        return $this-&gt;withoutGlobalScope('user');\n    }\n}\n\n\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\npublic function index()\n{\n    $posts = Post::paginate(20);\n\n    if ($posts-&gt;isEmpty()) {\n        return response()-&gt;json(['message' =&gt; '\u6295\u7a3f\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093']);\n    }\n\n    \/\/ \u5fc5\u8981\u306b\u306a\u3063\u305f\u6642\u70b9\u3067\u30ed\u30fc\u30c9\n    $posts-&gt;load(['comments' =&gt; function ($query) {\n        $query-&gt;latest();\n    }]);\n\n    return PostResource::collection($posts);\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u306e\u52b9\u7387\u7684\u306a\u4f7f\u7528\npublic function getActiveUsers()\n{\n    \/\/ \u274c \u975e\u52b9\u7387\u306a\u30af\u30a8\u30ea\n    $users = User::all()-&gt;filter(function ($user) {\n        return $user-&gt;posts-&gt;count() &gt; 0;\n    });\n\n    \/\/ \u2705 \u52b9\u7387\u7684\u306a\u30af\u30a8\u30ea\n    $users = User::has('posts')\n        -&gt;withCount('posts')\n        -&gt;with(['posts' =&gt; function ($query) {\n            $query-&gt;latest()-&gt;limit(5);\n        }])\n        -&gt;get();\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u30eb\u30fc\u30c8\u306e\u6d3b\u7528\u624b\u6cd5<\/h3>\n\n\n\n<p>\u30ea\u30bd\u30fc\u30b9\u30eb\u30fc\u30c8\u3092\u52b9\u7387\u7684\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u4fdd\u5b88\u6027\u3092\u4e21\u7acb\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5fc5\u8981\u306a\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u307f\u3092\u5b9a\u7fa9<\/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=\"\">\/\/ \u5fc5\u8981\u306a\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u307f\u3092\u6307\u5b9a\nRoute::resource('posts', PostController::class)-&gt;only([\n    'index', 'show', 'store'\n]);\n\n\/\/ \u7279\u5b9a\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u9664\u5916\nRoute::resource('comments', CommentController::class)-&gt;except([\n    'create', 'edit'\n]);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30ea\u30bd\u30fc\u30b9\u30eb\u30fc\u30c8<\/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\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u8ffd\u52a0\nRoute::resource('photos', PhotoController::class);\nRoute::get('photos\/{photo}\/download', [PhotoController::class, 'download'])\n    -&gt;name('photos.download');\n\n\/\/ API\u30ea\u30bd\u30fc\u30b9\u30eb\u30fc\u30c8\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\nRoute::apiResource('users', UserApiController::class)-&gt;middleware('api');\nRoute::post('users\/{user}\/verify', [UserApiController::class, 'verify'])\n    -&gt;name('users.verify');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30cd\u30b9\u30c8\u3055\u308c\u305f\u30ea\u30bd\u30fc\u30b9<\/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=\"\">\/\/ \u52b9\u7387\u7684\u306a\u30cd\u30b9\u30c8\u30ea\u30bd\u30fc\u30b9\u306e\u5b9a\u7fa9\nRoute::resource('posts.comments', PostCommentController::class)-&gt;shallow();\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30d1\u30e9\u30e1\u30fc\u30bf\u540d\u306e\u4f7f\u7528\nRoute::resource('users.posts', UserPostController::class)\n    -&gt;parameters([\n        'users' =&gt; 'user_id',\n        'posts' =&gt; 'post_slug'\n    ]);<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/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=\"\">\/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5\npublic function index()\n{\n    return Cache::remember('posts.all', now()-&gt;addHours(24), function () {\n        return Post::with(['user', 'comments'])\n            -&gt;latest()\n            -&gt;paginate(20);\n    });\n}\n\n\/\/ \u6761\u4ef6\u4ed8\u304d\u30ad\u30e3\u30c3\u30b7\u30e5\npublic function show($id)\n{\n    $cacheKey = \"post.{$id}.\" . auth()-&gt;id();\n\n    return Cache::remember($cacheKey, now()-&gt;addMinutes(30), function () use ($id) {\n        return Post::with(['user', 'comments'])\n            -&gt;findOrFail($id);\n    });\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9<\/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=\"\">\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u5b9a\npublic function up()\n{\n    Schema::create('posts', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;string('slug')-&gt;unique();\n        $table-&gt;foreignId('user_id')-&gt;constrained();\n        $table-&gt;string('title');\n        $table-&gt;text('content');\n        $table-&gt;timestamps();\n\n        \/\/ \u691c\u7d22\u3068\u30bd\u30fc\u30c8\u7528\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\n        $table-&gt;index(['created_at', 'user_id']);\n        $table-&gt;index('title');\n    });\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u76e3\u8996\u3068\u30ed\u30b0<\/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=\"\">\/\/ \u30af\u30a8\u30ea\u30ed\u30b0\u306e\u8a2d\u5b9a\nDB::listen(function ($query) {\n    Log::info(\n        $query-&gt;sql,\n        [\n            'bindings' =&gt; $query-&gt;bindings,\n            'time' =&gt; $query-&gt;time\n        ]\n    );\n});\n\n\/\/ N+1\u30af\u30a8\u30ea\u306e\u691c\u51fa\uff08\u958b\u767a\u74b0\u5883\uff09\nif (app()-&gt;environment('local')) {\n    \\DB::listen(function ($query) {\n        if (count(\\DB::getQueryLog()) &gt; 100) {\n            Log::warning('\u5927\u91cf\u306e\u30af\u30a8\u30ea\u304c\u767a\u751f\u3057\u3066\u3044\u307e\u3059');\n        }\n    });\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u9ad8\u901f\u3067\u52b9\u7387\u7684\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u5b9f\u88c5\u306e\u969b\u306b\u3088\u304f\u3042\u308b\u30c8\u30e9\u30d6\u30eb\u3068\u89e3\u6c7a\u7b56<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30eb\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u306e\u578b\u306e\u554f\u984c\u306e\u89e3\u6c7a<\/h3>\n\n\n\n<p>\u30eb\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u306e\u578b\u95a2\u9023\u306e\u554f\u984c\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5805\u7262\u6027\u306b\u5f71\u97ff\u3092\u4e0e\u3048\u308b\u91cd\u8981\u306a\u8ab2\u984c\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6697\u9ed9\u7684\u306a\u30e2\u30c7\u30eb\u7d50\u5408\u306e\u578b\u554f\u984c<\/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=\"\">\/\/ \u274c \u554f\u984c\u306e\u3042\u308b\u30b3\u30fc\u30c9\nRoute::get('\/users\/{user}', function (User $user) {\n    return $user;\n});\n\n\/\/ \u2705 \u578b\u5236\u7d04\u3092\u8ffd\u52a0\u3057\u305f\u5b89\u5168\u306a\u30b3\u30fc\u30c9\nRoute::get('\/users\/{user}', function (User $user) {\n    return $user;\n})-&gt;where('user', '[0-9]+');\n\n\/\/ \u3088\u308a\u67d4\u8edf\u306a\u5b9f\u88c5\nclass UserController extends Controller\n{\n    public function show(User $user)\n    {\n        abort_if($user-&gt;trashed(), 404);\n        return view('users.show', compact('user'));\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u578b\u5236\u7d04\u306e\u5b9f\u88c5<\/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=\"\">\/\/ RouteServiceProvider\u3067\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u30d1\u30bf\u30fc\u30f3\u5b9a\u7fa9\npublic function boot()\n{\n    Route::pattern('id', '[0-9]+');\n    Route::pattern('slug', '[a-z0-9-]+');\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\n    Route::bind('user', function ($value) {\n        return User::where('username', $value)\n            -&gt;orWhere('id', $value)\n            -&gt;firstOrFail();\n    });\n}\n\n\/\/ \u500b\u5225\u30eb\u30fc\u30c8\u3067\u306e\u4f7f\u7528\nRoute::get('\/posts\/{slug}', [PostController::class, 'show'])\n    -&gt;where('slug', '[a-z0-9-]+');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u8907\u6570\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u578b\u5236\u7d04<\/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=\"\">\/\/ \u8907\u6570\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u691c\u8a3c\nRoute::get('\/posts\/{year}\/{month}', [PostController::class, 'archive'])\n    -&gt;where([\n        'year' =&gt; '[0-9]{4}',\n        'month' =&gt; '(0[1-9]|1[0-2])'\n    ]);\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30bf\u306e\u4f7f\u7528\nclass ArchiveController extends Controller\n{\n    public function show($year, $month)\n    {\n        abort_if(!checkdate($month, 1, $year), 404);\n\n        return Post::whereYear('created_at', $year)\n            -&gt;whereMonth('created_at', $month)\n            -&gt;get();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u306e\u9632\u6b62\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u3092\u8457\u3057\u304f\u640d\u306a\u3046\u53ef\u80fd\u6027\u304c\u3042\u308b\u554f\u984c\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3067\u306e\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u274c \u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u3092\u5f15\u304d\u8d77\u3053\u3059\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\nRoute::middleware('auth')-&gt;group(function () {\n    Route::get('\/login', [AuthController::class, 'showLoginForm']);\n});\n\n\/\/ \u2705 \u9069\u5207\u306a\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5236\u5fa1\nRoute::middleware('guest')-&gt;group(function () {\n    Route::get('\/login', [AuthController::class, 'showLoginForm'])\n        -&gt;name('login');\n});\n\nRoute::middleware('auth')-&gt;group(function () {\n    Route::get('\/dashboard', [DashboardController::class, 'index'])\n        -&gt;name('dashboard');\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u4ed8\u304d\u30ea\u30c0\u30a4\u30ec\u30af\u30c8<\/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=\"\">class AuthMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        if (!auth()-&gt;check()) {\n            \/\/ \u73fe\u5728\u306eURL\u3092\u4fdd\u5b58\n            session()-&gt;put('url.intended', url()-&gt;current());\n            return redirect()-&gt;route('login');\n        }\n\n        \/\/ \u30ed\u30b0\u30a4\u30f3\u6e08\u307f\u30e6\u30fc\u30b6\u30fc\u304c\u8a8d\u8a3c\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3057\u305f\u5834\u5408\n        if ($request-&gt;is('login') || $request-&gt;is('register')) {\n            return redirect()-&gt;route('dashboard');\n        }\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5c65\u6b74\u306e\u7ba1\u7406<\/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=\"\">\/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305f\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5c65\u6b74\u306e\u7ba1\u7406\nclass RedirectManager\n{\n    private const MAX_REDIRECTS = 5;\n\n    public function handleRedirect($request, $destination)\n    {\n        $redirectCount = session()-&gt;get('redirect_count', 0);\n\n        if ($redirectCount &gt;= self::MAX_REDIRECTS) {\n            abort(500, '\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f');\n        }\n\n        session()-&gt;put('redirect_count', $redirectCount + 1);\n        return redirect()-&gt;to($destination);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">404\u30a8\u30e9\u30fc\u306e\u6b63\u3057\u3044\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/h3>\n\n\n\n<p>404\u30a8\u30e9\u30fc\u306e\u9069\u5207\u306a\u51e6\u7406\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u3068SEO\u306e\u4e21\u65b9\u306b\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0404\u30da\u30fc\u30b8\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\npublic function render($request, Throwable $exception)\n{\n    if ($exception instanceof NotFoundHttpException) {\n        if ($request-&gt;expectsJson()) {\n            return response()-&gt;json([\n                'message' =&gt; '\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093',\n                'status' =&gt; 404\n            ], 404);\n        }\n\n        return response()-&gt;view('errors.404', [\n            'requestedUrl' =&gt; $request-&gt;url(),\n            'referrer' =&gt; $request-&gt;header('referer')\n        ], 404);\n    }\n\n    return parent::render($request, $exception);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u4ed8\u304d404\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/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=\"\">class PostController extends Controller\n{\n    public function show($slug)\n    {\n        $post = Post::where('slug', $slug)\n            -&gt;with(['user', 'comments'])\n            -&gt;first();\n\n        if (!$post) {\n            \/\/ \u30bd\u30d5\u30c8\u30c7\u30ea\u30fc\u30c8\u6e08\u307f\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\n            $deletedPost = Post::onlyTrashed()\n                -&gt;where('slug', $slug)\n                -&gt;first();\n\n            if ($deletedPost) {\n                return response()-&gt;view('posts.deleted', [\n                    'post' =&gt; $deletedPost\n                ], 410); \/\/ Gone\n            }\n\n            abort(404);\n        }\n\n        return view('posts.show', compact('post'));\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>404\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a8\u30e9\u30fc\u30da\u30fc\u30b8\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u8a2d\u5b9a\nclass ErrorController extends Controller\n{\n    public function notFound()\n    {\n        return response()\n            -&gt;view('errors.404')\n            -&gt;header('Cache-Control', 'public, max-age=3600');\n    }\n\n    \/\/ \u30b5\u30a4\u30c8\u30de\u30c3\u30d7\u306e\u81ea\u52d5\u66f4\u65b0\n    public function updateSitemap()\n    {\n        $urls = Route::getRoutes()-&gt;getRoutes()\n            -&gt;filter(function ($route) {\n                return $route-&gt;methods()[0] === 'GET';\n            })\n            -&gt;map(function ($route) {\n                return url($route-&gt;uri());\n            });\n\n        Cache::put('sitemap.urls', $urls, now()-&gt;addDay());\n    }\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30ed\u30b0\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=\"\">\/\/ \u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u8a2d\u5b9a\npublic function report(Throwable $exception)\n{\n    if ($exception instanceof NotFoundHttpException) {\n        Log::channel('404')-&gt;info('404\u30a8\u30e9\u30fc', [\n            'url' =&gt; request()-&gt;url(),\n            'referrer' =&gt; request()-&gt;header('referer'),\n            'user_agent' =&gt; request()-&gt;userAgent()\n        ]);\n    }\n\n    parent::report($exception);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/app.php\n'debug' =&gt; env('APP_DEBUG', false),\n\n\/\/ \u30a8\u30e9\u30fc\u30da\u30fc\u30b8\u306e\u74b0\u5883\u5225\u8868\u793a\nif (config('app.debug')) {\n    \/\/ \u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u8868\u793a\n    return parent::render($request, $exception);\n} else {\n    \/\/ \u672c\u756a\u74b0\u5883\u3067\u306e\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u8868\u793a\n    return response()-&gt;view('errors.generic', [], 500);\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>SEO\u5bfe\u7b56<\/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=\"\">\/\/ 404\u30da\u30fc\u30b8\u306e\u30e1\u30bf\u60c5\u5831\u8a2d\u5b9a\n&lt;meta name=\"robots\" content=\"noindex, follow\"&gt;\n\n\/\/ \u30ab\u30ce\u30cb\u30ab\u30ebURL\u306e\u8a2d\u5b9a\n&lt;link rel=\"canonical\" href=\"{{ url('\/') }}\"&gt;\n\n\/\/ \u4ee3\u66ff\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u63d0\u6848\npublic function handleNotFound($request)\n{\n    $suggestedContent = Post::search($request-&gt;segment(2))\n        -&gt;take(5)\n        -&gt;get();\n\n    return response()-&gt;view('errors.404', [\n        'suggested' =&gt; $suggestedContent\n    ], 404);\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u624b\u6cd5\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5805\u7262\u3067\u4f7f\u3044\u3084\u3059\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u73fe\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":[33,12],"tags":[],"class_list":{"0":"post-3184","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php-laravel","7":"category-php","8":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3184","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=3184"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3184\/revisions"}],"predecessor-version":[{"id":3186,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3184\/revisions\/3186"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}