最新版 Laravel 5.7向け チュートリアル

Laravelの講義をする機会があったのですが、チュートリアルが古かったので最新に合わせたもの+ほとんどコピペなので私なりに考えた追加実習とGitHub及び本番環境に上げるまでです。

初心者は5時間、中級者は1時間半程度で出来る内容となっております。

Laravalはドキュメントが豊富なので書籍がなくても学習の幅はかなり広いと思います。
まずはタスクリストから作成しましょう。

- 準備するもの
 - Unix環境 8000ポートは開けておくこと
 - MySQL 出来れば5.7.9以降 `charset=utf8mb4`推薦

# チュートリアル

## 基本のタスクリスト

https://readouble.com/laravel/5.1/ja/quickstart.html

まずはインストールしてきたら、`.env`をコピーしてMySQLの設定をしましょう。

```
$ composer create-project laravel/laravel quickstart --prefer-dist
$ cd quickstart
$ cp .env.example .env
$ php artisan key:generate
```

```:.env
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=xxxxxxxx
DB_USERNAME=xxxxxxxx
DB_PASSWORD=xxxxxxxx
```

```
$ php artisan migrate
```

`php artisan serve`コマンドで[http://127.0.0.1:8000](http://127.0.0.1:8000)にLaravel初期画面が表示されます。

```
$ php artisan serve
```

以下、チュートリアルで詰まるところや違いのあるところを書いていきます。

Routingの設定が最新バージョンだと`app/Http/routes.php`ではなく`routes/web.php`で定義します。`welcome.blade.php`を表示するように設定してあるので、コメントアウトしておきましょう。

```php:routes/web.php
use App\Task;
use Illuminate\Http\Request;

/*Route::get('/', function () {
    return view('welcome');
});*/

Route::get('/', function () {
    $tasks = Task::orderBy('tasks.created_at', 'asc')->get();

    return view('tasks', [
        'tasks' => $tasks
    ]);
});

...
```

```
$ php artisan serve
```

MySQLの設定が`charset=utf8`の場合、
`[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes`と表示されます。
[Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する](https://qiita.com/beer_geek/items/6e4264db142745ea666f)の記事を参照に、MySQLのバージョン上げるか、`my.cnf`を`charset=utf8mb4`に修正するか、`app/Providers/AppServiceProvider.php`を修正しましょう。
編集が終わったら途中までマイグレーションされてしまっているのでマイグレーション実行前にテーブルを削除しましょう。念の為`php artisan config:cache`も実行しておくと良いかと思います。
`app/Providers/AppServiceProvider.php`を修正した場合、`routes/web.php`のValidatorも変更しましょう。
<font color="red">エラーが出なかった場合は対応不要です。</font>

```php:routes/web.php
Route::post('/task', function (Request $request) {

    $validator = Validator::make($request->all(), [
        //'name' => 'required|max:255',
        'name' => 'required|max:191',
    ]);

    ...

}

...
```

チュートリアルのCSS部分はだいぶ端折ってあります。`resources/views/layouts/app.blade.php`は追加実習の`php artisan make:auth`で自動生成できるので、一旦おいておきましょう。`resources/views/tasks.blade.php`は以下の`<div>`を足しておくと、追加実習時に見た目が良くなります。

```html:resources/views/layouts/app.blade.php
    ...

    <!-- CSSとJavaScript -->

    ...

    <!-- ナビバーの内容 -->

    ...
```

```html:resources/views/tasks.blade.php
    ...

    <!-- Bootstrapの定形コード -->
    <div class="container">
        <div class="col-sm-offset-2 col-sm-8">
            <div class="panel panel-default">
                <div class="panel-body">

                    ...

                </div>
            </div>
        </div>
    </div>

    ...
```

チュートリアルは終了です。無事動いているでしょうか？

# 追加実習

ほぼコピペで終わってしまいました。物足りないと思うので自分の頭で考えて作ってみましょう。

## ユーザ登録・認証の実装

LaravelのAuthはコマンドでも実装できます。以下のURLを参考に作成しましょう。
https://readouble.com/laravel/5.7/ja/authentication.html

## タスクの登録・削除時に認証設定

ログインしていないとタスクの登録・削除が出来ないにしましょう。
上記URLより、認証済みユーザーの取得の項を参考に、`Auth::check()`が`false`の時はログインページに遷移するようにしましょう。

## 投稿ユーザ名表示

タスクを登録したときにユーザIDも登録するようにしましょう。
まずはDBマイグレーションを実施しtaskテーブルのカラムを増やしてみましょう。

```
$ php artisan make:migration add_user_id_to_tasks_table --table=tasks
```

```php:database/migrations/xxxxxxxx_add_user_id_to_tasks_table.php
    ...

    public function up()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->integer('user_id')->after('name');
        });
    }

    ...

    public function down()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->dropColumn('user_id');
        });
    }

    ...
```

```
$ php artisan migrate
```

次に、登録時にAuthのユーザIDを取得し、登録するようにします。以下のURLを参考に作成しましょう。
https://readouble.com/laravel/5.7/ja/queries.html

次に、一覧表示の時にユーザ名・登録日時を表示します。
ルーティングとビューをいじって実装してみましょう。
`tasks`と`users`の`id`と`name`が被ってしまうため、`select()`関数を使い別名を付けること、`leftJoin()`関数を使えば二つのテーブルからデータを取得できます。


## タスクの変更の実装

変更ボタンを作成します。
`Route::put('/task/{id}', ~~~)`を作成し、タスクの内容を変更できるようにしましょう。
新しいページで入力する、`resources/views/tasks.blade.php`を改造し横にフォームを表示する、どちらでもよいです。

```php:routes/web.php
...

Route::put('/task/{id}', function (Request $request, $id) {
    if (!Auth::check()) {
        return redirect('/login');
    }
    $user = Auth::user();

    $validator = Validator::make($request->all(), [
        'name' => 'required|max:255',
    ]);

    if ($validator->fails()) {
        return redirect('/')
            ->withInput()
            ->withErrors($validator);
    }

    $task = Task::where('id', $id)->first();
    $task->name = $request->name;
    $task->user_id = $user->id;
    $task->save();

    return redirect('/');
});

...
```

## GitHub

[GitHub](https://github.com/)に新規のリポジトリ`quickstart`(名称は何でも良いです)を作成し、先ほど作成したLaravelプロジェクトをプッシュしましょう。

```
touch README.md
git init
git add .
git commit -m 'first commit'
git remote add origin git@github.com:xxxxxxxx/quickstart.git
git push -u origin master
```

## 本番環境にデプロイ

[HerokuCLIを使ってLaravel+Mysqlを本番にデプロイ](https://qiita.com/33yuki/items/5c1910e259ff4e6498db)の記事を参考に、無料のサーバー[Heroku](https://dashboard.heroku.com/)を使って本番環境にあげてみましょう。

- 設定する環境変数
 - APP_DEBUG=false
 - APP_ENV=production
 - APP_NAME=xxxxxxxx
 - APP_KEY=xxxxxxxx
 - DB_CONNECTION=mysql
 - DB_HOST=xxxxxxxx
 - DB_DATABASE=xxxxxxxx
 - DB_USERNAME=xxxxxxxx
 - DB_PASSWORD=xxxxxxxx

## 終わりに

無事本番アップロードまで出来たでしょうか？
変更・削除が自分でなくても出来てしまうなどの欠点もあるので、いろいろと模索して編集してみてください。
お疲れ様でした:relaxed: