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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

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

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

2884閲覧

LaravelのDebugbarにおいてJSONレスポンスのUnicodeエスケープを無効にできない

kamille-mio

総合スコア24

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

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

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

1クリップ

投稿2019/10/29 18:50

問題

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のエラーが出る。
コントローラーに直接コンストラクタメソッドを使う場合も上に同様。

エラーの内容的にクラス名の誤字かと思い、自分で何度か確認したものの見つからなかったのでもしスペルミス等または他の原因がありましたらご指摘いただけると助かります。

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

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

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

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

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

mix-peach

2019/10/30 03:00 編集

やりたいことは、UserModelController@indexの、 \Debugbar::info('$usermodels='.$usermodels); // デバックバーのロギング これで、デバッグバーに表示されるデータをUnicodeエスケープしたくない、ってことですか??
kamille-mio

2019/10/30 17:25

返信ありがとうございます。 質問した時点では、テーブルから取得してきたデータのうち日本語だけが文字コードでデバックバーに表示されていたので、検索してみたらUnicodeエスケープできていないのではということで冒頭の記事のうち2つ目の記事にたどり着いたという次第なのでそういうことになります。 ですが、その記事の筆者さんから返信がありまして全く別の問題であったということが判明したので問題は解決しました。 当方、まだまだプログラミング歴が浅いのでそこから沼にハマってしまったみたいでお恥ずかしい限りです。 解決方法に経緯を書くので、よろしければ拝見していただけると幸いです。
guest

回答1

0

自己解決

JSONレスポンスのUnicodeエスケープ無効化はミドルウェアで!

冒頭で引用させて頂いた記事の筆者様から返信を頂けて、無事に解決しました。
引用させていただくと

元の質問も拝見しましたが、これはJSONレスポンスとは全く関係のない問題のようです。

$usermodelsはIlluminate\Support\Collectionクラスのオブジェクトになっており、
'$usermodels=' . $usermodels のように文字列と結合しようした時点でCollection::__toString()が呼ばれます。Collection::__toString()は内部的にCollection::toJson()を呼び出しているため、\Debugbar::info()に渡す引数の時点で既にJSON文字列となってしまっています。
\Debugbar::info(['usermodels' => $usermodels->toArray()]);
などと配列に変換してから情報を渡す方がオススメです。

ということだったそうです。
Debugbar::info()にjson_decodeをかけられないものか? ということは思ったのですが、そもそも配列に変換すれば話は早かったということなのでオブジェクトの扱いがまだまだだなと痛感しました。

投稿2019/10/30 17:31

kamille-mio

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問