Laravelを使って非同期処理を実現する必要があり、 ジョブとキューで実現できそうだったので試してみた。
やりたきこと
やりたきことは以下
- A,Bのユーザーが存在
- Aのユーザーが相手を探すボタンを押す
- Aのユーザーの画面では相手を探していますと表示
- Bのユーザーが対戦相手を探す
- AとBをマッチングさせる
- AとBのユーザーの画面にはマッチング完了の表示
開発環境
開発環境は以下。PHPとlaravelのインストールは終わっている前提。
- macOS 10.14.6
- Laravel
- mysql
マッチング用のテーブル作成
artisan make:migrationでテーブル作成のマイグレーション作成
$ php artisan make:migration create_user_matchings_table
database/migrations/xxxx_xx_xx_xxxxx_create_user_matchings_table.php が作成されていると思うので、 必要なカラムを追加する
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUserMatchingsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('user_matchings', function (Blueprint $table) { $table->bigIncrements('id'); $table->integer('a_user_id')->nullable()->comment('aユーザーID'); // 追加 $table->integer('b_user_id')->nullable()->comment('bユーザーID'); // 追加 $table->timestamps(); $table->index(['a_user_id', 'b_user_id']); }); }
認証画面追加
artisan makeでlaravelの認証機能を追加
$ php artisan make:auth
ボタンを押す画面の作成
↑のようにresources/views/welcome.blade.php を修正して画面を作成
# resources/views/welcome.blade.php <meta name="token" content="{{ csrf_token() }}"> ~~~ @if ($user) <div> user_id: {{ $user->id }} <input type="hidden" id="user-id" value="{{ $user->id }}"> </div> @endif <script src="https://code.jquery.com/jquery-3.3.1.js"></script> <script> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="token"]').attr('content') } }); var userId = $('#user-id').val(); $('#searchUser').on('click', function() { $.ajax({ url: '/search_user/' + userId, type: 'POST', data: {'id': userId, '_method': 'POST'} }) .done(function(res) { // 完了後の処理 }); }); </script>
キュー用のデータベースを作成
artisanコマンドでマイグレーションファイルを作成する
$ php artisan queue:table
laravel/database/migrationsに、マイグレーションファイル「xxxx_create_jobs_table.php」が生成される
laravel ├─ database │ ├─ migrations │ │ └─ xxxx_create_jobs_table.php
artisanコマンドでマイグレートを行い、jobテーブルを作成
$ php artisan migrate
キューサービスをデータベースへ切り替える
デフォルトではsyncになっているので、laravel/.envを開いてキューサービスをdatabaseへ切り替える。
# Laravel 5.7〜 QUEUE_CONNECTION=database # Laravel 〜5.6 QUEUE_DRIVER=database
続いてAPI実装とキューの実装を作成していきます。