2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

response()->json() と return [a, b, c]のちがい

Posted at

Too Long; Don't Read

LaravelでのAPIレスポンスの書き方において、  
以下の2つが同じ意味だと思っていた。


return response()->json(
    $response['error_message'],
    $response['status_code'],
    $response['example_text']
);

return [ 
    $response['error_message'],
    $response['status_code'],
    $response['example_text'] 
];

json()の省略形が[]かな くらいに思っていた。

それぞれの結果は以下。


return response()->json(
    $response['error_message'],
    $response['status_code'],
    $response['example_text']
);

// Type error: Argument 3 passed to Illuminate\Routing\ResponseFactory::json() must be of the type array, string given, called in ~~~~

return [ 
    $response['error_message'],
    $response['status_code'],
    $response['example_text'] 
];

// { 'error_message', 500, 'example text' }

前者はエラーが起こっているのに対し、
後者は渡した内容をjson型にしている。

題目のresponse()->json() と return [a, b, c]のちがい
とは、この点になる。

後述するが、json()の引数はそれぞれ格納するものが決まっていて、第二引数以降にオプションを指定することができる。

そのため、
ただjson型のデータを渡せば良い時と、
オプションを指定して受け取り手へ明示的に値を渡したい時とで、使い分けると良い。

今回の場合は
ajaxのdone(), fail() への振り分けを行いたかったことから、
第2引数でHttpステータスを明示できるjson()の書き方を用い、
以下の書き方に変更して無事解決。

return response()->json(
    $response, 
    $response['status']
);

勘違いの要因

return response()->json( ['a', 'b', 'c'] );

配列でjson()に渡すパターンとjson関数の仕様をごっちゃに覚えていたから。

json( )の仕様

json()はjson_encode()を内部で用いている。

json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] ) : string

value
エンコードする値。 リソース 型以外の任意の型を指定できます。
options
JSON_FORCE_OBJECT, .....からなるビットマスク。

以降Arrayで渡す

depth
最大の深さを設定します。正の数でなければいけません。

引数にはそれぞれ受け付ける型と意味が決まっているため、
Arrayで渡すべきところにStringを渡して、型エラーが出ていたのでした。

感想

調べているうちにAjaxのdone, fail の振り分けについても詳しくなれたので良かった。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?