💨

LaravelでInternetExplorerからのリクエストを指定viewにレスポンスするmiddlewareを実装する

2022/04/29に公開

環境

PHP8.0
Laravel Framework 9.5.1

背景

2022年6月16日(日本時間)に Microsoft 社の Internet Explorerはサポート終了になります。
そのため、ユーザがIEを利用している場合、その旨と他のブラウザを利用するように案内をしたい。

https://www.ipa.go.jp/security/announce/ie_eos.html

実装

Middleware

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class RejectBrowser
{
    /**
     * @param Request $request
     * @param Closure $next
     * @return Application|ResponseFactory|Response|mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $user_agent = $request->header('User-Agent');
        if (strpos($user_agent, 'Trident') || strpos($user_agent, 'MSIE')) {
            return response(view('errors.browser_not_support'));
        }

        return $next($request);
    }
}

unit test

<?php

namespace Tests\Unit\Http\Middleware;

use App\Http\Middleware\RejectBrowser;
use Tests\TestCase;

class RejectBrowserTest extends TestCase
{
    public function test_InternetExplorerブラウザでない場合、nullとなる()
    {
        // given
        $middleware = new RejectBrowser();
        $request = app()->make('request');

        // when
        $response = $middleware->handle($request, function (){
            $this->assertTrue(true);
        });

        // then
        $this->assertNull($response);
    }

    public function test_InternetExplorerブラウザの場合、Sorryページを返却する()
    {
        // given
        $middleware = new RejectBrowser();
        $request = app()->make('request');
        $request
            ->headers
            ->set('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)');

        // when
        $original_response = $middleware->handle($request, function (){});

        // middlewareの handle()は TestResponse ではなく Response クラスのインスタンスを返却します。
        // そのため、 assertStatus() を使うことはできません。
        // 上記に対応するため、Response を TestResponse に格納しなおします。
        $response = $this->createTestResponse($original_response);

        // then
        $response->assertViewIs('errors.browser_not_support');
    }
}

FYI Response を TestResponse に格納する件について、参考にした記事はこちら。
https://qiita.com/aminevsky/items/b6f10fb90a2512897b83

routingでmiddleware適用

Route::get('/hogehoge', [HogeController::class, 'create'])
            ->middleware('reject.browser')

Discussion