Laravelでタスク管理アプリを作る~タスク登録・表示機能~
Laravelでタスク管理のWebアプリを作ってみました!
今回はタスク名と期限を入れるような簡単なものです。
完成イメージはこんな感じです。
Laravelの環境構築とDBのマイグレーションはこちらの記事を参考にしてください。 coxcox.hatenablog.com
MVCモデルを使ってタスクの表示・追加ができるようにしていきます。
MVCモデルとは?
Model・View・Controllerの頭文字をとったもので、プログラミングの処理を3つの役割に分けて実装する方法です。
タスク一覧を表示できるようにする
ルーティングを追加する
タスク一覧を表示できるようにするためGETメソッドのルーティングを設定します。
/routes/web.php
<?php // タスクの一覧を取得する Route::get('/', 'TaskController@index');
これで、第一引数にある / というパスへのリクエストを、第二引数のTaskControllerのindexメソッドにルーティングします。
モデルを作成する
Tasksテーブルに対応するモデルを作成します。
モデルの作成はartisanコマンドで作成できます。
Laradockのコンテナ上で実行します。
$ cd laradock $ docker-compose exec --user=laradock workspace bash /var/www$ php artisan make:model Models/Task Model created successfully.
/app/Models/Task.php
が生成されていると思います。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Task extends Model { // }
モデルの中身は変えずにそのままで。
コントローラーを作成する
モデルと同様artisanコマンドでコントローラーを作成します。
$ docker-compose exec --user=laradock workspace bash /var/www$ php artisan make:controller TaskController Controller created successfully.
コントローラーにコードを追加していきます。
最初にTask
モデルを読み込み、ルーティングで定義したindex
メソッドを追加します。
index
メソッドでは、Task::all();
でDBに登録されているタスク一覧を取得し、view('tasks.index', [ 'tasks' => $tasks ]);
で結果をタスク一覧表示用のビュー渡します。
<?php namespace App\Http\Controllers; use App\Models\Task; use Illuminate\Http\Request; class TaskController extends Controller { /** * タスクの一覧を取得する */ public function index() { $tasks = Task::all(); return view('tasks.index', [ 'tasks' => $tasks ]); } }
ビューを作成する
ブラウザに表示するためのビューを作成します。
モデルやコントローラーの様にartisanコマンドは使えないので、resources/views/tasks
配下にindex.blade.php
を追加します。
レイアウトをいい感じにするためにBootstrap
を使いました!
getbootstrap.com
Bootstrapはheadの中にlinkタグを入れるだけで使うことができます。
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
index.blade.php
の中身はこちらです。
<html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="card" style="max-width: 500px; margin: 10% auto;"> <h5 class="card-header">タスクの一覧</h5> <table class="table table-hover"> <thead> <tr> <th scope="col">No</th> <th scope="col">タイトル</th> <th scope="col">期限日</th> </tr> </thead> <tbody> @foreach($tasks as $task) <tr> <th scope="row">{{ $task->id }}</th> <td>{{ $task->title }}</td> <td>{{ $task->deadline }}</td> </tr> @endforeach </tbody> </table> <a class="btn btn-primary" href="/add" role="button" style="margin: 20px;">タスクを追加する</a> </div> </div> </body> </html>
タスクの一覧表示できるかテストしてみる!
コンテナを起動して、DBにテストデータを入れます。
$ docker-compose up -d nginx mysql workspace
ブラウザから「http://localhost」にアクセスしてみます。
テストデータが表示できればOKです!
一覧表示ができるようになったら、タスクを追加できるようにします!
タスクを追加できるようにする
ルートを追加する
タスクを追加する画面を表示するGETメソッドとDBにタスクを追加するPOSTメソッドのルーティングを追加します。
/routes/web.php
<?php // タスクを作成する Route::get('/add', 'TaskController@showAddPage'); Route::post('/add', 'TaskController@addTask');
タスク追加画面のビューを作成する
resources/views/tasks
配下にadd_task.blade.php
を追加します。
Laravelではフォームを作る際は必ずCSRF対策をする必要があります。
フォーム内に@csrf
を追加すれば大丈夫です。この1行がないと419
のエラーになります。
また、フォームのデータをコントローラーに送るにはname
属性が必要になるので、お忘れなく!
add_task.blade.php
の中身はこちらです。
<html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> </head> <body> <div class="container"> <form action="/add" method="POST"> @csrf <div class="card" style="max-width: 500px; margin: 10% auto;"> <h5 class="card-header">タスクの追加</h5> <div class="card-body"> <div class="form-group"> <label for="title">タイトル</label> <input type="text" name="title" class="form-control"> </div> <div class="form-group"> <label for="deadline">期限日</label> <input type="text" name="deadline" class="form-control"> </div> <button type="submit" class="btn btn-primary">追加</button> </div> </div> </form> </div> </body> </html>
コントローラーにメソッドを追加する
先ほど作成したTaskController
にメソッドを追加します。
ビューから送られてきたデータはRequest
クラスで受け取ることができます。
タスクのタイトルと期限日を$task->title
と$task->deadline
に代入します。
save
メソッドで新しいレコードがデータベースに挿入されます。save
が呼び出された時にcreated_at
とupdated_at
のタイムスタンプは自動的に設定されるので、わざわざ設定する必要はありません!
データをDBに登録したあとは、タスク一覧画面に戻るようredirect
させます。
/** * タスクを登録する * * @param Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function addTask(Request $request) { $task = new Task; $task->title = $request->title; $task->deadline = $request->deadline; $task->save(); return redirect('/'); }
タスクが追加できるかテストしてみる!
タスク追加画面からタスクを追加して、一覧画面にリダイレクトされるか確認してみましょう〜
本記事冒頭の完成イメージのようにできたらOKです!
今回Laravelでタスク追加して一覧表示する簡単な画面を作ってみました!実際に作ったものが動くとやっぱり楽しいです^^
が、フォームのバリデーションやビューの共通化など、まだまだ改善の余地はありそうなので、引き続き頑張ります!!