Laravel 5.5 入門として「基本のタスクリスト」を作成する [その1]

Laravel公式にあるクイックスタートは2017年9月現在では古く、Laravel 5.5ではディレクトリ構造が異なっているなどして、スムーズに進められません。

他の良いチュートリアルとして、Laravel 5.2までドキュメントに含まれている「基本のタスクリスト」があります。

そこでこの記事では、Laravelに入門する方を対象に、そのチュートリアルをLaravel 5.5で行う方法を順を追って紹介します。

記事は次の3回に別れており、本記事は1つ目の記事です。

 

なお、本記事中のLaravelドキュメントへのリンクは、有志の方が作成している日本語訳へリンクしています。

翻訳を公開してくださっている川瀬裕久さんに感謝です。

 

チュートリアルでは、次の画像のような、タスクリストの機能を持つWebアプリを作成します。

 

以下の説明はMacOS Sierra環境で、データベースにはmysqlを使います。

前準備

composer

composer をインストールしていない場合は、brewなどでインストールします。

brew install homebrew/php/composer

 

mysql

mysqlが入っていない場合には、インストールします。

$ brew install mysql

続いて、一時的にmysqlを実行する場合には、次のコマンドでmysqlを起動。

$ mysql.server start

あるいは、サービスとして実行する場合には、次のコマンドでmysqlをサービスとして登録。

$ brew services start mysql
$ brew services list

2行目で、正しく登録されたか確認できます。

 

次にチュートリアル用のデータベース”homestead”を作成します。

デフォルトでルートパスワードなしで登録されていますから、次のコマンドでmysqlに接続できます。

$ mysql -uroot

次のSQLコマンドでデータベースを作ります。

mysql> create database homestead;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| homestead          |
+--------------------+

mysql> show tables from homestead;
Empty set (0.00 sec)

mysql> exit
Bye

データベースの中身は空のままで構いません。

 

なお、データベースを削除するには、

drop database <データベース名>;

を使います。

Laravelをインストール

次のコマンドで、Laravelフレームワークをインストールします。

create-projectは、git cloneやsvn checkoutを行った後、composer installをするのと同じです。

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

すると実行パスの下に、quickstartディレクトリが作成され、そこにLaravelがインストールされます。

ディレクトリ名は任意で、quickstart以外でも構いません。–prefer-distオプションは、安定版やリリース版を優先的に選択します。

 

artisanコマンドでlaravelのバージョンを確認しておきます。

$ cd quickstart
$ php artisan --version
Laravel Framework 5.5.3

artisanはアーティザンと読みます。職人という意味です。ルートディレクトリに配置されているphpプログラムであり、開発で役立つコマンドを提供しています。

データベースの設定

次にデータベースの設定をします。

コンフィグファイル

quickstart/.env

を編集します。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

となっている部分のユーザー名とパスワードを、自らの環境に合うように次のように変更します。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=null

テーブルの定義

本アプリケーション「基本のタスクリスト」では、タスク情報はデータベースにテーブルを作成して保存することにします。

Laravelには、定義ファイルを元にしてテーブルを作成する機能があります。

定義ファイルを作っておけば、php artisan migrationというコマンドをひとつ打つだけで、データベースにテーブルが作成されます。

これにより、アプリケーションをインストールするたびに管理者が直接データベースを操作する必要がなくなります。

定義ファイルを使用して、初期テーブルをデータベースに作成することをマイグレーション(migration: 移住)と言います。

 

まずは定義ファイルのテンプレートを作成しましょう。

Laravelでは、artisanのmakeコマンドでマイグレーションファイルのテンプレートを生成させることができます。

次のコマンドで、新しいtasksテーブルを作成するcreate_tasks_tableマイグレーションファイルが作成されます。

$ php artisan make:migration create_tasks_table --create=tasks
Created Migration: 2017_09_14_042531_create_tasks_table

create_tasks_tableはマイグレーションファイル名で、–createオプションではテーブル名を指定します。

詳しいコマンドの使用方法やオプションの意味については、次のようにhelpを使うと参照できます。

php artisan help make:migration

あとで説明しますが、ここでのテーブル名は複数形にしておくと良いでしょう。

database/migration以下に、2017_09_14_042531_create_tasks_table.phpが作成されます。

作成日時が付加されますが、マイグレーションを実行した際には日時の順にマイグレートされます。

