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});
10

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}
13

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});
12

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

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

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}
13

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

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

旧バージョンの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});
12

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

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

おわりに

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

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

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


詳細! PHP 7+MySQL 入門ノート

大重 美幸
出版社:ソーテック社  発売日:2016-07-01

Amazonで詳細を見る

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

竹澤 有貴,栗生 和明,新原 雅司,大村 創太郎
出版社:ソシム  発売日:2018-09-26

Amazonで詳細を見る

PHPフレームワーク Laravel入門

掌田津耶乃
出版社:秀和システム  発売日:2017-09-16

Amazonで詳細を見る