[初学者]Laravelとは何か？Webサイトを作る流れを見て理解する

#この記事で何が分かるのか
view,controller,ルーティングとは何か
migration,seederのやり方
これらがどういう組み合わせで使われいるのか

以上について説明していきます。

#環境
<dl>
 <dt>想定する環境</dt>
 <dd>Ubuntu 18.4.6 (これはOracle VM VirtualBox上で動かしています)</dd>
 <dd>php 8.0.13</dd>
 <dd>Laravel 8.73.1</dd>
 <dd>MySQL 14.14</dd>
</dl>

今回はローカル環境で動かします。なおこれらがすでに構築されている前提で話を進めます。構築の仕方はすでに先駆者が記事をいっぱい残していると思うので探してみてください。

#viewファイルの作成
viewファイルとは、どのようにWebページとして表示するかが書かれている、いわゆるフロントエンドの処理方法を決めるファイルです。デフォルトではresources/viewにあり、welcome.blade.phpのみが存在していると思います。

<details><summary>bladeとは？</summary>
Laravelで使われているテンプレートエンジンのことです。これがあることで、特定のユーザーだけにデータを表示させるといったとき使える「if文」やひな形になるviewファイルを作り、それ違うviewファイルで一部内容を書き換えて使いまわすときに使える「継承」などの処理をviewファイルに記載できるようになります。ファイルの拡張子を.blade.phpとすることで使えます。</details>

ここのディレクトリにviewファイルを新規作成してみましょう。今回はindex.blade.phpとします。
これはコマンドで作れないので手動で作成してください。
作成したら次のように入力してみましょう。

```php:resources/view/index.blade.php
<h1>indexだよ</h1>
```

#Controllerの作成
Controllerとは、ルーティングで設定されて呼び出されたときに実行するプログラムが書かれているファイルです。ただ指定したviewファイルを表示させることもできますし、表示させたいviewファイルに渡してあげたい変数があればそれを準備してviewファイルと一緒に渡してあげることもできますし(例えば自分のアカウントの情報とか)、ユーザーに入力してもらったデータをMySQLに格納するといった処理もできます。デフォルトではapp/Http/Controllersに入ります。

では下記のコマンドを入力して Controller を作りましょう。

```terminal:terminal
$ php artisan make:controller TestController --resource
```

なお"--resource"は、書くとcreate()を始めとした7つのメソッドを一緒に自動的に生成してくれるオプションです。これは追加したり編集したり削除したりするもの(=リソース)に使うコントローラーを作成する際に使ってください。

それでは作成したTestControllerに中身を記述していきましょう。とりあえずindexメソッドのみ記述していきます。

```php:app/Http/Controllers/TestController.php
~~
public function index()
    {
        return view('index');
    }
~~
```

これでTestControllerのindexメソッドが呼び出されるとindex.blade.phpが呼び出されこのviewファイルに書かれている内容が表示されるようになりました。

#ルーティングの設定
ルーティングとは、クライアントから要求されたURLに対してどういう処理をするか定義することです。デフォルトではroute/web.phpに書くことになります。具体的に見ていきましょう。

```php:route/web.php
~~
Route::get('/home', [App\Http\Controllers\TestController::class, 'index']);
~~
```

このように記述することで、/homeに対してhttpリクエストメソッドであるgetメソッドを使ってリクエストされるとTestControllerのindexメソッドを実行するようになります。TestControllerのindexメソッドにはindex.blade.phpを表示させるように記述されているので、ようやくこれで指定したURLにアクセスするとwebページが表示される一連の流れが完成しました。ターミナルで

```terminal:terminal
$ php artisan serve
```

と入力してhttp://localhost:8000/index にアクセスしてみてください。「indexだよ」と表示されていると思います。
これが基本となるのでぜひ覚えてください。ちなみにctrl+cでサーバーを閉じることができます。

