Laravel の開発中に、Ajax 非同期通信でちょっとはまってしまいましたので、自戒を込めたメモを残します。

環境

  • PHP 7
  • Laravel 5.3

jsはいつの間にか生成されていたpublic/js/app.jsを使用します。
(php artisan make:authで追加される?? make:authは5.2から。)

普通のPOSTパラメーターを受け取る

JSコード

1$.ajax({
2  type : "POST",
3  url  : "{{ url('/api/login') }}",
4  data : {
5    user   : user,
6    passwd : passwd
7  },
8  :
9});

Laravelコード

 1class HogeController
 2{
 3  use Illuminate\Http\Request;
 4
 5  public function login(Request $request)
 6  {
 7      $request->all();                   // ['user' => '[userの入力値]', 'passwd' => '[passwdの入力値]']
 8      $request->header('content-type');  // 'application/x-www-form-urlencoded; charset=UTF-8'
 9      $request->isJson();                // false
10  }
11  :
12}

Jsonを受け取る

JSコード

 1$.ajax({
 2  type: "POST",
 3  url : "{{ url('/api/login') }}",
 4  contentType: 'application/json',
 5  dataType: 'json',
 6  data: JSON.stringify({
 7    user   : user,
 8    passwd : passwd
 9  })
10  :
11});

contentTypeは以下でも良いみたい。

1$.ajax({
2  headers: {
3   'Content-Type': 'application/json'
4  },
5  :
6});

Laravelコード

 1class HogeController
 2{
 3  use Illuminate\Http\Request;
 4
 5  public function login(Request $request)
 6  {
 7      $request->all();                  // ['user' => '[userの入力値]', 'passwd' => '[passwdの入力値]']
 8      $request->header('content-type'); // 'application/json'
 9      $request->isJson();               // true
10  }
11  :
12}

以下は同じ結果が得られました。ほぼ等価なのかなと思います。

1$request->all();
2$request->json()->all();

旧バージョンのLaravelではInput::all()も試してくてください。

しばらく悩んだ間違い

 1$.ajax({
 2  type: "POST",
 3  url : "{{ url('/api/login') }}",
 4  contentType: 'application/json',
 5  dataType: 'json',
 6  data: {
 7    user   : user,
 8    passwd : passwd
 9  }
10  :
11});

dataにセットするオブジェクトが、すでにJsonだと思い違いをしておりました。
ContentTypeがapplication/jsonなのに、リクエストパラメーターがJsonではない ため、上記をLaravelで$request->all()しても何も得られませんでした。

ContentTyeと実際のデータフォーマットは合わせましょう、当然ですが。

おわりに

数年前は以下のように標準入力からRequestBodyを取得していましたね。

1$JSON = file_get_contents('php://input');

Laravelでは一発で配列化されたデータが取れるのですから、これはかなり楽ですねー。
Laravel万歳!