久しぶりにlaravelで開発中のtomita@atuwebです。

そして、さらに久々のajax非同期通信でちょっとはまってしまいましたので、自戒を込めたメモを残します。

環境

  • PHP 7
  • Laravel 5.3

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

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

JSコード

$.ajax({
  type : "POST",
  url  : "{{ url('/api/login') }}",
  data : {
    user   : user,
    passwd : passwd
  },
  :

Laravelコード

class HogeController
{
  use Illuminate\Http\Request;

  public function login(Request $request)
  {
      $request->all();                   // ['user' => '[userの入力値]', 'passwd' => '[passwdの入力値]']
      $request->header('content-type');  // 'application/x-www-form-urlencoded; charset=UTF-8'
      $request->isJson();                // false
  }
  :

Jsonを受け取る

JSコード

$.ajax({
  type: "POST",
  url : "{{ url('/api/login') }}",
  contentType: 'application/json',
  dataType: 'json',
  data: JSON.stringify({
    user   : user,
    passwd : passwd
  })

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

$.ajax({
  headers: {
   'Content-Type': 'application/json'
  },
  :

Laravelコード

class HogeController
{
  use Illuminate\Http\Request;

  public function login(Request $request)
  {
      $request->all();                  // ['user' => '[userの入力値]', 'passwd' => '[passwdの入力値]']
      $request->header('content-type'); // 'application/json'
      $request->isJson();               // true
  }
  :

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

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

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

しばらく悩んだ間違い

$.ajax({
  type: "POST",
  url : "{{ url('/api/login') }}",
  contentType: 'application/json',
  dataType: 'json',
  data: {
    user   : user,
    passwd : passwd
  }

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

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

おわりに

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

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

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


スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク
ad_336