laravel5を試してみる(メモ)


4.2から移行するの辛そうなので無視したかったけどそろそろ試してみる。
とりあえずDBからデータ読んで画面表示まででゴールとする。

## install

とりあえずla5testという名前にする。

```bash
composer create-project laravel/laravel la5test --prefer-dist
```

### 動作確認
laravel５を動かすのに必要なモジュールが入ってれば以下のような画面が見える

あと自分はlaravel4の開発環境が入っているので上記コマンドだけで問題無く動きました。

![スクリーンショット 2015-04-16 14.05.03.png](https://qiita-image-store.s3.amazonaws.com/0/14914/8ac4824a-5e9c-face-f30b-6a2af91f1c48.png "スクリーンショット 2015-04-16 14.05.03.png")



## 動かすまでの設定

### DB作成

今回は「la5test」というDBにする
ちなみにデフォルトのDBはmysqlになってます。

```bash
config/database.php
```

mysqlに接続して

```bash
create database la5test default character set utf8;
```

#### .envの修正

```
DB_HOST=localhost
DB_DATABASE=la5test
DB_USERNAME=hoge
DB_PASSWORD=hogehoge
```

### modelを作成

taskというmodelとtableを作成する。

```
php artisan make:model Task
```

上記を実行すると「app/」直下に「Task.php」が生成されます。
また「database/migrations/2015_04_16_031841_create_tasks_table.php」こんな感じで
migrateファイルも作成されます。

「app/」直下が嫌ならディレクトリ指定も可能です。

```
php artisan make:model models/Task
```

#### 中身を書き換えてテーブルを作成

```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('title');
            $table->text('body');
            $table->timestamps();
        });
    }

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

}
```

##### migrate実行

```bash
php artisan migrate
```

##### DBを確認

```bash
mysql> show tables;
+-------------------+
| Tables_in_la5test |
+-------------------+
| migrations        |
| password_resets   |
| tasks             |
| users             |
+-------------------+
```

認証用のmigrationファイルがデフォルトで存在してたのでusersとかできてました。

とりあえず「tasks」ができてたのでOK

### controller作成

```
php artisan make:controller TaskController
```

### view作成

```
resources/views
```

上記、配下に「tasks」を作成。

```
resources/views/home.blade.php
```

をコピーして

```
resources/views/tasks/index.blade.php
```

を作成した

### routingの設定

app/Http/routes.phpを修正

```app/Http/routes.php
Route::resource('task', 'TaskController');
```

上記を追加。

#### 確認する

```bash
$ php artisan route:list

+--------+--------------------------------+-------------------------------------------------------+--------------+------------------------------------------------------------+------------+
| Domain | Method                         | URI                                                   | Name         | Action                                                     | Middleware |
+--------+--------------------------------+-------------------------------------------------------+--------------+------------------------------------------------------------+------------+
|        | GET|HEAD                       | /                                                     |              | App\Http\Controllers\WelcomeController@index               | guest      |
|        | GET|HEAD                       | home                                                  |              | App\Http\Controllers\HomeController@index                  | auth       |
|        | GET|HEAD                       | task                                                  | task.index   | App\Http\Controllers\TaskController@index                  |            |
|        | GET|HEAD                       | task/create                                           | task.create  | App\Http\Controllers\TaskController@create                 |            |
|        | POST                           | task                                                  | task.store   | App\Http\Controllers\TaskController@store                  |            |
|        | GET|HEAD                       | task/{task}                                           | task.show    | App\Http\Controllers\TaskController@show                   |            |
|        | GET|HEAD                       | task/{task}/edit                                      | task.edit    | App\Http\Controllers\TaskController@edit                   |            |
|        | PUT                            | task/{task}                                           | task.update  | App\Http\Controllers\TaskController@update                 |            |
|        | PATCH                          | task/{task}                                           |              | App\Http\Controllers\TaskController@update                 |            |
|        | DELETE                         | task/{task}                                           | task.destroy | App\Http\Controllers\TaskController@destroy                |            |
|        | GET|HEAD                       | auth/register/{one?}/{two?}/{three?}/{four?}/{five?}  |              | App\Http\Controllers\Auth\AuthController@getRegister       | guest      |
|        | POST                           | auth/register/{one?}/{two?}/{three?}/{four?}/{five?}  |              | App\Http\Controllers\Auth\AuthController@postRegister      | guest      |
|        | GET|HEAD                       | auth/login/{one?}/{two?}/{three?}/{four?}/{five?}     |              | App\Http\Controllers\Auth\AuthController@getLogin          | guest      |
|        | POST                           | auth/login/{one?}/{two?}/{three?}/{four?}/{five?}     |              | App\Http\Controllers\Auth\AuthController@postLogin         | guest      |
|        | GET|HEAD                       | auth/logout/{one?}/{two?}/{three?}/{four?}/{five?}    |              | App\Http\Controllers\Auth\AuthController@getLogout         |            |
|        | GET|HEAD|POST|PUT|PATCH|DELETE | auth/{_missing}                                       |              | App\Http\Controllers\Auth\AuthController@missingMethod     | guest      |
|        | GET|HEAD                       | password/email/{one?}/{two?}/{three?}/{four?}/{five?} |              | App\Http\Controllers\Auth\PasswordController@getEmail      | guest      |
|        | POST                           | password/email/{one?}/{two?}/{three?}/{four?}/{five?} |              | App\Http\Controllers\Auth\PasswordController@postEmail     | guest      |
|        | GET|HEAD                       | password/reset/{one?}/{two?}/{three?}/{four?}/{five?} |              | App\Http\Controllers\Auth\PasswordController@getReset      | guest      |
|        | POST                           | password/reset/{one?}/{two?}/{three?}/{four?}/{five?} |              | App\Http\Controllers\Auth\PasswordController@postReset     | guest      |
|        | GET|HEAD|POST|PUT|PATCH|DELETE | password/{_missing}                                   |              | App\Http\Controllers\Auth\PasswordController@missingMethod | guest      |
+--------+--------------------------------+-------------------------------------------------------+--------------+------------------------------------------------------------+------------+
```

taskが登録されていることが確認できた。

### アクセス

```bash
http://localhost/task
```

上記にアクセスしてみる

![スクリーンショット 2015-04-16 14.08.38.png](https://qiita-image-store.s3.amazonaws.com/0/14914/5b6bae97-8cd4-35e1-5e06-9e736db1568f.png "スクリーンショット 2015-04-16 14.08.38.png")

まだmodelを使ってないけど画面の表示ができた。

### modelを使う。

先ほど作成したmodelからデータを取得して表示する用に修正する。

#### 対話式(tinker)でデータを登録

formを作成するのが面倒なので対話式でデータを登録します

```bash
php artisan tinker
```

上記コマンドでlaravelと対話式でコマンド入力が可能です。

```bash
>>> $task = App::make('\App\Task');
=> <App\Task #000000003956511c000000011e1b911e> {}
>>> $task->title = 'test title';
=> "test title"
>>> $task->body = '本文です';
=> "本文です"
>>> $task->save();
=> true
>>> $task->all();
=> <Illuminate\Database\Eloquent\Collection #0000000039565101000000011e1b911e> [
       <App\Task #00000000395651f1000000011e1b911e> {
           id: 1,
           title: "test title",
           body: "本文です",
           created_at: "2015-04-16 06:30:57",
           updated_at: "2015-04-16 06:30:57"
       }
   ]
>>>
```

これでとりあえずtasksテーブルに１件のデータが登録されました。

同じように操作して２件くらい登録します。


#### controllerの修正

```php
<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Task;

use Illuminate\Http\Request;

class TaskController extends Controller {

    protected $tasks;

    public function __construct(Task $tasks)
    {
        $this->tasks = $tasks;
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $tasks = $this->tasks->all();
        return view('tasks.index', ['tasks' => $tasks]);
    }
```

useを追加とTaskモデルからデータを参照してviewに渡すように変更してます。

```
use App\Task;
```

これ↑

あとviewも受け取ったデータを表示するように修正する

```
@extends('app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-10 col-md-offset-1">
            <div class="panel panel-default">
                <div class="panel-heading">Task List</div>

                <div class="panel-body">
                    <ul class="list-group">
                        @foreach ($tasks as $task)
                            <li class="list-group-item">{{$task->title}}</li>
                        @endforeach
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
```

ブラウザでアクセスする。

![スクリーンショット 2015-04-16 16.27.08.png](https://qiita-image-store.s3.amazonaws.com/0/14914/adeab823-7cf7-7c58-5db7-c3444fe69fd3.png "スクリーンショット 2015-04-16 16.27.08.png")

DBからデータ取得して表示された！

### 参考サイト

http://readouble.com/laravel/5/0/0/ja/
http://blog.asial.co.jp/1360
http://qiita.com/fluke8259/items/13efc59526f193a28012

## 気づいたこと

2015/04/16時点ではartisanコマンドの「--env」が効かないっぽい。

```bash
php artisan migrate --env=testing

php artisan key:generate --env=testing
```

とりあえず上記２つはlocal環境に反映されてしまった。

長くなったのでここまで。