ファイルを眺めてみると、up関数でtasksテーブルが作成されることが分かります。tasksテーブルには、主キーとしてid(自動インクリメント)は定義済みです。

 

ここで、タスク名もテーブルに保存できるように、ファイルに一行を追加して、nameというstring型のカラムを定義します。

<?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->increments('id');
	    $table->string('name'); /* <---- */
            $table->timestamps();
        });
    }

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

このマイグレーションファイルを用いて、マイグレーションをします。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrating: 2017_09_14_042531_create_tasks_table
Migrated: 2017_09_14_042531_create_tasks_table

テーブルが作成されたか確認するため、データベースに接続してみましょう。

mysql> show tables from homestead;
+---------------------+
| Tables_in_homestead |
+---------------------+
| migrations          |
| password_resets     |
| tasks               |
| users               |
+---------------------+
4 rows in set (0.00 sec)

mysql> desc homestead.tasks;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra        |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)     | NO   |     | NULL    |   
             |
| created_at | timestamp        | YES  |     | NULL    |   
             |
| updated_at | timestamp        | YES  |     | NULL    |   
             |
+------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from homestead.tasks;
Empty set (0.00 sec)

確かにtasksテーブルが作成され、nameカラムが作成されています。

データモデルの定義

Laravelでは、データベースとのデータのやりとりはEloquent object-relational mapper(ORM)という機能を介して行います。

Eloquentを使うことで、データベースとのやり取りが楽になります。

ここでは、Eloquentを介して扱うデータを、モデルとして定義します。

 

では、Taskモデルを定義しましょう。

モデル定義ファイルのテンプレートも、artisanで作成できます。

$ php artisan make:model Task
Model created successfully.

次のような空のTaskクラスを持つapp/Task.phpが作成されます。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
 //
}

これは空のクラスのままでこれ以上いじる必要がありません。

このクラスでは、データベースとの対応は明示的に定義していませんが、その場合にはクラス名を複数形(かつスネークケース)にした”tasks”テーブルと対応させられることになります。

これがテーブル名を複数形にした理由です。

 

ちなみに、Taskモデルの定義で -mオプションをつけて、「php artisan make:model Task -m」とすると、対応するtasksテーブルを作成するマイグレーションファイルも同時に作成されます。

今回はマイグレーションファイルは前項で別途作成しましたが、慣れた場合はこちらの方法でも良いでしょう。

routeの定義

ユーザがURLにアクセスした場合に定義された処理(Webページを表示する、タスクを登録するなど)が実行されますが、そのURLのことをroute(ルート)と呼びます。

Laravel 5.5では、routes/web.phpで定義されています。(Laravel 5.2ではapp/Http/routes.phpで定義されていました。)

 

web.phpを編集して、次の3つのルートを作成します。

  • 全タスクをリスト表示するルート
  • 新しいタスクを追加するルート
  • 既存のタスクを削除するルート

ひとまず無名関数は空にしておきます。

<?php

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

Route::get('/', function () {
 //
});

Route::post('/task', function (Request $request) {
 //
});

Route::delete('/task/{task}', function (Task $task) {
 //
});

Routeのget(), post()メソッドは、それぞれGET, POSTで送られてきたデータを扱います。

DELETEのリクエストは送られて来ませんが、ここではdeleteとしておきます。Laravelに、POSTリクエストをDELETEリクエストとして見せかける方法があり、後ほどその処理を記述します。

ここまでの確認

ここまで、次の作業を行いました。

  • アプリケーションで使用する空のデータベースhomesteadを作成
  • タスクを保存するTasksテーブルをマイグレーションファイルに定義
  • マイグレーション
  • 空のTaskモデルを定義
  • 3つの空のルートを作成

ここまで作成したものを動作させてみましょう。次のコマンドで簡易httpサーバーを立てる事ができます。

php artisan serve

ブラウザで、http://localhost:8000/へアクセスしてみます。

すると、’/’のルートが呼ばれますが、まだ空ですので、空のページが返ってくるはずです。

 

この後も作成を続けますが、その都度ページを確認するようにすると、完成度合いがわかりやすくて良いでしょう。

 

以上、Laravel 5.5 入門として「基本のタスクリスト」を作成する [その1]でした。

次の記事へ続きます。

Laravel 5.5 入門として「基本のタスクリスト」を作成する [その2]

 

PHPフレームワーク Laravel入門