Laravel5.2インストールから画面表示・DB登録・簡単なバリデーションまで。

はじめに

なんとなく、CakePHPから離れてみたくなったような?で、最近のPHPのMVCフレームワークのトレンドはLaravelが急上昇中だとか。たわむれてみてから採用する候補にするのか決めていこうかなと。
公式ではなんとなく気に入らない部分もあるのでそこは書き換えてますのでご了承を。
公式にあるベーシックタスクリスト(データの一覧表示・追加・削除)ができるくらいの内容です。
クライアント環境:Windows10 XAMPP(PHP7.0.4) Eclipse 4.5.2(Mars) Laravel5.2.32
サーバ環境:CentOS7 MariaDB5.5.47

セットアップ

LaravelインストーラーをComposerでインストールする。
コマンドプロンプトを起動して、以下のコマンドを実行する。
composer global require "laravel/installer"
「C:\%HOMEPATH%\AppData\Roaming\Composer\vendor\bin」にインストールされます。
パスを通すと便利かもですが、私はやめときます。。。
とりあえず、laravelコマンドが動くか確認しておきます。
>CD /d C:\%HOMEPATH%\AppData\Roaming\Composer\vendor\bin
>laravel
Laravel Installer version 1.3.3

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help  Displays help for a command
  list  Lists commands
  new   Create a new Laravel application.
インストーラーは動いた!
「laravel new blog」と打ち込むと、blogプロジェクトができるらしい。
>CD /d C:\%HOMEPATH%\AppData\Roaming\Composer\vendor\bin
>laravel new blog
Crafting application...
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
  - Installing jakub-onderka/php-console-color (0.1)
    Downloading: 100%

  - Installing vlucas/phpdotenv (v2.2.1)
    Downloading: 100%
<<<省略>>>
「C:\%HOMEPATH%\AppData\Roaming\Composer\vendor\bin」の中に「blog」ディレクトリが出来上がって、その中に色々なファイルが出来上がってますね。
まぁこんなところにあったもしょうがないので、XAMPPの「htdocs」に「blog」以下のファイルたちを「laravel_trial」移動します。
この状態で、なんか表示されるかなと思って、ブラウザを立ち上げて「http://localhost/laravel_trial/」 アクセスしてみます。

あれ?
いろいろと調べてみると「public」がDocumentRootっぽいですね。
改めて、「http://localhost/laravel_trial/public/」にアクセスすると、表示されました。

本番機のApache先生はちゃんと「public」をDocumentRootに設定してあげないといけませんね。

Databaseの接続先設定

設定ファイルらしき「/config/database.php」があるのですが、これではなかったです。
「/.env」ファイルを編集します。
(なんとなくこんなファイルに書かれているのはイヤやし、設定ファイルあるやん!なので、また今度考える。)
環境に合わせてDB_HOSTなどを変更します。

マイグレーション

tasksテーブルを作ります。
コマンドプロンプトを起動して以下を実行する。
(プロジェクトのルートディレクトリに移動しておく)
>php artisan make:migration create_tasks_table --create=tasks
Created Migration: 2016_05_20_022441_create_tasks_table
「/database/migrations/YYYY_MM_DD_XXXXXX_create_tasks_table.php」ができる。
(「YYYY_MM_DD_XXXXXX」には実行した日時が入ると思う。)
「/database/migrations/YYYY_MM_DD_XXXXXX_create_tasks_table.php」を編集する。
<?php

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::drop('tasks');
        }
}

コマンドプロンプトを起動して以下を実行します。

(プロジェクトのルートディレクトリに移動しておく)
>php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2016_05_20_022441_create_tasks_table

データベースを見てみると、4つテーブルが出来上がります。

まぁいらないテーブルもあるけど、たわむれなんでとりあえず置いときます・・・

モデルの追加

コマンドプロンプトを起動して以下を実行します。
>php artisan make:model Task
Model created successfully.

「app/Task.php」が出来上がる。今回は、親のModelの機能しか使わないので、編集しない。

ルーティング

公式ではルーティングに処理を書いていく感じですが、コントローラ側に処理を記載するようにします。
(ルーティングにガシガシ処理を書いて便利なこともあるだろうけど、ビューだけ返すのならいいけど、それ以外はコントローラに記載するので。)
「app/Http/routes.php」
// Task list
Route::get('/task', 'TaskController@get');

// Add New Task
Route::post('/task', 'TaskController@add');

// Delete Task
Route::delete('/task/{task}', 'TaskController@delete');
get(一覧表示)、post(追加)、delete(削除)の3つを追加します。

コントローラ

「app/Http/Controllers/TaskController.php」
<?php

namespace App\Http\Controllers;

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

class TaskController extends Controller
{
    /// 一覧
    public function get() {
        $tasks = Task::orderBy('created_at', 'asc')->get();
        return view('tasks', [
                'tasks' => $tasks
        ]);
    }

    /// 追加
    public function add(Request $request) {
        // エラー発生時は「task/」にリダイレクトされる。
        $this->validate($request, [
                'name' => 'required|max:5',
        ]);

        $task = new Task;
        $task->name = $request->name;
        $task->save();

        return redirect('/task');
    }

    /// 削除
    public function delete(Task $task) {
        $task->delete();
        return redirect('/task');
    }

}

ビュー

ベースレイアウト「resources/views/layouts/app.blade.php」

<!DOCTYPE html>
<html>
    <head>
        <title>Laravel Quickstart - Basic</title>
    </head>

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

タスク一覧ビュー「resources/views/tasks.blade.php」

@extends('layouts.app')
@section('content')

    <!-- エラー表示 -->
    @include('common.errors')

    <!-- タスク追加フォーム -->
    <form action="{{ url('task') }}" method="POST">
        {{ csrf_field() }}
        Task<input type="text" name="name" id="task-name">
        <button type="submit">Add Task</button>
    </form>

    <!-- タスク一覧 -->
    @if (count($tasks) > 0)
        <table>
            <thead>
                <tr>
                    <th>Task</th>
                    <th></th>
                </tr>
            </thead>

            <tbody>
            @foreach ($tasks as $task)
                <tr>
                    <td>{{ $task->name }}</td>
                    <td>
                        <form action="{{ url('task/'.$task->id) }}" method="POST">
                                {{ csrf_field() }}
                                {{ method_field('DELETE') }}
                                <button type="submit">Delete</button>
                        </form>
                    </td>
                </tr>
            @endforeach
            </tbody>
        </table>
    @endif
@endsection

バリデーションでのエラー表示ビュー「resources/views/common/errors.blade.php」

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

        <br><br>

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

ブラウザで「http://localhost/laravel_trial/public/task」にアクセスすると、追加や一覧表示、削除ができるようになると思います。