問題
middlewareでHTTPリクエストの前後に処理を入れる
JSONレスポンスのUnicodeエスケープ無効化はミドルウェアで!
LaravelのDebugbarでデータベースのデータの一覧表示をロギングすると、日本語の部分が文字コードで表示されるので、上記2つの記事を参考にミドルウェアでUnicodeエスケープを無効にしようとしているのですがうまく行かない。
コード
コントローラー
PHP:コントローラー
1 2<?php 3 4namespace App\Http\Controllers; 5 6use App\UserModel; 7use App\Http\Requests\UserModelRequest; 8use Illuminate\Http\Request; 9 10 11class UserModelController extends Controller 12{ 13 /** 14 * Display a listing of the resource. 15 * 16 * @return \Illuminate\Http\Response 17 */ 18 19 // 一覧表示 20 public function index() { 21 22 23 $usermodels = UserModel::all(); 24 \Debugbar::info('$usermodels='.$usermodels); // デバックバーのロギング 25 return view('usermodel.index', compact('usermodels')); 26 } 27 28 /** 29 * Show the form for creating a new resource. 30 * 31 * @return \Illuminate\Http\Response 32 */ 33 34 /*1件のデータを新規作成。本来は必要がない(WebAPIにおいて、画面に登録フォームを表示する画面はいらないから)。 35 storeメソッドとセット。 36 */ 37 public function create() { 38 39 return view('usermodel.create'); 40 } 41 42 /** 43 * Store a newly created resource in storage. 44 * 45 * @param \Illuminate\Http\Request $request 46 * @return \Illuminate\Http\Response 47 */ 48 49 // createメソッドで飛ばされた先の実際の処理 50 public function store(UserModelRequest $request) { 51 $usermodel = new UserModel; 52 53 // フォームから受け取った値をすべて格納する 54 $form = $request->all(); 55 56 // fill()->save();でフォームから受け取った値をもとに複数のカラムの値を更新・追加しセーブする。 57 // UserModelのprotect $fillableの項目も参照。 58 unset($form['_token']); 59 $usermodel->fill($form)->save(); 60 61 return redirect('usermodel/' . $usermodel->id); 62 63 } 64 65 /** 66 * Display the specified resource. 67 * 68 * @param int $id 69 * @return \Illuminate\Http\Response 70 */ 71 72 /* 73 レコード表示。indexと違ってidで紐つけて1件ずつ表示する。 74 テスト用としてviewはつくらず、返された連想配列を単に表示するだけにしている。 75 */ 76 public function show(UserModel $usermodel) 77 { 78 \Debugbar::info('$usermodel='.$usermodel); 79 return view('usermodel.show', compact('usermodel')); 80 // オブジェクトを単なる連想配列として返すだけ。 81 // return $usermodels->toArray(); 82 } 83 84 /** 85 * Show the form for editing the specified resource. 86 * 87 * @param int $id 88 * @return \Illuminate\Http\Response 89 */ 90 91 // 更新処理。updateメソッドとセット 92 93 // モデル結合ルート、引数にコントローラー名とその変数をいれるとFindorFail()を含めた一連の処理を書かなくて済む。 94 public function edit(UserModel $usermodel) { 95 return view('usermodel/edit', compact('usermodel')); 96 } 97 98 /** 99 * Update the specified resource in storage. 100 * 101 * @param \Illuminate\Http\Request $request 102 * @param int $id 103 * @return \Illuminate\Http\Response 104 */ 105 106 // 更新処理 107 public function update(UserModelRequest $request, UserModel $usermodel) 108 { 109 // 更新するカラムの数だけインスタンスにアクセスする。 110 $usermodel->user_name = $request->user_name; 111 $usermodel->email = $request->email; 112 $usermodel->save(); 113 return redirect('usermodel/'.$usermodel->id); 114 } 115 116 /** 117 * Remove the specified resource from storage. 118 * 119 * @param int $id 120 * @return \Illuminate\Http\Response 121 */ 122 123 // 削除処理 124 public function destroy(UserModel $usermodel) { 125 $usermodel->delete(); 126 return redirect('usermodel'); 127 } 128} 129 130 131
使いたいミドルウェア
<?php /* JSONレスポンスのUnicodeエスケープを無効化する。実装時にはデバッグモードのみで使用できるようにする。 */ namespace App\Http\Middleware; use Symfony\Component\HttpFoundation\JsonResponse; class UnescapeJsonResponse { /** * @param \Illuminate\Http\Request $request * @param \Closure $next * @return \Symfony\Component\HttpFoundation\Response */ public function handle($request, \Closure $next) { $response = $next($request); // JSON以外はそのまま if (!$response instanceof JsonResponse) { return $response; } // エンコードオプションを追加して設定し直す $newEncodingOptions = $response->getEncodingOptions() | JSON_UNESCAPED_UNICODE; $response->setEncodingOptions($newEncodingOptions); return $response; } }
カーネル
php:
1protected $middleware = [ 2 \App\Http\Middleware\TrustProxies::class, 3 \App\Http\Middleware\CheckForMaintenanceMode::class, 4 \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 5 \App\Http\Middleware\TrimStrings::class, 6 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 7 \App\Http\Middleware\UnescapeJsonResponse::class, 8 ]; 9
試したこと
冒頭記事の1つ目の記事でのmiddleware定義の項。
カーネルに直接書く場合はエラーは出ないが、Unicodeエスケープがそのままでミドルウェアが反映されていない。
ルーティングの場合はartisanのRoute:listで定義は確認はできるものの、リクエストするとTarget class does not existのエラーが出る。
コントローラーに直接コンストラクタメソッドを使う場合も上に同様。
エラーの内容的にクラス名の誤字かと思い、自分で何度か確認したものの見つからなかったのでもしスペルミス等または他の原因がありましたらご指摘いただけると助かります。
回答1件
あなたの回答
tips
プレビュー