プロミディア合同会社の斉藤です。
Webアプリケーションで単語帳やクイズ処理を行う場合、問題や回答を都度データベースから取得してくるのはWebサーバーに負荷がかかるので良い方法ではありません。
今回はセッション機能を使い、問題データを取得するのは1回だけで済むサンプルプログラムをご紹介したいと思います。
概要
処理の概要は以下の通りです。
初めて画面を開いた時はデータベースから問題を取得しますが、2問目以降はセッションから取得するようにします。
クライアンPCの画面から「次の問題」リンクに要求する問題番号のパラメータを含めています。
初めて画面を開いた時はデータベースから問題を取得しますが、2問目以降はセッションから取得するようにします。
クライアンPCの画面から「次の問題」リンクに要求する問題番号のパラメータを含めています。

サンプルコードの画面
画面は素っ気なく、最小限の表示にしています。

ソースコードの解説
コントローラ(SessionsController)
コントローラのソースは以下の通り。
初めて開いたかどうかは「$request->next_pos」がnullか否かで判断します。
セッションのキー値が何問目を表、バリュー値に問題と答えをカンマ区切りで入れています。
今回はセッションのサンプルなので、DBから問題データは取得せず、直接入力しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SessionsController extends Controller { public function index(Request $request) { if (!$request->session()->has('1')) { // 問題用セッションを設定 // 本来はデータベースから問題データを取得する // これはサンプルなので、直接問題を登録 $request->session()->put('1','apple,リンゴ'); $request->session()->put('2','orange,オレンジ'); $request->session()->put('3','watermelon,スイカ'); } // 現在何問目か if (is_null($request->next_pos)) { // 指定が無ければ1問目とする $quizu_index = '1'; } else { $quizu_index = $request->next_pos; } // 次の問題リンクパラメータ $next_pos = (int)$quizu_index + 1; // セッションから問題データを1つ取得 $mondai_string = $request->session()->get($quizu_index); // カンマ句切なのでバラす $mondai_array = explode(",", $mondai_string); return view('play', [ 'quizu_index' => $quizu_index, 'next_pos' => $next_pos, 'mondai' => $mondai_array[0], 'answer' => $mondai_array[1] ]); } } |
ビュー(play.blade.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>タイトル</title> </head> <body> <label>【{{ $quizu_index }}問目】</label> <br> <label>問題ー{{ $mondai }}</label> <br> <label>答えー{{ $answer }}</label> <br> {!! link_to_route('top', '次の問題', ['next_pos' => $next_pos], []) !!} </body> </html> |
ルーティング(web.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', 'SessionsController@index')->name('top'); |
サンプルコードの提供
今回解説したソースコードはGitHub上にアップしています。
欲しい方は下記よりダウンロードしてご利用ください。
欲しい方は下記よりダウンロードしてご利用ください。