Laravel6.xでよく使うコマンド一覧　〜マイグレーションからモデルやコントローラそしてフォームリクエスト作成まで〜


# 個人的によく使うコマンドの使用例

コマンド一覧を見てもオプション関係がゴッチャになるので、定型文的によく使うLaravelのコマンドをメモ。
バージョンはLaravel 6.x です。最近リリースされた7では確認していませんが、確認が取れたらまた更新します。

### マイグレーション関連
#### Composerのオートローダを再生成

```php

composer dump-autoload
```

シーダクラスを作成した後などは、Composerのオートローダを再生成するためにこちらのコマンドを実行する必要があります。

```php:マイグレーションのエラー
// コマンド例
$ php artisan migrate:fresh --seed

// （中略）エラー内容
Illuminate\Contracts\Container\BindingResolutionException  : Target class [Product] does not exist.
```
例えば上記のような、シーディングやマイグレーション時にデータベースのエラーが出るときは大体このコマンドを忘れているパターンが多いです。
DatabaseSeeder.phpに該当のSeederクラスは登録したし、クラス名やファイル名にも間違いがないのに、ターゲットとなるクラスが存在しませんよというエラーになっています。
gitからdevelopやmasterなどリモートブランチの変更をpullしてきて、マイグレーションファイルに変更があった際などにも同様のエラーになりがちです。
```composer dump-autoload``` のコマンドを打たなくてもエラーにならない場合もあり、例えば元々あったシーダーを編集してシーディングし直した場合は必要なさそうでした。

#### マイグレーションファイルの作成

```php
php artisan make:migration create_users_table --table=users
```

オプションを付加しながらマイグレーションファイルの作成。```--table=```の後にテーブル名を記載します。
コマンドを実行した日時によって、例えば下記のように、 ```年_月_日_時間＋指定した名前``` といったファイル名でマイグレーションファイルは作成されます。
```2020_02_19_155441_create_users_table.php```

テーブル作成だけでなく、「カラムの修正」や「外部キーの設定」とか、操作したい内容によって　```modify_colmn_type_user_id_on_users.php``` や ```add_foreign_keys_to_users_table```など、わかりやすい名前にすると良いかと思います。

#### シーダーファイルの作成

```php
php artisan make:seeder UsersTableSeeder
```

データベースにテストデータを流し込むための入れ物を作ります。
今回の場合はUsersテーブル用のシーダーということになります。
テーブル名は各自で適切なものを設定してください。

#### マイグレーションのやり直しと同時にシーディング

```php
php artisan migrate:fresh --seed
```

今あるテーブルを全ドロップしてテーブルを作り直し、DatabaseSeeder.phpに登録されたシーダーを同時に実行します。

`php artisan migrate:refresh` などでエラーになったときは、この `php artisan migrate:fresh` で解消することもあります。

#### シーディングのみ実行

```php
php artisan db:seed
```

マイグレーションとは別にDatabaseSeeder.phpに登録されたシーディングだけ実行したいときはこちらのコマンドを打ちます。

#### 特定のシーダー、クラスのシーディングのみ実行

```php
php artisan db:seed --class=UsersTableSeeder
```

DatabaseSeeder.phpに登録していないものや、登録はしたが個別にシーダーを実行したいという際に使用します。
```--class=```の後にシーダーのクラス名を指定すればOKです。

### フォームリクエスト関連
#### リクエスト作成
フォームリクエストは要するにバリデーションに使用するもので、コントローラなどにリクエストで送られた値が入ってくる前にいろいろバリデーションでさばいた結果のものをリクエストとして送ってくれるので、コントローラとバリデーションを分離することができます。
コントローラをスカスカのペラッペラにしたい人は特に使うと良いでしょう。

```php
php artisan make:request UserRequest
```

リクエストの名前は何でも良いです。
公式では ```php artisan make:request StoreBlogPost```
のような名前がサンプルとして掲載されていますが、自分はそれが何であるか分かりやすくするために ```XxxRequest``` のような命名を好んで使います。

### モデル・コントローラ関連
#### モデル作成

```php
php artisan make:model User
```

モデルを作ります。通常Laravelでは、テーブル名は複数形、モデル名はテーブル名の単数形とします。

```php
php artisan make:model Models/User
```
モデルを /app/Models/以下など別なディレクトリにまとめたいときはこのように書きます。

#### モデルと同時にコントローラ作成

```php
php artisan make:controller UserController
```

コントローラを作ります。こちらもテーブル名の単数形が良いです。
指定した名前でコントローラが作成され、今回の場合は```UserController.php```というファイル名になります。

```php
php artisan make:controller UserController --model=Models/User
```

モデルも一緒に作成したい場合は後ろにオプションを付けて作成可能です。
```--model=User```とすればappディレクトリ配下にUser.phpのモデル用ファイルができますが、モデル用のディレクトリを切って管理したい場合などは ```--model=Models/User``` とすればapp/Modelsのディレクトリ配下にモデルが作成されます。


```php
php artisan make:controller UserController --resource
```

自分でイチからfunctionを書かなくても、最初からCRUD処理用のメソッドをpublic functionとして最初に用意しておいてくれるのが上記のように `--resource` のオプションを付けた場合です。
これらは下記のように繋げて書くことで一度に実行できます。

```php
php artisan make:controller UserController --resource --model=Models/User
```

`--resource` のオプションを付けた場合は、公式のドキュメントにあるように、下記のルートに紐づけられるメソッドが入れ物として用意されていますので、メソッドの内容は開発時に適宜上書きしていきます。

```php
 動詞       | URI                  | アクション | ルート名
------------------------------------------------------------------
 GET       | /photos              | index   | photos.index
 GET       | /photos/create       | create  | photos.create
 POST      | /photos              | store   | photos.store
 GET       | /photos/{photo}      | show    | photos.show
 GET       | /photos/{photo}/edit | edit    | photos.edit
 PUT/PATCH | /photos/{photo}      | update  | photos.update
 DELETE    | /photos/{photo}      | destroy | photos.destroy
```



このリソースフルな状態でコントローラを作成すれば、下記のようにルートを定義すれば1行ですべてをまかなえます。

```php:web.php
Route::resource('photos', 'PhotoController');
```

ただ自分はすべてのリソースを使う必要がなく、URL(URI)も`/photos/{photo}/edit`等から変更したいということも多く、割と従来通りに自分でルートの定義はしていたりします。

今日はいったんそんな感じです。


#### 参考URL
■マイグレーション -> [Laravel 6.x データベース：マイグレーション](https://readouble.com/laravel/6.x/ja/migrations.html)
■シーディング -> [Laravel 6.x データベース：シーディング](https://readouble.com/laravel/6.x/ja/seeding.html)
■モデル -> [Laravel 6.x Eloquent：利用の開始](https://readouble.com/laravel/6.x/ja/eloquent.html)
■コントローラ -> [Laravel 6.x コントローラ](https://readouble.com/laravel/6.x/ja/controllers.html)
■フォームリクエスト -> [Laravel 6.x バリデーション](https://readouble.com/laravel/6.x/ja/validation.html)