質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

1回答

612閲覧

グローバルミドルウエアについて

toll_tree

総合スコア199

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/05/14 03:21

ルートにミドルウエアを追記した場合と、グローバルミドルウエアにミドルウエアを設定をした場合とで、実行結果が違ってしまいます。
下記は、ミドルウエア(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」の部分がリンクでなくただのテキストになってしまいました。
何故、実行結果にこのような違いが発生してしまうのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2019/05/14 06:42

過去の質問も拝見したんですが 質問タイトルが「XXXXについて」というように命名されているようですが タイトルだけではそれについてどうしたいのかまでわかりません。 詳細ページを見るまでわからないものですから、できればタイトル内にやりたい事、できない事まで含めるようにした方がよいでしょう
toll_tree

2019/05/14 09:27

結果的に詳細なことは質問本文みるまで分からないわけですし、タイトルにすべて含めるのは不可能では?
m.ts10806

2019/05/14 12:15

「起きている問題、課題」をきちんと書けば良いです。「何が起きているか」あと「要件」。 teratailでどのようなタイトルが望ましいかは「質問するときのヒント」参照。 解決されたようですし何かしらの形で「解決済み」としておいてください
mikkame

2019/05/16 09:46

> 結果的に詳細なことは質問本文みるまで分からないわけですし、タイトルにすべて含めるのは不可能では? teratailの質問投稿欄右のtipsボタンを押すと「7つの質問チェックリスト」が表示されます。 そこに > 質問内容がわかりやすいタイトル > 悪い例:「CSSレイアウトについて」 > 良い例:「CSSで"div"を上下中央揃えにしたい」 というように、私が以前コメントした事と同等の内容が書かれています。 https://teratail.com/help/question-tips こちらの「質問するときのヒント」ページでも > 3-1. タイトルには要件を書きましょう と書かれております。「7つの質問チェックリスト」、「質問するときのヒント」を一度お読みください
guest

回答1

0

そりゃHTML的には<>で囲われていたらブラウザは「HTMLタグ」として解釈しようとしますからね。
ミドルウェア通してなかったら単なるHTMLタグです。(ただし存在しないタグなので何の効果も発揮しない)
ブラウザで確認されているのでしたら「ソースを表示」してみると良いですよ。

(PHPもそうですけどHTMLの基礎もごっそり抜け落ちてませんか)


追記:
下記、確認してください。

  • ブラウザ「ソースを表示」した結果、どうなってるか
  • HelloMiddleware::handle()が本当に呼び出されているかどうかデバッグ

「ミドルウェアが正しく認識されていない」ことが問題の1つで、回答の冒頭は「連携されてないから単にviewに書いた内容がそのまま出力されている」ことの指摘です。
呼び出されれば処理が行われることが分かっているのでしたら、追及するポイントは「用意したミドルウェアがグローバルミドルウェアとして認識されていないのではないか?」に絞られると思います。

投稿2019/05/14 03:32

編集2019/05/14 04:13
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toll_tree

2019/05/14 03:36 編集

Hello Middlewareをグローバルミドルウエアを設定しているということは、ミドルウエアが呼び出されているということではないのですか?
m.ts10806

2019/05/14 03:37

Laravelのマニュアルにそのように書いてある場所はどこですか? 少なくとも私が見ている5.8のマニュアルではRouteからミドルウェアを呼び出す記述は必ず書いてあるように見受けられますが。
m.ts10806

2019/05/14 03:39

少なくともHelloMiddlewareは提示のHelloControllerとは紐づけられていませんね。
toll_tree

2019/05/14 03:40

あ、自分が学習している書籍では、laravel5.5なので、5.8とは違う?のですかね?
m.ts10806

2019/05/14 03:42

公式マニュアル読んでください。読めば簡単に比較できます。 (結構な頻度で言ってるような気がしますけど、読まない人は一生初心者です)
m.ts10806

2019/05/14 03:46

まあ「Laravel ミドルウェア」で検索すると私は最初に5.3が出てきてそこから直接URL書き換えて5.8を読んでいて内容的な変更は見受けられなかったので、 まさかその狭間のバージョンで内容が変わってまた戻るなんてことはないとは思いますけど。 質問内にバージョン情報がなければ回答者は最新バージョンを確認します。といっても「自分のは5.5だから嘘を言ってる」と訳の分からないマウントを取ろうとするのならやめたほうがいいです。 マニュアルをきちんと読んでいないあなたに勝ち目はありません。
toll_tree

2019/05/14 03:49

少し、疑問なのですが、Routeからミドルウエアを呼び出す記述が必要というならば、グローバルミドルウエアはなんの為に存在するのでしょうか?
m.ts10806

2019/05/14 03:52

Laravelのミドルウェアの仕様を問いたいのでしょうか。 それでしたらマニュアルを隅から隅まで読んだうえでLaravel本体のコードを追ったほうが理解が深まるでしょう。 結局、PHPのときの「PHPの仕様知りたければPHPのCのコードを読め」というのと同じく、「仕様」部分に「なぜ」を言うのは今の段階では避けたほうが良いでしょう。 「ミドルウェアとは何か」と本質を問うのでしたらそれこそ優良な記事はたくさんあるので調べてください。
toll_tree

2019/05/14 04:00 編集

ミドルウエアとは何か、ではなくグローバルミドルウエアは何故必要なのか、といった部分です。
m.ts10806

2019/05/14 04:09

ひとまず私の回答も加味して下記は確認必要ではないでしょうか ・ブラウザ「ソースを表示」した結果、どうなってるか ・HelloMiddleware::handle()が本当に呼び出されているかどうかデバッグ ちょっと回答の書き方ミスってますが、「ミドルウェアが正しく認識されていない」ことが問題の1つで、回答の冒頭は「連携されてないから単にviewに書いた内容がそのまま出力されている」ことの指摘です。 呼び出されれば処理が行われることが分かっているのでしたら、追及するポイントはグローバルミドルウェアの存在の是非より「グローバルミドルウェアとして認識されていないのではないか?」という疑問からの検証です。
m.ts10806

2019/05/14 04:21

>低評価つけられたかた 確かに回答の書き方やコメントの仕方がまずかったのは認めますが、 差し支えなければどの点が間違っているかコメントいただけませんでしょうか。 少し回答手直しはしたものの、そこから解決につながらないと判断されたのだと思いますが、理由を詳しく知りたいです。 回答の手直し等は都度指摘にあわせてしますので。 (それか、的確な回答をしてあげてください。別に私は自分が一番になりたいとか思ってません。質問者さんの問題や課題が解決できればそれで良いので)
toll_tree

2019/05/14 04:55

グローバルミドルウエアとして、認識されていないといったことだったんですね。 理解できました。 今、ソースの表示をしましたら、そのまま<middleware>google.com</middleware>、<middleware>yahoo.co.jp</middleware>となっており、HelloMiddlewareのhandleメソッドが呼び出されていないことが分かりました。 そこで、kernel.phpを見直したのですが、特に誤字なども見つからなかったので、念のためctrl + s で保存し再実行したら、リンクとして表示されました。
m.ts10806

2019/05/14 05:00

としたらView側のキャッシュとかかもしれませんね。 「想定の動作をしなかったらデバッグ」はどの言語でも同じです。 新しい処理を作ったのでしたらそこが通るかどうかは実行してみて実態が初めてわかるものなので 本処理を書く前に本当に簡単な処理だけ書いて実行して通るのを確認してください。 これも「ミニマムコード」ですよ。ミニマムコードで動かないのでしたら複雑な処理を書いて動かないのは当然です。 今回でしたらdd('test');とかhandle()に入れるだけでも通ってるかどうか確認できますよね。
toll_tree

2019/05/14 05:10

dd()ってPHPではなく、laravelの関数なんですね。 laravel固有の関数があることは知りませんでした。
m.ts10806

2019/05/14 05:19

えーと、そこは本件と離れるんであれですけど、なんだと思ってたのか逆に知りたい。 実際にLaravel関係ないところでPHP実行して、PHPマニュアル確認したらわかる話です。 関数=メソッドです。 結局はPHPで書かれているので「固有関数」をどういう意味合いで使ってるかによりますけど、少なくとも「変数の内容をダンプして出力しているLaravel内の関数」ではありますね。 どうやって出力しているかはLarave内部ソースを確認してください。
m.ts10806

2019/05/14 05:45 編集

自分で関数定義してその中で処理を実行してって、基礎で必ずやるところだと思うのですが、 それを「〇〇固有の関数」と呼んでいる人は私は出会ったことはないですね。 あくまでPHPのルールにのっとって作られた自作関数(メソッド)です。 まあ、別のフレームワーク、例えばCakePHPではdd()ではなくdebug()とかなのでそれを「固有の関数」と呼んでしまえばそうですけど。
mikkame

2019/05/14 06:29

@mts10806 飛び火したようで申し訳ない
m.ts10806

2019/05/14 06:31

もしかして何か関連質問ありました?全部見てるわけではないので・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問