ルートにミドルウエアを追記した場合と、グローバルミドルウエアにミドルウエアを設定をした場合とで、実行結果が違ってしまいます。
下記は、ミドルウエア(Hello Middleware.php)です。
php
1<?php 2 3namespace App\Http\Middleware; 4 5use Closure; 6 7class HelloMiddleware 8{ 9 /** 10 * Handle an incoming request. 11 * 12 * @param \Illuminate\Http\Request $request 13 * @param \Closure $next 14 * @return mixed 15 */ 16 public function handle($request, Closure $next) 17 { 18 $response = $next($request); 19 $content = $response->content(); 20 $pattern = '/<middleware>(.*)</middleware>/i'; 21 $replace = '<a href="http://$1">$1</a>'; 22 $content = preg_replace($pattern,$replace,$content); 23 24 $response->setContent($content); 25 return $response; 26 27 } 28} 29
下記、web.phpでは、ミドルウエア呼び出し処理を記述しています。
php
1<?php 2 3/* 4|-------------------------------------------------------------------------- 5| Web Routes 6|-------------------------------------------------------------------------- 7| 8| Here is where you can register web routes for your application. These 9| routes are loaded by the RouteServiceProvider within a group which 10| contains the "web" middleware group. Now create something great! 11| 12*/ 13 14 15// Route::post('hello','HelloContoroller@post'); 16 17use App\Http\Middleware\HelloMiddleware; 18 19Route::get('hello','HelloController@index') 20->middleware(HelloMiddleware::class); 21 22 23Route::post('hello','HelloController@post'); 24// Route::get('hello/other','HelloController@other');
下記は、コントローラ「HelloController.php」になります。
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Illuminate\Http\Response; 7 8class HelloController extends Controller{ 9 10 public function index(Request $request) 11 { 12 13 return view('hello.index'); 14 } 15 16 public function post(Request $request) 17 { 18 $msg = $request->msg; 19 20 return view('hello.index',['msg'=>$request->msg]); 21 22 } 23 24 25} 26
下記は、ビュー部分である「index.blade.php」です。
php
1@extends('layouts.helloapp') 2@section('title','Index') 3@section('menubar') 4 @parent 5 インデックスページ 6@endsection 7@section('content') 8 <p>ここが本文のコンテンツです</p> 9 <p>これは、<middleware>google.com</middleware>へのリンクです</p> 10 <p>これは、<middleware>yahoo.co.jp</middleware>へのリンクです。</p> 11 12@endsection 13 14@section('footer') 15copyright 2017 tuyano. 16@endsection
下記は、HelloMiddlewareをグローバルミドルウエアに登録する為の、「kernel.php」です
php
1<?php 2 3namespace App\Http; 4 5use Illuminate\Foundation\Http\Kernel as HttpKernel; 6 7class Kernel extends HttpKernel 8{ 9 /** 10 * The application's global HTTP middleware stack. 11 * 12 * These middleware are run during every request to your application. 13 * 14 * @var array 15 */ 16 protected $middleware = [ 17 \App\Http\Middleware\CheckForMaintenanceMode::class, 18 \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 19 \App\Http\Middleware\TrimStrings::class, 20 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 21 \App\Http\Middleware\TrustProxies::class, 22 \App\Http\Middleware\HelloMiddleware::class, 23 ]; 24 25 /** 26 * The application's route middleware groups. 27 * 28 * @var array 29 */ 30 protected $middlewareGroups = [ 31 'web' => [ 32 \App\Http\Middleware\EncryptCookies::class, 33 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 34 \Illuminate\Session\Middleware\StartSession::class, 35 // \Illuminate\Session\Middleware\AuthenticateSession::class, 36 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 \App\Http\Middleware\VerifyCsrfToken::class, 38 \Illuminate\Routing\Middleware\SubstituteBindings::class, 39 ], 40 41 'api' => [ 42 'throttle:60,1', 43 'bindings', 44 ], 45 ]; 46 47 /** 48 * The application's route middleware. 49 * 50 * These middleware may be assigned to groups or used individually. 51 * 52 * @var array 53 */ 54 protected $routeMiddleware = [ 55 'auth' => \App\Http\Middleware\Authenticate::class, 56 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 57 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 58 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 59 'can' => \Illuminate\Auth\Middleware\Authorize::class, 60 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 61 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 62 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 63 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 64 ]; 65 66 /** 67 * The priority-sorted list of middleware. 68 * 69 * This forces non-global middleware to always be in the given order. 70 * 71 * @var array 72 */ 73 protected $middlewarePriority = [ 74 \Illuminate\Session\Middleware\StartSession::class, 75 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 76 \App\Http\Middleware\Authenticate::class, 77 \Illuminate\Session\Middleware\AuthenticateSession::class, 78 \Illuminate\Routing\Middleware\SubstituteBindings::class, 79 \Illuminate\Auth\Middleware\Authorize::class, 80 ]; 81} 82
しかし、グローバルミドルウエアにHellomiddlewareを登録しているため、web.phpの
Route::get('hello','HelloController@index') ->middleware(HelloMiddleware::class);
こちらの部分を
Route::get('hello','HelloController@index');
このように書き換え実行しましたら、「google.com」「yahoo.co.jp」の部分がリンクでなくただのテキストになってしまいました。
何故、実行結果にこのような違いが発生してしまうのでしょうか?