#migrationをしてみよう
Webページにいろいろなデータを表示させたい場合、controllerでデータベースから値を取得してviewファイルに渡してあげる…などが考えられますが、このデータベースを構築するにはどうすればいいでしょうか。
このときlaravelの重要な機能としてmigrationというものがあり、これを使うことでデータベースにテーブルを作成できます。
テーブルを作成するならMySQLに直でコマンド打てばいいじゃんと思うかもしれないですが、これを使うメリットとして、gitなどを使って複数人で開発するときに簡単に共通のDBを構築できる(DBはローカルにしか保存しないので)、やり直しの際にmigrationコマンドをもう一度実行すればいいだけになる、そもそもmigrationでのデータベース操作の方が楽、といったことが挙げられます。
それでは実際にmigrationファイルを作成していきましょう。ターミナルで

```terminal:terminal
$ php artisan make:migration create_users_table --create=users
```

と入力してください。database/migrations配下にxxxx_xx_xx_xxxxxx_create_users_table.phpが作られたと思います。ちなみにこのように"--create=(変数名)"オプションを利用すると雛形が作られるようになります。

作られたファイルを開くと

```php:database/migrations/xxxx_xx_xx_xxxxxx_create_users_table.php
<?php

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

class User extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->timestamps();
            });      
    }

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

のようになっていると思います。このようにcreate_tableにおけるmigrationファイルにはテーブル作成時の挙動がup関数に、テーブル削除時の挙動がdown関数に記述されています。これを少し書き換えてusersテーブルにカラムを追加していきましょう。

```php:database/migrations/xxxx_xx_xx_xxxxxx_create_users_table.php
~~
public function up()
    {
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->string('email');
                $table->timestamps();
            });      
    }
~~
```

書き換えたらmigrateしていきましょう。ターミナルで

```terminal:terminal
$ php artisan migrate
```

と入力することでmigrateが実行されます。これでテーブルが作られました。MySQLに入って\dコマンド等で確認してみてください。

#seedしてみよう
seedとはテーブルにレコードを挿入する機能です。これを用いることで、デフォルトで入れておきたいデータをあらかじめ挿入することやテストデータを簡単に挿入することができます。デフォルトではdatabase/seedersの中に入ります。
それではseederファイルを作ってみましょう。ターミナルで

```terminal:terminal
$ php artisan make:seeder UserTableSeeder
```

と入力することでseederファイルが作られます。作られたファイルを開いて

```php:database/seeders/UserTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->truncate();//テーブルの中身の初期化をしている
        $user = [
            [
            'name' => 'test',
            'email' => 'test@example.com',
            ]
        ];
        DB::table('users')->insert($user);
    }
}
```

と書き換えましょう。書き換えたらseederファイルを実行していきます。ターミナルで

```terminal:terminal
$ php artisan db:seed --class=UserTableSeeder
```

と入力することでこのseederファイルが実行されます。これでダミーデータが入ったので、MySQLに入って"SELECT * FROM users;"等で確認してみてください。

#controllerからviewに値を受け渡す
実際にcontrollerからviewに値を引き渡す流れを確認しましょう。TestControllerを書き換えてMySQLから値を取得しviewに渡すようにします。

```php:app/Http/Controllers/TestController.php
~~
public function index()
    {
        $users = DB::table('users')
            ->select('id', 'name', 'email')
            ->get();
        return view('index', compact('users'));
    }
~~
```

このように、viewファイルにDBから受け取った値を渡すときはcompactメソッドを使うということが分かると思います。なお今回はDBを操作する方法としてDBファザードを利用していますが他の方法としてモデルクラスを利用する方法もあります。詳しくは[こちら](https://readouble.com/laravel/8.x/ja/eloquent.html)を参照してください。
それではviewにこのデータを表示させるよう記述します。

```resources/view/index.blade.php
<h1>index</h1>
<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>メールアドレス</th>
</tr>
@foreach($users as $user)
<tr>
<td>{{$user->id}}</td>
<td>{{$user->name}}</td>
<td>{{$user->email}}</td>
</tr>
@endforeach
</table>
```

これによってviewにDBのデータが表示されるようになりました。ターミナルで

```terminal:terminal
$ php artisan serve
```

と入力してhttp://localhost:8000/index にアクセスして確認してみてください。

#まとめ
ここまででWebページを表示させる一連の流れとデータベースの利用方法が分かったと思います。ここでは書かなかったさらに重要な要素としてモデルやミドルウェアあたりがあります(自分があんまりわからないから書かなかった)。ミドルウェアを使うことでユーザー登録の際のメール認証やログ出力などができるようになるらしい。余裕がある人は調べてみてください。