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

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

ただいまの
回答率

89.54%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 680

toll_tree

score 29

ルートにミドルウエアを追記した場合と、グローバルミドルウエアにミドルウエアを設定をした場合とで、実行結果が違ってしまいます。
下記は、ミドルウエア(Hello Middleware.php)です。

<?php

namespace App\Http\Middleware;

use Closure;

class HelloMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $content = $response->content();
        $pattern = '/<middleware>(.*)<\/middleware>/i';
        $replace = '<a href="http://$1">$1</a>';
        $content = preg_replace($pattern,$replace,$content);

        $response->setContent($content);
        return $response;

    }
}


下記、web.phpでは、ミドルウエア呼び出し処理を記述しています。

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


// Route::post('hello','HelloContoroller@post');

use App\Http\Middleware\HelloMiddleware;

Route::get('hello','HelloController@index')
->middleware(HelloMiddleware::class);


Route::post('hello','HelloController@post');
// Route::get('hello/other','HelloController@other');


下記は、コントローラ「HelloController.php」になります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;

class HelloController extends Controller{

    public function index(Request $request)
    {

        return view('hello.index');
    }

    public function post(Request $request)
    {
        $msg = $request->msg;

        return view('hello.index',['msg'=>$request->msg]);

    }


}


下記は、ビュー部分である「index.blade.php」です。

@extends('layouts.helloapp')
@section('title','Index')
@section('menubar')
  @parent
  インデックスページ
@endsection
@section('content')
  <p>ここが本文のコンテンツです</p>
  <p>これは、<middleware>google.com</middleware>へのリンクです</p>
  <p>これは、<middleware>yahoo.co.jp</middleware>へのリンクです。</p>

@endsection

@section('footer')
copyright 2017 tuyano.
@endsection


下記は、HelloMiddlewareをグローバルミドルウエアに登録する為の、「kernel.php」です

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\HelloMiddleware::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

    /**
     * The priority-sorted list of middleware.
     *
     * This forces non-global middleware to always be in the given order.
     *
     * @var array
     */
    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\Authenticate::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];
}


上記を実行しますと、下記の画像のようになります。
イメージ説明

しかし、グローバルミドルウエアにHellomiddlewareを登録しているため、web.phpの

Route::get('hello','HelloController@index')
  ->middleware(HelloMiddleware::class);


こちらの部分を

Route::get('hello','HelloController@index');


このように書き換え実行しましたら、「google.com」「yahoo.co.jp」の部分がリンクでなくただのテキストになってしまいました。
何故、実行結果にこのような違いが発生してしまうのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mikkame

    2019/05/14 15:42

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

    キャンセル

  • toll_tree

    2019/05/14 18:27

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

    キャンセル

  • m.ts10806

    2019/05/14 21:15

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

    キャンセル

  • mikkame

    2019/05/16 18:46

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

    teratailの質問投稿欄右のtipsボタンを押すと「7つの質問チェックリスト」が表示されます。
    そこに

    > 質問内容がわかりやすいタイトル
    > 悪い例:「CSSレイアウトについて」
    > 良い例:「CSSで"div"を上下中央揃えにしたい」

    というように、私が以前コメントした事と同等の内容が書かれています。

    https://teratail.com/help/question-tips
    こちらの「質問するときのヒント」ページでも

    > 3-1. タイトルには要件を書きましょう

    と書かれております。「7つの質問チェックリスト」、「質問するときのヒント」を一度お読みください

    キャンセル

回答 1

-2

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

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/14 14:45 編集

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

    キャンセル

  • 2019/05/14 15:29

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

    キャンセル

  • 2019/05/14 15:31

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

    キャンセル

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

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる