💨
LaravelでInternetExplorerからのリクエストを指定viewにレスポンスするmiddlewareを実装する
環境
PHP8.0
Laravel Framework 9.5.1
背景
2022年6月16日(日本時間)に Microsoft 社の Internet Explorerはサポート終了になります。
そのため、ユーザがIEを利用している場合、その旨と他のブラウザを利用するように案内をしたい。
実装
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 に格納する件について、参考にした記事はこちら。
routingでmiddleware適用
Route::get('/hogehoge', [HogeController::class, 'create'])
->middleware('reject.browser')
Discussion