Documents

LaravelのAjaxの開発方法(backend側)


非同期の開発はログを取るところに肝があるので、Ajaxの開発=Laravelのログの取り方ということになると思います。ログは自分で仕込んでしまっても問題ないのですが、Laravelにデフォルトで備わっているmonologを使う方がベターです。また、開発環境では詳細にログを取るがプロダクト環境ではログを取らないなどの使い分けをするのがベストな方法ということになる筈です。
Laravel 8.x ログ の公式ドキュメントにあるように各チャンネルの設定で詳細なログの設定が可能になります。

ログの機能を今すぐに使いたい場合は、ログ取得をしたいコントローラの中でuseでlogのファサードを呼び出します。monologの基本機能はこのファサードでコントロールしています。

use Illuminate\Support\Facades\Log;

それからログを取得したいmethodの中で、最も優先度が低いdebugモードでログを設定します。引数になる部分にはデバックしたい内容を記述します。

Log::debug("foobar");

ログの確認は、

$ cd app/storage/logs
$ tail -f laravel.log

指定のメソッドがリクエストされる度にロギングされます。laravel.logはデフォルトでエラーなどの様々なログがデフォルトで設定されてるため、時折自分が意図していないLaravel側のロギングが行われます。完全にログを分けたい場合はログの詳細な設定が必要です。詳細は別項で説明します。

コントローラ側でAjaxのリクエストを受ける

Laravelの仕組みは非常に単純です。外部からのリクエストを受ける際はルーティングを通してコントローラからレスポンスを返すだけです。Ajax側のリクエスト先のエンドポイントを設定します。app/routes/web.phpに設定してもよいですが、app/routes/api.phpに設定しても同じ結果が得られる筈です。ここでは example.com/save にリクエストがあった際を想定してみます。

// app/routes/web.php
Route::post('/save', [App\Http\Controllers\UploadController::class, 'save'])->name('upload_save');

コントローラ側ではHTTPリクエストを受けつける準備をしていれば問題ないです。

// app/Http/Controllers/UploadController.php
...
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
...

メソッド側では、リクエストをそのまま受けるようにすればよいです。通常送信される POST データは name + data である。逆にいうとどのデータをどんな名前で取得するのかということなる。例えばファイルデータを foo と名前で取得する場合は、単純に、

...
public function save(Request $request)
  {
    $file = $request->file('foo');
    return 1;
  }
...

という風になる筈です。返り値はリクエストが取得できた(あるいは取得できなかった)ということを応答してあげればよいので、システムに合わせた適当なものをフロント側に返すことになるでしょう。ここまでがLaravel側でAjaxのリクエストを開発する概要になります。



2022.03.27