{"id":2646,"date":"2025-03-24T08:46:52","date_gmt":"2025-03-23T23:46:52","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2646"},"modified":"2025-03-24T08:47:20","modified_gmt":"2025-03-23T23:47:20","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-middleware%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%83%bb%e5%ae%9f%e8%a3%85%e4%be%8b15%e9%81%b8-%e3%82%bb","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2646","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Middleware\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u30fb\u5b9f\u88c5\u4f8b15\u9078 &#8211; \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u304b\u3089\u6700\u9069\u5316\u307e\u3067"},"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 Middleware\u3068\u306f\uff1f\u57fa\u790e\u304b\u3089\u7406\u89e3\u3059\u308b\u91cd\u8981\u6027<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u81ea\u5728\u306b\u5236\u5fa1\u3059\u308b\u9580\u756a\u306e\u5f79\u5272<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u652f\u3048\u308b\u91cd\u8981\u6a5f\u80fd<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Laravel Middleware\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f5c\u6210\u3068\u767b\u9332\u624b\u9806<\/a>      <\/li>      <li>        <a href=\"#i-5\">\u30b0\u30ed\u30fc\u30d0\u30eb\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u30eb\u30fc\u30c8\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f7f\u3044\u5206\u3051<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30b0\u30eb\u30fc\u30d7\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">\u5b9f\u8df5\u3067\u4f7f\u3048\u308b\uff01Laravel Middleware\u5b9f\u88c5\u4f8b15\u9078<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306b\u95a2\u3059\u308b\u5b9f\u88c5\u4f8b5\u9078<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316\u306e\u305f\u3081\u306e\u5b9f\u88c5\u4f8b5\u9078<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u5b9f\u88c5\u4f8b5\u9078<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">Laravel Middleware\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u5b9f\u884c\u9806\u5e8f\u3092\u6700\u9069\u5316\u3059\u308b\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-13\">\u30c6\u30b9\u30c8\u53ef\u80fd\u306a\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u66f8\u304d\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u3092\u9ad8\u3081\u308b\u30b3\u30fc\u30c9\u8a2d\u8a08\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">Laravel Middleware\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u51fa\u529b\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-18\">Laravel Middleware\u306e\u6d3b\u7528\u306b\u3088\u308b\u958b\u767a\u52b9\u7387\u5316<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-19\">\u5171\u901a\u51e6\u7406\u306e\u96c6\u7d04\u3067\u30b3\u30fc\u30c9\u306e\u91cd\u8907\u3092\u524a\u6e1b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-20\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u8a2d\u8a08\u306e\u30dd\u30a4\u30f3\u30c8<\/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 Middleware\u3068\u306f\uff1f\u57fa\u790e\u304b\u3089\u7406\u89e3\u3059\u308b\u91cd\u8981\u6027<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u81ea\u5728\u306b\u5236\u5fa1\u3059\u308b\u9580\u756a\u306e\u5f79\u5272<\/h3>\n\n\n\n<p>Laravel Middleware\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u5230\u9054\u3059\u308bHTTP\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u691c\u67fb\u30fb\u52a0\u5de5\u3059\u308b\u305f\u3081\u306e\u5f37\u529b\u306a\u4ed5\u7d44\u307f\u3067\u3059\u3002\u300c\u9580\u756a\u300d\u3068\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u91cd\u8981\u306a\u5f79\u5272\u3092\u62c5\u3063\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u691c\u8a3c\u3068\u52a0\u5de5<\/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=\"\">   namespace App\\Http\\Middleware;\n\n   use Closure;\n   use Illuminate\\Http\\Request;\n\n   class RequestValidator\n   {\n       public function handle(Request $request, Closure $next)\n       {\n           \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u306e\u691c\u8a3c\n           if (!$this-&gt;validateRequest($request)) {\n               return response()-&gt;json(['error' =&gt; '\u4e0d\u6b63\u306a\u30ea\u30af\u30a8\u30b9\u30c8'], 400);\n           }\n\n           \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u306e\u52a0\u5de5\n           $request-&gt;merge(['processed_at' =&gt; now()]);\n\n           return $next($request);\n       }\n\n       private function validateRequest(Request $request)\n       {\n           \/\/ \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30ed\u30b8\u30c3\u30af\n           return true;\n       }\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u5236\u5fa1<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u524d\u51e6\u7406\uff1a\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306b\u5230\u9054\u3059\u308b\u524d\u306e\u51e6\u7406<\/li>\n\n\n\n<li>\u5f8c\u51e6\u7406\uff1a\u30ec\u30b9\u30dd\u30f3\u30b9\u9001\u4fe1\u524d\u306e\u52a0\u5de5<\/li>\n\n\n\n<li>\u51e6\u7406\u306e\u4e2d\u65ad\uff1a\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u505c\u6b62<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u67d4\u8edf\u306a\u9069\u7528\u7bc4\u56f2<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5168\u4f53\u9069\u7528\uff1a\u3059\u3079\u3066\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5bfe\u3057\u3066\u5b9f\u884c<\/li>\n\n\n\n<li>\u9078\u629e\u7684\u9069\u7528\uff1a\u7279\u5b9a\u306e\u30eb\u30fc\u30c8\u3084\u30b0\u30eb\u30fc\u30d7\u306b\u306e\u307f\u9069\u7528<\/li>\n\n\n\n<li>\u6761\u4ef6\u4ed8\u304d\u5b9f\u884c\uff1a\u72b6\u6cc1\u306b\u5fdc\u3058\u305f\u52d5\u7684\u306a\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u652f\u3048\u308b\u91cd\u8981\u6a5f\u80fd<\/h3>\n\n\n\n<p>Middleware\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5c64\u3068\u3057\u3066\u4e0d\u53ef\u6b20\u306a\u5b58\u5728\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u91cd\u8981\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5236\u5fa1<\/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=\"\">   namespace App\\Http\\Middleware;\n\n   use Closure;\n   use Illuminate\\Http\\Request;\n\n   class SecurityMiddleware\n   {\n       public function handle(Request $request, Closure $next)\n       {\n           \/\/ \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a\n           $response = $next($request);\n\n           $response-&gt;headers-&gt;set('X-Frame-Options', 'SAMEORIGIN');\n           $response-&gt;headers-&gt;set('X-XSS-Protection', '1; mode=block');\n           $response-&gt;headers-&gt;set('X-Content-Type-Options', 'nosniff');\n\n           return $response;\n       }\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u91cd\u8981\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6a5f\u80fd<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSRF\u30c8\u30fc\u30af\u30f3\u691c\u8a3c<\/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>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u9632\u6b62<\/li>\n\n\n\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>\u30ec\u30fc\u30c8\u30ea\u30df\u30c3\u30c8\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u4fdd\u8b77\u306e\u5b9f\u73fe<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u6b63\u30a2\u30af\u30bb\u30b9\u306e\u9632\u6b62<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u4fdd\u8b77<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u76e3\u8996\u3068\u30ed\u30b0\u8a18\u9332<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u306b\u3088\u308a\u3001Middleware\u306f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u300c\u5165\u53e3\u300d\u3068\u300c\u51fa\u53e3\u300d\u3092\u9069\u5207\u306b\u5236\u5fa1\u3057\u3001\u30bb\u30ad\u30e5\u30a2\u306a\u5b9f\u884c\u74b0\u5883\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u5b9f\u88c5\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-3\">Laravel Middleware\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f5c\u6210\u3068\u767b\u9332\u624b\u9806<\/h3>\n\n\n\n<p>Laravel\u3067\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u5b9f\u88c5\u3059\u308b\u969b\u306e\u57fa\u672c\u7684\u306a\u624b\u9806\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f5c\u6210<\/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=\"\">   # Artisan\u30b3\u30de\u30f3\u30c9\u3067\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u751f\u6210\n   php artisan make:middleware CheckUserSubscription<\/pre>\n\n\n\n<p>\u751f\u6210\u3055\u308c\u305f\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u57fa\u672c\u69cb\u9020\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=\"\">   namespace App\\Http\\Middleware;\n\n   use Closure;\n   use Illuminate\\Http\\Request;\n\n   class CheckUserSubscription\n   {\n       public function handle(Request $request, Closure $next)\n       {\n           if (!$request-&gt;user() || !$request-&gt;user()-&gt;hasActiveSubscription()) {\n               return redirect()-&gt;route('subscription.required');\n           }\n\n           return $next($request);\n       }\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Kernel\u3078\u306e\u767b\u9332<\/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\n\n   protected $routeMiddleware = [\n       'auth' =&gt; \\App\\Http\\Middleware\\Authenticate::class,\n       'subscription' =&gt; \\App\\Http\\Middleware\\CheckUserSubscription::class,\n       'cache.headers' =&gt; \\Illuminate\\Http\\Middleware\\SetCacheHeaders::class,\n   ];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30b0\u30ed\u30fc\u30d0\u30eb\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u30eb\u30fc\u30c8\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u4f7f\u3044\u5206\u3051<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u30df\u30c9\u30eb\u30a6\u30a7\u30a2<\/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\n\n   protected $middleware = [\n       \/\/ \u5168\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u9069\u7528\u3055\u308c\u308b\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\n       \\App\\Http\\Middleware\\TrustProxies::class,\n       \\App\\Http\\Middleware\\PreventRequestsDuringMaintenance::class,\n       \\App\\Http\\Middleware\\ValidatePostSize::class,\n   ];<\/pre>\n\n\n\n<p>\u4f7f\u7528\u4f8b\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=\"\">   namespace App\\Http\\Middleware;\n\n   use Closure;\n   use Illuminate\\Http\\Request;\n\n   class LogAllRequests\n   {\n       public function handle(Request $request, Closure $next)\n       {\n           \/\/ \u3059\u3079\u3066\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u30ed\u30b0\u306b\u8a18\u9332\n           \\Log::info('Request:', [\n               'path' =&gt; $request-&gt;path(),\n               'method' =&gt; $request-&gt;method(),\n               'ip' =&gt; $request-&gt;ip()\n           ]);\n\n           return $next($request);\n       }\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30eb\u30fc\u30c8\u30df\u30c9\u30eb\u30a6\u30a7\u30a2<\/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\/web.php\n\n   Route::get('\/premium', function () {\n       return view('premium.dashboard');\n   })-&gt;middleware('subscription');\n\n   \/\/ \u8907\u6570\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u9069\u7528\n   Route::get('\/admin\/reports', function () {\n       return view('admin.reports');\n   })-&gt;middleware(['auth', 'admin', 'log']);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30b0\u30eb\u30fc\u30d7\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b0\u30eb\u30fc\u30d7\u306e\u5b9a\u7fa9<\/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\n\n   protected $middlewareGroups = [\n       'web' =&gt; [\n           \\App\\Http\\Middleware\\EncryptCookies::class,\n           \\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class,\n           \\Illuminate\\Session\\Middleware\\StartSession::class,\n           \\Illuminate\\View\\Middleware\\ShareErrorsFromSession::class,\n           \\App\\Http\\Middleware\\VerifyCsrfToken::class,\n       ],\n       'api' =&gt; [\n           'throttle:api',\n           \\Illuminate\\Routing\\Middleware\\SubstituteBindings::class,\n       ],\n       'admin' =&gt; [\n           'auth',\n           'admin.access',\n           'log.actions',\n       ],\n   ];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30b0\u30eb\u30fc\u30d7\u306e\u6d3b\u7528\u4f8b<\/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\/web.php\n\n   \/\/ \u7ba1\u7406\u8005\u6a5f\u80fd\u306e\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\n   Route::middleware('admin')-&gt;group(function () {\n       Route::get('\/admin\/users', 'AdminController@users');\n       Route::get('\/admin\/settings', 'AdminController@settings');\n       Route::post('\/admin\/update', 'AdminController@update');\n   });\n\n   \/\/ API\u30eb\u30fc\u30c8\u30b0\u30eb\u30fc\u30d7\n   Route::middleware('api')-&gt;prefix('api\/v1')-&gt;group(function () {\n       Route::get('\/users', 'Api\\UserController@index');\n       Route::post('\/users', 'Api\\UserController@store');\n   });<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30d1\u30e9\u30e1\u30fc\u30bf\u4ed8\u304d\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30b0\u30eb\u30fc\u30d7<\/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\/RoleMiddleware.php\n\n   public function handle($request, Closure $next, $role)\n   {\n       if (!$request-&gt;user() || !$request-&gt;user()-&gt;hasRole($role)) {\n           return response()-&gt;json(['error' =&gt; '\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093'], 403);\n       }\n       return $next($request);\n   }\n\n   \/\/ routes\/web.php \u3067\u306e\u4f7f\u7528\u4f8b\n   Route::middleware('role:admin')-&gt;group(function () {\n       Route::get('\/admin\/dashboard', 'AdminController@dashboard');\n       Route::get('\/admin\/users', 'AdminController@users');\n   });<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Laravel\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f\u67d4\u8edf\u306a\u8a2d\u5b9a\u3068\u7ba1\u7406\u304c\u53ef\u80fd\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u309215\u500b\u7d39\u4ecb\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u8df5\u3067\u4f7f\u3048\u308b\uff01Laravel Middleware\u5b9f\u88c5\u4f8b15\u9078<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306b\u95a2\u3059\u308b\u5b9f\u88c5\u4f8b5\u9078<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u591a\u8981\u7d20\u8a8d\u8a3c\u30c1\u30a7\u30c3\u30af<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CheckTwoFactorAuth\n{\n    public function handle(Request $request, Closure $next)\n    {\n        $user = $request-&gt;user();\n\n        if ($user &amp;&amp; $user-&gt;hasTwoFactorEnabled() &amp;&amp; !session('2fa_verified')) {\n            return redirect()-&gt;route('2fa.verify');\n        }\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f2\u8981\u7d20\u8a8d\u8a3c\u304c\u6709\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u306b\u5bfe\u3057\u3066\u3001\u8a8d\u8a3c\u72b6\u614b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u672a\u8a8d\u8a3c\u306e\u5834\u5408\u306f\u691c\u8a3c\u30da\u30fc\u30b8\u3078\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ed\u30fc\u30eb\u30d9\u30fc\u30b9\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CheckUserRole\n{\n    public function handle(Request $request, Closure $next, ...$roles)\n    {\n        if (!$request-&gt;user() || !$request-&gt;user()-&gt;hasAnyRole($roles)) {\n            return response()-&gt;json([\n                'error' =&gt; '\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093',\n                'required_roles' =&gt; $roles\n            ], 403);\n        }\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<p>\u8907\u6570\u306e\u30ed\u30fc\u30eb\u3092\u6307\u5b9a\u53ef\u80fd\u306aRBAC\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3067\u3059\u3002\u30eb\u30fc\u30c8\u3067\u6b21\u306e\u3088\u3046\u306b\u4f7f\u7528\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=\"\">Route::get('\/admin\/users', 'AdminController@index')\n    -&gt;middleware('role:admin,manager');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>API\u30c8\u30fc\u30af\u30f3\u8a8d\u8a3c<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass ValidateApiToken\n{\n    public function handle(Request $request, Closure $next)\n    {\n        $token = $request-&gt;header('X-API-Token');\n\n        if (!$token || !$this-&gt;isValidToken($token)) {\n            return response()-&gt;json([\n                'error' =&gt; '\u7121\u52b9\u306aAPI\u30c8\u30fc\u30af\u30f3\u3067\u3059'\n            ], 401);\n        }\n\n        $this-&gt;logTokenUsage($token);\n        return $next($request);\n    }\n\n    private function isValidToken($token)\n    {\n        return \\App\\Models\\ApiToken::where('token', $token)\n            -&gt;where('expires_at', '&gt;', now())\n            -&gt;exists();\n    }\n\n    private function logTokenUsage($token)\n    {\n        \\App\\Models\\ApiTokenLog::create([\n            'token' =&gt; $token,\n            'accessed_at' =&gt; now()\n        ]);\n    }\n}<\/pre>\n\n\n\n<p>API\u30c8\u30fc\u30af\u30f3\u306e\u691c\u8a3c\u3068\u4f7f\u7528\u30ed\u30b0\u306e\u8a18\u9332\u3092\u884c\u3046\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3067\u3059\u3002\u30c8\u30fc\u30af\u30f3\u306e\u6709\u52b9\u671f\u9650\u3082\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u6709\u52b9\u671f\u9650\u7ba1\u7406<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass SessionTimeout\n{\n    protected $timeout = 30; \/\/ 30\u5206\n\n    public function handle(Request $request, Closure $next)\n    {\n        $lastActivity = session('last_activity');\n\n        if ($lastActivity &amp;&amp; now()-&gt;diffInMinutes($lastActivity) &gt; $this-&gt;timeout) {\n            auth()-&gt;logout();\n            session()-&gt;flush();\n            return redirect()-&gt;route('login')\n                -&gt;with('message', '\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f');\n        }\n\n        session(['last_activity' =&gt; now()]);\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<p>\u4e00\u5b9a\u6642\u9593\u64cd\u4f5c\u304c\u306a\u3044\u5834\u5408\u306b\u81ea\u52d5\u7684\u306b\u30ed\u30b0\u30a2\u30a6\u30c8\u3059\u308b\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3067\u3059\u3002<\/p>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>IP\u5236\u9650\u30a2\u30af\u30bb\u30b9<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass RestrictIpAccess\n{\n    protected $allowedIps = [\n        '192.168.1.*',\n        '10.0.0.*'\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        $clientIp = $request-&gt;ip();\n\n        if (!$this-&gt;isAllowedIp($clientIp)) {\n            \\Log::warning('Unauthorized IP access attempt', [\n                'ip' =&gt; $clientIp,\n                'path' =&gt; $request-&gt;path()\n            ]);\n\n            return response()-&gt;json([\n                'error' =&gt; '\u30a2\u30af\u30bb\u30b9\u304c\u5236\u9650\u3055\u308c\u3066\u3044\u307e\u3059'\n            ], 403);\n        }\n\n        return $next($request);\n    }\n\n    private function isAllowedIp($ip)\n    {\n        return collect($this-&gt;allowedIps)-&gt;contains(function ($allowedIp) use ($ip) {\n            return fnmatch($allowedIp, $ip);\n        });\n    }\n}<\/pre>\n\n\n\n<p>IP\u30a2\u30c9\u30ec\u30b9\u306b\u3088\u308b\u30a2\u30af\u30bb\u30b9\u5236\u9650\u3092\u5b9f\u88c5\u3059\u308b\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3067\u3059\u3002\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u3092\u4f7f\u7528\u3057\u305f\u67d4\u8edf\u306aIP\u5236\u5fa1\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316\u306e\u305f\u3081\u306e\u5b9f\u88c5\u4f8b5\u9078<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>XSS\u30d7\u30ed\u30c6\u30af\u30b7\u30e7\u30f3<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass XssProtection\n{\n    public function handle(Request $request, Closure $next)\n    {\n        $response = $next($request);\n\n        \/\/ \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a\n        $headers = [\n            'X-XSS-Protection' =&gt; '1; mode=block',\n            'X-Content-Type-Options' =&gt; 'nosniff',\n            'X-Frame-Options' =&gt; 'SAMEORIGIN',\n            'Referrer-Policy' =&gt; 'strict-origin-when-cross-origin'\n        ];\n\n        foreach ($headers as $key =&gt; $value) {\n            $response-&gt;headers-&gt;set($key, $value);\n        }\n\n        \/\/ Content Security Policy\u306e\u8a2d\u5b9a\n        $csp = \"default-src 'self'; \" .\n               \"script-src 'self' 'unsafe-inline' 'unsafe-eval'; \" .\n               \"style-src 'self' 'unsafe-inline';\";\n\n        $response-&gt;headers-&gt;set('Content-Security-Policy', $csp);\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<p>\u91cd\u8981\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\u3092\u8a2d\u5b9a\u3057\u3001XSS\u653b\u6483\u304b\u3089\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4fdd\u8b77\u3057\u307e\u3059\u3002CSP\u306e\u8a2d\u5b9a\u306b\u3088\u308a\u3001\u8a31\u53ef\u3055\u308c\u3066\u3044\u306a\u3044\u30bd\u30fc\u30b9\u304b\u3089\u306e\u30ea\u30bd\u30fc\u30b9\u8aad\u307f\u8fbc\u307f\u3092\u5236\u9650\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u983b\u5ea6\u5236\u9650<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Cache\\RateLimiter;\n\nclass CustomRateLimiter\n{\n    protected $limiter;\n\n    public function __construct(RateLimiter $limiter)\n    {\n        $this-&gt;limiter = $limiter;\n    }\n\n    public function handle(Request $request, Closure $next, $maxAttempts = 60, $decayMinutes = 1)\n    {\n        $key = $this-&gt;resolveRequestSignature($request);\n\n        if ($this-&gt;limiter-&gt;tooManyAttempts($key, $maxAttempts)) {\n            $retryAfter = $this-&gt;limiter-&gt;availableIn($key);\n\n            return response()-&gt;json([\n                'error' =&gt; '\u30ea\u30af\u30a8\u30b9\u30c8\u56de\u6570\u304c\u5236\u9650\u3092\u8d85\u3048\u307e\u3057\u305f',\n                'retry_after_seconds' =&gt; $retryAfter\n            ], 429)-&gt;header('Retry-After', $retryAfter);\n        }\n\n        $this-&gt;limiter-&gt;hit($key, $decayMinutes * 60);\n\n        $response = $next($request);\n\n        return $response-&gt;header(\n            'X-RateLimit-Remaining',\n            $maxAttempts - $this-&gt;limiter-&gt;attempts($key)\n        );\n    }\n\n    protected function resolveRequestSignature($request)\n    {\n        return sha1(\n            $request-&gt;ip() . \n            $request-&gt;path() . \n            $request-&gt;header('User-Agent')\n        );\n    }\n}<\/pre>\n\n\n\n<p>DoS\u653b\u6483\u3084\u4e71\u7528\u3092\u9632\u3050\u305f\u3081\u3001IP\u30a2\u30c9\u30ec\u30b9\u3084\u30d1\u30b9\u3054\u3068\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u56de\u6570\u3092\u5236\u9650\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u5165\u529b\u30c7\u30fc\u30bf\u30b5\u30cb\u30bf\u30a4\u30ba<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass SanitizeInput\n{\n    protected $except = [\n        'password',\n        'password_confirmation'\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        $input = $request-&gt;all();\n\n        array_walk_recursive($input, function (&amp;$value, $key) {\n            if (!in_array($key, $this-&gt;except) &amp;&amp; is_string($value)) {\n                \/\/ HTML\u30bf\u30b0\u306e\u9664\u53bb\n                $value = strip_tags($value);\n                \/\/ \u7279\u6b8a\u6587\u5b57\u306e\u30a8\u30b9\u30b1\u30fc\u30d7\n                $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');\n                \/\/ \u4e0d\u8981\u306a\u7a7a\u767d\u306e\u9664\u53bb\n                $value = trim($value);\n            }\n        });\n\n        $request-&gt;merge($input);\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u30c7\u30fc\u30bf\u3092\u81ea\u52d5\u7684\u306b\u30b5\u30cb\u30bf\u30a4\u30ba\u3057\u3001\u60aa\u610f\u306e\u3042\u308b\u30b3\u30fc\u30c9\u306e\u5b9f\u884c\u3092\u9632\u304e\u307e\u3059\u3002\u30d1\u30b9\u30ef\u30fc\u30c9\u306a\u3069\u306e\u7279\u5b9a\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u306f\u9664\u5916\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass SqlInjectionPrevention\n{\n    protected $patterns = [\n        '\/UNION[[:space:]]+SELECT\/i',\n        '\/SELECT.*INTO[[:space:]]+OUTFILE\/i',\n        '\/UPDATE.+SET.+WHERE\/i',\n        '\/INSERT[[:space:]]+INTO\/i',\n        '\/DELETE[[:space:]]+FROM\/i',\n        '\/DROP[[:space:]]+TABLE\/i',\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        $input = $request-&gt;all();\n\n        if ($this-&gt;containsSuspiciousPatterns($input)) {\n            \\Log::warning('Potential SQL injection attempt', [\n                'ip' =&gt; $request-&gt;ip(),\n                'input' =&gt; $input,\n                'user_agent' =&gt; $request-&gt;header('User-Agent')\n            ]);\n\n            return response()-&gt;json([\n                'error' =&gt; '\u4e0d\u6b63\u306a\u5165\u529b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f'\n            ], 400);\n        }\n\n        return $next($request);\n    }\n\n    private function containsSuspiciousPatterns($input)\n    {\n        $serialized = serialize($input);\n\n        foreach ($this-&gt;patterns as $pattern) {\n            if (preg_match($pattern, $serialized)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}<\/pre>\n\n\n\n<p>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u306e\u8a66\u307f\u3092\u691c\u51fa\u3057\u3001\u4e0d\u6b63\u306a\u30af\u30a8\u30ea\u306e\u5b9f\u884c\u3092\u9632\u6b62\u3057\u307e\u3059\u3002\u7591\u308f\u3057\u3044\u30d1\u30bf\u30fc\u30f3\u3092\u691c\u51fa\u3057\u305f\u5834\u5408\u306f\u30ed\u30b0\u306b\u8a18\u9332\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>\u6a5f\u5bc6\u30c7\u30fc\u30bf\u4fdd\u8b77<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass ProtectSensitiveData\n{\n    protected $sensitiveFields = [\n        'credit_card',\n        'social_security',\n        'password',\n        'api_key'\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        $response = $next($request);\n\n        if (method_exists($response, 'getData')) {\n            $data = $response-&gt;getData(true);\n            $data = $this-&gt;maskSensitiveData($data);\n            $response-&gt;setData($data);\n        }\n\n        return $response;\n    }\n\n    private function maskSensitiveData($data)\n    {\n        if (is_array($data)) {\n            foreach ($data as $key =&gt; &amp;$value) {\n                if (in_array($key, $this-&gt;sensitiveFields)) {\n                    $value = $this-&gt;mask($value);\n                } elseif (is_array($value)) {\n                    $value = $this-&gt;maskSensitiveData($value);\n                }\n            }\n        }\n\n        return $data;\n    }\n\n    private function mask($value)\n    {\n        if (!is_string($value) || strlen($value) &lt;= 4) {\n            return '****';\n        }\n\n        return str_repeat('*', strlen($value) - 4) . substr($value, -4);\n    }\n}<\/pre>\n\n\n\n<p>\u30ec\u30b9\u30dd\u30f3\u30b9\u5185\u306e\u6a5f\u5bc6\u30c7\u30fc\u30bf\u3092\u81ea\u52d5\u7684\u306b\u30de\u30b9\u30af\u3057\u3001\u610f\u56f3\u3057\u306a\u3044\u30c7\u30fc\u30bf\u6f0f\u6d29\u3092\u9632\u6b62\u3057\u307e\u3059\u3002\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u756a\u53f7\u3084\u500b\u4eba\u60c5\u5831\u306a\u3069\u3092\u4fdd\u8b77\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u5b9f\u88c5\u4f8b5\u9078<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u30ad\u30e3\u30c3\u30b7\u30e5<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Cache;\n\nclass CacheResponse\n{\n    protected $ttl = 3600; \/\/ 1\u6642\u9593\n\n    public function handle(Request $request, Closure $next)\n    {\n        \/\/ GET\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u307f\u30ad\u30e3\u30c3\u30b7\u30e5\u5bfe\u8c61\n        if (!$request-&gt;isMethod('GET')) {\n            return $next($request);\n        }\n\n        $cacheKey = 'response_' . sha1($request-&gt;fullUrl());\n\n        if (Cache::has($cacheKey)) {\n            return response()-&gt;json(\n                Cache::get($cacheKey),\n                200,\n                ['X-Cache' =&gt; 'HIT']\n            );\n        }\n\n        $response = $next($request);\n\n        if ($response-&gt;status() === 200) {\n            Cache::put($cacheKey, $response-&gt;getData(true), $this-&gt;ttl);\n            $response-&gt;headers-&gt;set('X-Cache', 'MISS');\n        }\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<p>\u983b\u7e41\u306b\u30a2\u30af\u30bb\u30b9\u3055\u308c\u308b\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a2\u30af\u30bb\u30b9\u3084\u30ea\u30bd\u30fc\u30b9\u6d88\u8cbb\u3092\u524a\u6e1b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u306e\u76e3\u8996\u3068\u6700\u9069\u5316<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass ResourceMonitor\n{\n    protected $memoryLimit = 128 * 1024 * 1024; \/\/ 128MB\n    protected $timeLimit = 5.0; \/\/ 5\u79d2\n\n    public function handle(Request $request, Closure $next)\n    {\n        $startTime = microtime(true);\n        $startMemory = memory_get_usage();\n\n        $response = $next($request);\n\n        $endMemory = memory_get_usage();\n        $endTime = microtime(true);\n\n        $memoryUsed = $endMemory - $startMemory;\n        $timeUsed = $endTime - $startTime;\n\n        if ($memoryUsed &gt; $this-&gt;memoryLimit || $timeUsed &gt; $this-&gt;timeLimit) {\n            \\Log::warning('Resource usage threshold exceeded', [\n                'path' =&gt; $request-&gt;path(),\n                'memory_used' =&gt; $this-&gt;formatBytes($memoryUsed),\n                'time_used' =&gt; round($timeUsed, 3) . 's'\n            ]);\n        }\n\n        $response-&gt;headers-&gt;set('X-Memory-Usage', $this-&gt;formatBytes($memoryUsed));\n        $response-&gt;headers-&gt;set('X-Response-Time', round($timeUsed * 1000, 2) . 'ms');\n\n        return $response;\n    }\n\n    private function formatBytes($bytes)\n    {\n        $units = ['B', 'KB', 'MB', 'GB'];\n        $bytes = max($bytes, 0);\n        $pow = floor(($bytes ? log($bytes) : 0) \/ log(1024));\n        $pow = min($pow, count($units) - 1);\n\n        return round($bytes \/ pow(1024, $pow), 2) . $units[$pow];\n    }\n}<\/pre>\n\n\n\n<p>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u3092\u76e3\u8996\u3057\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u3092\u65e9\u671f\u306b\u691c\u51fa\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u5727\u7e2e\u51e6\u7406\u306e\u6700\u9069\u5316<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass OptimizeResponse\n{\n    protected $compressibleTypes = [\n        'text\/html',\n        'text\/plain',\n        'text\/css',\n        'text\/javascript',\n        'application\/javascript',\n        'application\/json',\n        'application\/xml'\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        $response = $next($request);\n\n        \/\/ Content-Type\u306e\u78ba\u8a8d\n        $contentType = $response-&gt;headers-&gt;get('Content-Type');\n        if (!$this-&gt;shouldCompress($contentType)) {\n            return $response;\n        }\n\n        \/\/ \u5727\u7e2e\u51e6\u7406\u306e\u5b9f\u884c\n        $content = $response-&gt;getContent();\n        if (strlen($content) &gt; 1024) { \/\/ 1KB\u4ee5\u4e0a\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u307f\u5727\u7e2e\n            $compressed = $this-&gt;compress($content);\n            if ($compressed !== false) {\n                $response-&gt;setContent($compressed);\n                $response-&gt;headers-&gt;set('Content-Encoding', 'gzip');\n                $response-&gt;headers-&gt;set('Vary', 'Accept-Encoding');\n            }\n        }\n\n        return $response;\n    }\n\n    private function shouldCompress($contentType)\n    {\n        foreach ($this-&gt;compressibleTypes as $type) {\n            if (strpos($contentType, $type) !== false) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private function compress($content)\n    {\n        return gzencode($content, 9);\n    }\n}<\/pre>\n\n\n\n<p>\u30ec\u30b9\u30dd\u30f3\u30b9\u30c7\u30fc\u30bf\u3092\u9069\u5207\u306b\u5727\u7e2e\u3057\u3001\u8ee2\u9001\u30c7\u30fc\u30bf\u91cf\u3092\u524a\u6e1b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass QueryOptimizer\n{\n    protected $slowQueryThreshold = 100; \/\/ \u30df\u30ea\u79d2\n\n    public function handle(Request $request, Closure $next)\n    {\n        \/\/ \u30af\u30a8\u30ea\u30ed\u30b0\u306e\u958b\u59cb\n        DB::enableQueryLog();\n\n        $response = $next($request);\n\n        \/\/ \u30af\u30a8\u30ea\u306e\u5206\u6790\n        $queries = DB::getQueryLog();\n        $slowQueries = collect($queries)-&gt;filter(function ($query) {\n            return $query['time'] &gt; $this-&gt;slowQueryThreshold;\n        });\n\n        if ($slowQueries-&gt;isNotEmpty()) {\n            \\Log::warning('Slow queries detected', [\n                'path' =&gt; $request-&gt;path(),\n                'queries' =&gt; $slowQueries-&gt;map(function ($query) {\n                    return [\n                        'sql' =&gt; $query['query'],\n                        'bindings' =&gt; $query['bindings'],\n                        'time' =&gt; $query['time'] . 'ms'\n                    ];\n                })-&gt;toArray()\n            ]);\n\n            \/\/ \u958b\u767a\u74b0\u5883\u306e\u5834\u5408\u306f\u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc\u306b\u60c5\u5831\u3092\u8ffd\u52a0\n            if (app()-&gt;environment('local')) {\n                $response-&gt;headers-&gt;set(\n                    'X-Slow-Queries',\n                    $slowQueries-&gt;count() . ' queries exceeded ' . \n                    $this-&gt;slowQueryThreshold . 'ms'\n                );\n            }\n        }\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<p>\u9045\u3044\u30af\u30a8\u30ea\u3092\u691c\u51fa\u3057\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6539\u5584\u306e\u305f\u3081\u306e\u60c5\u5831\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>\u975e\u540c\u671f\u51e6\u7406\u306e\u6700\u9069\u5316<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Str;\n\nclass AsyncOperationOptimizer\n{\n    protected $asyncOperations = [\n        'reports\/generate',\n        'exports\/create',\n        'imports\/process'\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        if ($this-&gt;shouldProcessAsync($request)) {\n            $jobId = (string) Str::uuid();\n\n            \/\/ \u30b8\u30e7\u30d6\u306e\u30ad\u30e5\u30fc\u6295\u5165\n            $job = new \\App\\Jobs\\ProcessAsyncRequest([\n                'request_data' =&gt; $request-&gt;all(),\n                'user_id' =&gt; auth()-&gt;id(),\n                'path' =&gt; $request-&gt;path()\n            ]);\n\n            dispatch($job)-&gt;onQueue('async-operations');\n\n            return response()-&gt;json([\n                'message' =&gt; '\u51e6\u7406\u3092\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u958b\u59cb\u3057\u307e\u3057\u305f',\n                'job_id' =&gt; $jobId,\n                'status_url' =&gt; route('job.status', ['id' =&gt; $jobId])\n            ], 202);\n        }\n\n        return $next($request);\n    }\n\n    private function shouldProcessAsync(Request $request)\n    {\n        return collect($this-&gt;asyncOperations)-&gt;contains(function ($path) use ($request) {\n            return Str::is($path, $request-&gt;path());\n        }) &amp;&amp; $request-&gt;header('X-Process-Async') === 'true';\n    }\n}<\/pre>\n\n\n\n<p>\u91cd\u3044\u51e6\u7406\u3092\u975e\u540c\u671f\u5316\u3057\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u6642\u9593\u3092\u6539\u5584\u3057\u307e\u3059\u3002\u51e6\u7406\u72b6\u6cc1\u306e\u78ba\u8a8d\u7528\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3082\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-11\">Laravel Middleware\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u5b9f\u884c\u9806\u5e8f\u3092\u6700\u9069\u5316\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u5b9f\u884c\u9806\u5e8f\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u5927\u304d\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8\u3092\u8aac\u660e\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u512a\u5148\u9806\u4f4d\u306e\u8a2d\u5b9a<\/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 $middlewarePriority = [\n    \/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u3092\u6700\u521d\u306b\n    \\Illuminate\\Session\\Middleware\\StartSession::class,\n\n    \/\/ \u8a8d\u8a3c\u30c1\u30a7\u30c3\u30af\u3092\u65e9\u3081\u306b\n    \\Illuminate\\Auth\\Middleware\\Authenticate::class,\n\n    \/\/ \u6a29\u9650\u30c1\u30a7\u30c3\u30af\n    \\App\\Http\\Middleware\\CheckPermission::class,\n\n    \/\/ \u305d\u306e\u4ed6\u306e\u51e6\u7406\n    \\App\\Http\\Middleware\\TransformInput::class,\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u5b9f\u884c\u9806\u5e8f\u306e\u6700\u9069\u5316\u4f8b<\/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\/web.php\nRoute::middleware([\n    'auth',              \/\/ 1. \u8a8d\u8a3c\u30c1\u30a7\u30c3\u30af\n    'permission:admin',  \/\/ 2. \u6a29\u9650\u30c1\u30a7\u30c3\u30af\n    'log.access',       \/\/ 3. \u30a2\u30af\u30bb\u30b9\u30ed\u30b0\n    'cache.response'    \/\/ 4. \u30ec\u30b9\u30dd\u30f3\u30b9\u30ad\u30e3\u30c3\u30b7\u30e5\n])-&gt;group(function () {\n    \/\/ \u30eb\u30fc\u30c8\u5b9a\u7fa9\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30c6\u30b9\u30c8\u53ef\u80fd\u306a\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u66f8\u304d\u65b9<\/h3>\n\n\n\n<p>\u30c6\u30b9\u30bf\u30d6\u30eb\u306a\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f9d\u5b58\u6027\u306e\u6ce8\u5165<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse App\\Services\\AuthorizationService;\nuse App\\Services\\LogService;\n\nclass TestableMiddleware\n{\n    private $authService;\n    private $logService;\n\n    public function __construct(\n        AuthorizationService $authService,\n        LogService $logService\n    ) {\n        $this-&gt;authService = $authService;\n        $this-&gt;logService = $logService;\n    }\n\n    public function handle(Request $request, Closure $next)\n    {\n        if (!$this-&gt;authService-&gt;checkPermission($request)) {\n            $this-&gt;logService-&gt;logUnauthorizedAccess($request);\n            return response()-&gt;json(['error' =&gt; '\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093'], 403);\n        }\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u4f8b<\/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=\"\">namespace Tests\\Unit\\Middleware;\n\nuse Tests\\TestCase;\nuse App\\Http\\Middleware\\TestableMiddleware;\nuse Illuminate\\Http\\Request;\nuse App\\Services\\AuthorizationService;\nuse App\\Services\\LogService;\nuse Mockery;\n\nclass TestableMiddlewareTest extends TestCase\n{\n    public function testUnauthorizedAccessIsLogged()\n    {\n        \/\/ \u30e2\u30c3\u30af\u306e\u6e96\u5099\n        $authService = Mockery::mock(AuthorizationService::class);\n        $authService-&gt;shouldReceive('checkPermission')\n            -&gt;once()\n            -&gt;andReturn(false);\n\n        $logService = Mockery::mock(LogService::class);\n        $logService-&gt;shouldReceive('logUnauthorizedAccess')\n            -&gt;once();\n\n        \/\/ \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5316\n        $middleware = new TestableMiddleware($authService, $logService);\n\n        \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u306e\u4f5c\u6210\n        $request = Request::create('\/test', 'GET');\n\n        \/\/ \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u5b9f\u884c\n        $response = $middleware-&gt;handle($request, function () {});\n\n        \/\/ \u30a2\u30b5\u30fc\u30b7\u30e7\u30f3\n        $this-&gt;assertEquals(403, $response-&gt;status());\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u3092\u9ad8\u3081\u308b\u30b3\u30fc\u30c9\u8a2d\u8a08\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u306e\u9ad8\u3044\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e\u30dd\u30a4\u30f3\u30c8\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5358\u4e00\u8cac\u4efb\u306e\u539f\u5247\u306b\u5f93\u3046<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass RequestValidator\n{\n    protected $rules = [\n        'GET' =&gt; [\n            'search' =&gt; 'string|max:100',\n            'page' =&gt; 'integer|min:1'\n        ],\n        'POST' =&gt; [\n            'title' =&gt; 'required|string|max:200',\n            'content' =&gt; 'required|string'\n        ]\n    ];\n\n    public function handle(Request $request, Closure $next)\n    {\n        $method = $request-&gt;method();\n\n        if (isset($this-&gt;rules[$method])) {\n            $validator = validator($request-&gt;all(), $this-&gt;rules[$method]);\n\n            if ($validator-&gt;fails()) {\n                return response()-&gt;json([\n                    'error' =&gt; '\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc',\n                    'details' =&gt; $validator-&gt;errors()\n                ], 422);\n            }\n        }\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u8a2d\u5b9a\u306e\u5916\u90e8\u5316<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Config;\n\nclass ConfigurableMiddleware\n{\n    public function handle(Request $request, Closure $next)\n    {\n        $config = Config::get('middleware.configurable', []);\n\n        if (isset($config['enabled']) &amp;&amp; !$config['enabled']) {\n            return $next($request);\n        }\n\n        \/\/ \u8a2d\u5b9a\u306b\u57fa\u3065\u3044\u305f\u51e6\u7406\n        if (isset($config['rules'])) {\n            foreach ($config['rules'] as $rule) {\n                \/\/ \u30eb\u30fc\u30eb\u306e\u9069\u7528\n            }\n        }\n\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u6574\u7406<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse App\\Exceptions\\MiddlewareException;\nuse Illuminate\\Support\\Facades\\Log;\n\nclass ErrorHandlingMiddleware\n{\n    public function handle(Request $request, Closure $next)\n    {\n        try {\n            return $next($request);\n        } catch (MiddlewareException $e) {\n            Log::error('Middleware error', [\n                'message' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString()\n            ]);\n\n            return response()-&gt;json([\n                'error' =&gt; $e-&gt;getMessage(),\n                'code' =&gt; $e-&gt;getCode()\n            ], 500);\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u30c6\u30b9\u30c8\u3057\u3084\u3059\u3044\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u5c06\u6765\u306e\u6a5f\u80fd\u8ffd\u52a0\u3084\u5909\u66f4\u306b\u3082\u67d4\u8edf\u306b\u5bfe\u5fdc\u3067\u304d\u308b\u8a2d\u8a08\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">Laravel Middleware\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u7121\u9650\u30eb\u30fc\u30d7<\/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=\"\">\/\/ \u554f\u984c\u306e\u3042\u308b\u30b3\u30fc\u30c9\nnamespace App\\Http\\Middleware;\n\nclass RedirectMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        if (some_condition()) {\n            return redirect('\/another-route');  \/\/ \u4ed6\u306e\u30eb\u30fc\u30c8\u3078\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\n        }\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u7b56\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=\"\">namespace App\\Http\\Middleware;\n\nclass RedirectMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        \/\/ \u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u3092\u9632\u3050\u305f\u3081\u306e\u30d5\u30e9\u30b0\u3092\u30c1\u30a7\u30c3\u30af\n        if ($request-&gt;session()-&gt;has('redirect_count')) {\n            $count = $request-&gt;session()-&gt;get('redirect_count', 0);\n            if ($count &gt; 3) {\n                $request-&gt;session()-&gt;forget('redirect_count');\n                return response()-&gt;json(['error' =&gt; '\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u30eb\u30fc\u30d7\u3092\u691c\u51fa\u3057\u307e\u3057\u305f'], 500);\n            }\n            $request-&gt;session()-&gt;put('redirect_count', $count + 1);\n        } else {\n            $request-&gt;session()-&gt;put('redirect_count', 1);\n        }\n\n        if (some_condition()) {\n            return redirect('\/another-route');\n        }\n\n        $request-&gt;session()-&gt;forget('redirect_count');\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/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=\"\">\/\/ \u554f\u984c\u306e\u3042\u308b\u30b3\u30fc\u30c9\nclass SessionMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        $value = session('key');  \/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u958b\u59cb\u3055\u308c\u308b\u524d\u306b\u30a2\u30af\u30bb\u30b9\n        return $next($request);\n    }\n}<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u7b56\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=\"\">namespace App\\Http\\Middleware;\n\nuse Illuminate\\Session\\Middleware\\StartSession;\n\nclass SessionMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        \/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u958b\u59cb\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\n        if (!$request-&gt;hasSession()) {\n            app(StartSession::class)-&gt;handle($request, function ($request) {\n                return response()-&gt;json(['error' =&gt; '\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u5229\u7528\u3067\u304d\u307e\u305b\u3093'], 500);\n            });\n        }\n\n        try {\n            $value = session('key');\n            return $next($request);\n        } catch (\\Exception $e) {\n            \\Log::error('\u30bb\u30c3\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc: ' . $e-&gt;getMessage());\n            return response()-&gt;json(['error' =&gt; '\u30bb\u30c3\u30b7\u30e7\u30f3\u51e6\u7406\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f'], 500);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u51fa\u529b\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u7528\u30df\u30c9\u30eb\u30a6\u30a7\u30a2<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Illuminate\\Support\\Facades\\Log;\n\nclass DebugMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u60c5\u5831\u306e\u30ed\u30b0\u51fa\u529b\n        Log::debug('Request', [\n            'path' =&gt; $request-&gt;path(),\n            'method' =&gt; $request-&gt;method(),\n            'inputs' =&gt; $request-&gt;all(),\n            'headers' =&gt; $request-&gt;headers-&gt;all(),\n            'session' =&gt; $request-&gt;session()-&gt;all()\n        ]);\n\n        \/\/ \u51e6\u7406\u6642\u9593\u306e\u8a08\u6e2c\u958b\u59cb\n        $startTime = microtime(true);\n\n        \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u53d6\u5f97\n        $response = $next($request);\n\n        \/\/ \u51e6\u7406\u6642\u9593\u306e\u8a08\u6e2c\u7d42\u4e86\n        $endTime = microtime(true);\n        $executionTime = ($endTime - $startTime) * 1000; \/\/ \u30df\u30ea\u79d2\u306b\u5909\u63db\n\n        \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u60c5\u5831\u306e\u30ed\u30b0\u51fa\u529b\n        Log::debug('Response', [\n            'status' =&gt; $response-&gt;status(),\n            'execution_time' =&gt; $executionTime . 'ms',\n            'memory_usage' =&gt; $this-&gt;formatBytes(memory_get_usage(true))\n        ]);\n\n        \/\/ \u958b\u767a\u74b0\u5883\u306e\u5834\u5408\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc\u306b\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u3092\u8ffd\u52a0\n        if (app()-&gt;environment('local')) {\n            $response-&gt;headers-&gt;set('X-Debug-Time', round($executionTime, 2) . 'ms');\n            $response-&gt;headers-&gt;set('X-Debug-Memory', $this-&gt;formatBytes(memory_get_usage(true)));\n        }\n\n        return $response;\n    }\n\n    private function formatBytes($bytes)\n    {\n        $units = ['B', 'KB', 'MB', 'GB'];\n        $bytes = max($bytes, 0);\n        $pow = floor(($bytes ? log($bytes) : 0) \/ log(1024));\n        $pow = min($pow, count($units) - 1);\n\n        return round($bytes \/ pow(1024, $pow), 2) . $units[$pow];\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u6761\u4ef6\u4ed8\u304d\u30c7\u30d0\u30c3\u30b0\u51fa\u529b<\/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=\"\">namespace App\\Http\\Middleware;\n\nclass ConditionalDebugMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        \/\/ \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u78ba\u8a8d\n        $isDebug = $request-&gt;header('X-Debug') === 'true' || \n                   config('app.debug') === true;\n\n        if ($isDebug) {\n            \/\/ \u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306e\u53ce\u96c6\n            $debugInfo = [\n                'request' =&gt; [\n                    'url' =&gt; $request-&gt;fullUrl(),\n                    'method' =&gt; $request-&gt;method(),\n                    'inputs' =&gt; $request-&gt;all(),\n                    'headers' =&gt; $request-&gt;headers-&gt;all()\n                ]\n            ];\n\n            \/\/ SQL\u30af\u30a8\u30ea\u306e\u30ed\u30b0\u53d6\u5f97\n            \\DB::enableQueryLog();\n        }\n\n        $response = $next($request);\n\n        if ($isDebug) {\n            \/\/ SQL\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u8ffd\u52a0\n            $debugInfo['database'] = [\n                'queries' =&gt; \\DB::getQueryLog()\n            ];\n\n            \/\/ \u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u3092\u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u8ffd\u52a0\n            if ($response instanceof JsonResponse) {\n                $data = $response-&gt;getData(true);\n                $data['_debug'] = $debugInfo;\n                $response-&gt;setData($data);\n            }\n        }\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u52d5\u4f5c\u3092\u8a73\u7d30\u306b\u628a\u63e1\u3057\u3001\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u672c\u756a\u74b0\u5883\u3067\u306f\u5fc5\u8981\u6700\u5c0f\u9650\u306e\u30ed\u30b0\u51fa\u529b\u306b\u6291\u3048\u308b\u3053\u3068\u3067\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3078\u306e\u5f71\u97ff\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">Laravel Middleware\u306e\u6d3b\u7528\u306b\u3088\u308b\u958b\u767a\u52b9\u7387\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u5171\u901a\u51e6\u7406\u306e\u96c6\u7d04\u3067\u30b3\u30fc\u30c9\u306e\u91cd\u8907\u3092\u524a\u6e1b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5171\u901a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u96c6\u7d04<\/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=\"\">namespace App\\Http\\Middleware;\n\nuse Illuminate\\Support\\Facades\\Validator;\nuse Illuminate\\Http\\Request;\n\nclass ValidationPatterns\n{\n    protected $patterns = [\n        'user' =&gt; [\n            'name' =&gt; 'required|string|max:255',\n            'email' =&gt; 'required|email|unique:users',\n            'age' =&gt; 'integer|min:0|max:150'\n        ],\n        'post' =&gt; [\n            'title' =&gt; 'required|string|max:200',\n            'content' =&gt; 'required|string',\n            'category_id' =&gt; 'required|exists:categories,id'\n        ]\n    ];\n\n    public function handle(Request $request, Closure $next, $pattern)\n    {\n        if (isset($this-&gt;patterns[$pattern])) {\n            $validator = Validator::make(\n                $request-&gt;all(),\n                $this-&gt;patterns[$pattern]\n            );\n\n            if ($validator-&gt;fails()) {\n                return response()-&gt;json([\n                    'message' =&gt; '\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc',\n                    'errors' =&gt; $validator-&gt;errors()\n                ], 422);\n            }\n        }\n\n        return $next($request);\n    }\n}\n\n\/\/ routes\/web.php\u3067\u306e\u4f7f\u7528\u4f8b\nRoute::post('\/users', 'UserController@store')\n    -&gt;middleware('validate:user');\nRoute::post('\/posts', 'PostController@store')\n    -&gt;middleware('validate:post');<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>API\u30ec\u30b9\u30dd\u30f3\u30b9\u5f62\u5f0f\u306e\u6a19\u6e96\u5316<\/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=\"\">namespace App\\Http\\Middleware;\n\nclass StandardApiResponse\n{\n    public function handle($request, Closure $next)\n    {\n        $response = $next($request);\n\n        \/\/ JSON\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u5834\u5408\u306e\u307f\u51e6\u7406\n        if ($response instanceof JsonResponse) {\n            $data = $response-&gt;getData(true);\n\n            \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u5f62\u5f0f\u306e\u6a19\u6e96\u5316\n            $standardResponse = [\n                'status' =&gt; $response-&gt;status(),\n                'success' =&gt; $response-&gt;status() &lt; 400,\n                'data' =&gt; $data,\n                'timestamp' =&gt; now()-&gt;toIso8601String(),\n                'request_id' =&gt; (string) Str::uuid()\n            ];\n\n            \/\/ \u30a8\u30e9\u30fc\u60c5\u5831\u306e\u8ffd\u52a0\n            if ($response-&gt;status() &gt;= 400) {\n                $standardResponse['error'] = [\n                    'code' =&gt; $response-&gt;status(),\n                    'message' =&gt; $data['message'] ?? '\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f'\n                ];\n            }\n\n            $response-&gt;setData($standardResponse);\n        }\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u8a2d\u8a08\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u8a2d\u5b9a\u7ba1\u7406<\/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=\"\">namespace App\\Http\\Middleware;\n\nclass ConfigurableTeamMiddleware\n{\n    protected $config;\n\n    public function __construct()\n    {\n        \/\/ \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u8aad\u307f\u8fbc\u307f\n        $this-&gt;config = config('team.middleware');\n    }\n\n    public function handle($request, Closure $next)\n    {\n        \/\/ \u30c1\u30fc\u30e0\u56fa\u6709\u306e\u51e6\u7406\u30eb\u30fc\u30eb\u9069\u7528\n        if (isset($this-&gt;config['rules'])) {\n            foreach ($this-&gt;config['rules'] as $rule) {\n                $processor = app($rule['processor']);\n                $result = $processor-&gt;process($request);\n\n                if (!$result-&gt;isSuccess()) {\n                    return response()-&gt;json([\n                        'error' =&gt; $result-&gt;getError()\n                    ], $result-&gt;getStatusCode());\n                }\n            }\n        }\n\n        return $next($request);\n    }\n}\n\n\/\/ config\/team.php\nreturn [\n    'middleware' =&gt; [\n        'rules' =&gt; [\n            [\n                'processor' =&gt; \\App\\Services\\SecurityProcessor::class,\n                'priority' =&gt; 1\n            ],\n            [\n                'processor' =&gt; \\App\\Services\\LoggingProcessor::class,\n                'priority' =&gt; 2\n            ]\n        ]\n    ]\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u30d1\u30bf\u30fc\u30f3<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Http\\Middleware;\n\nclass MiddlewareFactory\n{\n    protected $middlewareMap = [\n        'api' =&gt; [\n            'auth' =&gt; ApiAuthMiddleware::class,\n            'throttle' =&gt; ApiThrottleMiddleware::class,\n            'log' =&gt; ApiLogMiddleware::class\n        ],\n        'web' =&gt; [\n            'auth' =&gt; WebAuthMiddleware::class,\n            'csrf' =&gt; WebCsrfMiddleware::class,\n            'log' =&gt; WebLogMiddleware::class\n        ]\n    ];\n\n    public function make($type, $name)\n    {\n        if (!isset($this-&gt;middlewareMap[$type][$name])) {\n            throw new \\InvalidArgumentException(\n                \"Undefined middleware: {$type}.{$name}\"\n            );\n        }\n\n        $class = $this-&gt;middlewareMap[$type][$name];\n        return app($class);\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nclass RouteServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        $factory = app(MiddlewareFactory::class);\n\n        Route::middleware('api')\n            -&gt;group(function () use ($factory) {\n                Route::get('\/users', function () {\n                    \/\/ \u30eb\u30fc\u30c8\u306e\u5b9a\u7fa9\n                })-&gt;middleware($factory-&gt;make('api', 'auth'));\n            });\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u56fa\u6709\u306e\u8a2d\u5b9a<\/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=\"\">namespace App\\Http\\Middleware;\n\nclass EnvironmentSpecificMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        $response = $next($request);\n\n        \/\/ \u958b\u767a\u74b0\u5883\u7279\u6709\u306e\u51e6\u7406\n        if (app()-&gt;environment('local', 'development')) {\n            \/\/ \u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306e\u8ffd\u52a0\n            if ($response instanceof JsonResponse) {\n                $data = $response-&gt;getData(true);\n                $data['_debug'] = [\n                    'queries' =&gt; \\DB::getQueryLog(),\n                    'memory' =&gt; memory_get_usage(true),\n                    'time' =&gt; microtime(true) - LARAVEL_START\n                ];\n                $response-&gt;setData($data);\n            }\n\n            \/\/ CORS\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a\n            $response-&gt;headers-&gt;set('Access-Control-Allow-Origin', '*');\n            $response-&gt;headers-&gt;set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n        }\n\n        return $response;\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u958b\u767a\u52b9\u7387\u5316\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5171\u901a\u51e6\u7406\u306e\u4e00\u5143\u7ba1\u7406\u306b\u3088\u308b\u30b3\u30fc\u30c9\u91cd\u8907\u306e\u524a\u6e1b<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u9593\u3067\u306e\u5b9f\u88c5\u306e\u6a19\u6e96\u5316<\/li>\n\n\n\n<li>\u74b0\u5883\u3054\u3068\u306e\u67d4\u8edf\u306a\u8a2d\u5b9a\u7ba1\u7406<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u52b9\u7387\u306e\u5411\u4e0a<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u52b9\u7387\u5316<\/li>\n<\/ul>\n\n\n\n<p>\u307e\u305f\u3001\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u65b0\u898f\u6a5f\u80fd\u306e\u8ffd\u52a0\u3084\u65e2\u5b58\u6a5f\u80fd\u306e\u4fee\u6b63\u304c\u3088\u308a\u5bb9\u6613\u306b\u306a\u308a\u3001\u30c1\u30fc\u30e0\u5168\u4f53\u306e\u958b\u767a\u751f\u7523\u6027\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2646","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2646","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=2646"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2646\/revisions"}],"predecessor-version":[{"id":2648,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2646\/revisions\/2648"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}