Help us understand the problem. What is going on with this article?

Laravel初心者がLaravelでテストコードを書くまでの勉強メモ(チュートリアルの基本タスクリストの開発にトライ その1)

背景

  • Laravelについて学習し、開発環境を構築した
  • ただテストを書くためにはテストをするアプリケーションが必要
  • Laravelの知識を深めるためにLaravel 5.2のイントロダクションの基本タスクリストをLaravel 5.8で作成してみる

Laravelをインストール

お決まりのLaravelインストール

composer create-project --prefer-dist laravel/laravel quickstart

を実行する。

DBの準備

migrationファイル作成

タスク保持のためのテーブルを定義する。
テーブル定義のためのmigrationファイル作成はmake:migrationコマンドを使う。

php artisan make:migration create_tasks_table --create=tasks

実行し、database/migrationsを覗くと
2019_XX_XX_XXXXXX_create_tasks_table.php
を発見。
つまり上記コマンドは、
「Y_m_d_His_create_tasks_table.phpというmigrationファイルを作ってくれや。
「tasks」ってテーブルを新たに作成するで。」ということらしい。
開いてみると以下のようになっていた。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTasksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name'); //追記分
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tasks');
    }
}

upメソッドは新しいテーブル、カラム、インデックスをデータベースに追加するために使用するメソッド、downはその逆とのことなので、id,日付に加えてタスク名を保存するカラムを追加するための記述を追記した。

migrationファイルの実行

上記で作成したファイルは以下コマンドで実行できる。

php artisan migrate

Eloquentモデル

EloquentとはLaravelのデフォルトORM(※データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法を実現する仕組み)

作ったばかりのtasksデータベーステーブルに対応するTaskモデルを定義するために、以下コマンドを実行する。

php artisan make:model Task

実行後appを覗くとTask.phpを発見。
開いてみると以下のようになっていた。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    //
}

具体的な記述はまだ空っぽ。

ルート定義

ルートのスタブを定義

※実際のオブジェクトを置き換えて、 設定した何らかの値を (オプションで) 返すようなテストダブルのことを スタブ と言う

タスク表示、タスク追加、タスク削除の3つのルートをroutesディレクトリ内のファイルで定義する。

routes/web.php
<?php

use App\Task;
use Illuminate\Http\Request;

/**
 * タスクダッシュボード表示
 */
Route::get('/', function () {
    //
});

/**
 * 新タスク追加
 */
Route::post('/task', function (Request $request) {
    //
});

/**
 * タスク削除
 */
Route::delete('/task/{task}', function (Task $task) {
    //
});

ビューの表示

/ルートを定義する。
上記routes/web.phpのget部分を

Route::get('/', function () {
    return view('tasks'); //追記分
});

のように記載するとview関数に渡したtasksは、resources/views/tasks.blade.phpテンプレートに対応するビューオブジェクトインスタンスを生成する。

レイアウトとビューの作成

レイアウト定義

ビューを作成する。
ビューを置くresources/views以下にlayouts/app.blade.phpを定義して、内容はチュートリアルに記載のものとする。

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Laravel Quickstart - Basic</title>

        <!-- CSSとJavaScript -->
    </head>

    <body>
        <div class="container">
            <nav class="navbar navbar-default">
                <!-- ナビバーの内容 -->
            </nav>
        </div>

        @yield('content')
    </body>
</html>

子ビューの定義

新しいタスクを作成するためのフォームと、存在する全タスクを同時に表示するビューを定義する。
resources/views以下にtasks.blade.phpを定義して、内容はチュートリアルに記載のものとする。

@extends('layouts.app')

@section('content')

    <!-- Bootstrapの定形コード… -->

    <div class="panel-body">
        <!-- バリデーションエラーの表示 -->
        @include('common.errors')

        <!-- 新タスクフォーム -->
        <form action="{{ url('task') }}" method="POST" class="form-horizontal">
            {{ csrf_field() }}

            <!-- タスク名 -->
            <div class="form-group">
                <label for="task" class="col-sm-3 control-label">Tasks</label>

                <div class="col-sm-6">
                    <input type="text" name="name" id="task-name" class="form-control">
                </div>
            </div>

            <!-- タスク追加ボタン -->
            <div class="form-group">
                <div class="col-sm-offset-3 col-sm-6">
                    <button type="submit" class="btn btn-default">
                        <i class="fa fa-plus"></i> Create Task
                    </button>
                </div>
            </div>
        </form>
    </div>

    <!-- TODO: 現在のタスク -->
@endsection

@extendsディレクティブ:resources/views/layouts/app.blade.phpに定義したレイアウトを使用する
@section('content')から@endsectionの間のコンテンツ:app.blade.phpレイアウトの中の@yield('content')ディレクティブの場所に挿入される
@include('common.errors'):resources/views/common/errors.blade.phpに設置されているテンプレートをロードする

タスク追加の機能を足す前に/ルートの表示確認がしたいので、
resources/views/common/errors.blade.phpを定義する。

内容はチュートリアルに記載のものとする。

@if (count($errors) > 0)
    <!-- Form Error List -->
    <div class="alert alert-danger">
        <strong>Error! !</strong>

        <br><br>

        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

ここまでを行い一度表示を確認する。
その1.JPG

表示された!(Bootstrap CSSの定形コードを省いているので、表示はダサいが致し方なし。。。)

かなり長くなりそうなので、タスク追加と削除は次記事でまとめる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした