apiサーバを作っていて、jsonの中の日本語文字列がエスケープされていると読めなくてつらいなと思ったところから始まります。動くようになってしまえばクライアントがデコードしてしまうからエスケープされていても問題はないわけですが、それまでのデバッグ過程で通信内容をのぞいたりログをとったり手でアクセスしてみたりという機会はいくらでもありますからね。いうことで、JSON_UNESCAPED_UNICODEオプションを使いたいわけですがどうすれば指定できるか調べていきます。どこでjson_encodeしているか\Illuminate\Http\JsonResponseクラスまずjson応答といえば思いつくのがこのクラスです。エンコード処理はsetData関数の中にあります。}$this->encodingOptionsに保存したオプションを渡すようになっていて、コンストラクタのパラメタやsetEncodingOptionsメソッドで設定できます。\Illuminate\Http\ResponseクラスResponseクラスもそういえばResponse::create()で配列やモデルを渡すとjsonにしてくれますが、この処理は自前でもっていました。それがこのmorphToJsonメソッドです。}オプションの影すらありません。Responseに配列やモデルを渡すパターンは使わない方が良さそう...JsonResponseをnewするところ\Illuminate\Http\Responseのことはとりあえず使わなければいいので無視することにして、\Illuminate\Http\JsonResponseが作られるときにコンストラクタの$optionsパラメタにJSON_UNESCAPED_UNICODEを設定する余地がないか調べていきます。\Illuminate\Routing\ResponseFactory::jsonResponseファサードでResponse::json(...)したときやresponseヘルパーで`response()->json(...)したときに呼ばれる奴です。}\Illuminate\Routing\Router::toResponseコントローラの戻り値としてResponseクラスではなくいきなり配列とかモデルを返したときにいい感じにjson応答にする処理です。読んでみてはじめて知りましたが、EloquentモデルでwasRecentlyCreatedのときは201応答にするとか小技が効いてますね。}\Illuminate\Foundation\Exceptions\Handler::prepareJsonResponse例外ハンドラで応答がjsonのときに使われる奴です。}どう直すか\Illuminate\Http\JsonResponseや\Illuminate\Http\Responseを自分で直接呼んでいるところはどっちにしろ直さなければならないのであきらめます。JsonResponse::create(...)などとしているところはとりあえずいい機会なので修正することにします。配列やモデルをコントローラから返して自動的にjson応答に変換させる機能は使わないことにします。すると修正する必要があるのは、\Illuminate\Routing\ResponseFactoryのjsonメソッド\Illuminate\Foundation\Exceptions\HandlerのprepareJsonResponseメソッドの2つになります。ResponseFactoryはDIコンテナで解決されるので、修正したクラスに入れ替えてやります。例外ハンドラの方はもともとextendしたApp\Exceptions\Handlerを使うようになっているので、そちらで上書きしてやります。ヘルパーを使うパターンという書き方をした場合という限定つきですが、普通のLaravelの書き方でJSON_UNESCAPED_UNICODEオプションを使うことができたのでよしとします。(というかLaravelいろんな書き方できすぎ)でもできればLaravelの設定を一ついじるだけでいいようにしてほしいですね。本件についてはPHPユーザーズ(日本語)slack(phpusers-ja.slack.com)のLaravelチャンネルの皆さんに相談に乗っていただきました。ありがとうございました。lumenについての追記lumenのresponseヘルパーはLaravel\Lumen\Http\ResponseFactoryがハードコードされているのでDIコンテナの登録を入れ替えるやり方では手が出せません。Responseファサードはそもそもありません。(正確にはファサードのクラス自体は残ってますがalias定義もないし、Illuminate\Contracts\Routing\ResponseFactoryがコンテナに登録されてないので使えません)多分responseヘルパーを置き換えるとかそんな感じになるかと。}}追記(ミドルウェアで行う方法)ミドルウェアで行う方法を教えていただきました。JSONレスポンスのUnicodeエスケープ無効化はミドルウェアで!すっきりしていて良いです。upLoginユーザーは見つかりませんでした。