laravel ジェネレーター（ジェネレート）コマンドとスカフォールド

# 概要

- ジェネレーター（ジェネレート）コマンドとスカフォールドの違いについて簡単にまとめる。

# ジェネレーターコマンド

- 例

    ```shell
    php artisan make:controller FooController
    ```

- 単一のクラスなどを作ってくれるコマンドのこと。クラスが定義されているだけで特に中身はほぼ記載されていない。

# スカフォールド

- 例

    ```shell
    php artisan make:controller --resource FooController
    ```

- クラスの定義だけではなく、内容もある程度記載してくれたりする。`--resourece`オプションをつけるとRESTfulなメソッドがすでに定義されたコントローラーを作ってくれたりする。
- また`$ php artisan make:auth`を実行すると認証機能に必要なクラスをすべて作ってくれるなど、レイヤー（コントローラー、サービス、リポジトリなど）を横断して一つの機能を作ってくれるものもスカフォールドと呼ばれる。

# まとめ

- ジェネレーターコマンド： 単一のクラスが記載されたファイルを作成してくれる。
- スカフォールド： ある程度中身を自動記載してくれたり、レイヤーを横断してクラス定義と中身の記載をしてくれたりする。

# 付録

## `make:controller`のオプション（スカフォールド）

- 使いそうなものだけ簡単にまとめる。その他は`$ php artisan make:controller -h`を実行すればオプションを知ることができる。

### オプション --api

- 例

    ```shell
    php artisan make:controller --api FooController
    ```

- 生成されるコード（ディレクトリや名前空間は/apiや\apiにはならないので `php artisan make:controller --api api/FooController`とかで指定してあげる必要がある。）

    ```FooController.php
    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class FooController extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return \Illuminate\Http\Response
         */
        public function index()
        {
            //
        }
    
        /**
         * Store a newly created resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
        public function store(Request $request)
        {
            //
        }
    
        /**
         * Display the specified resource.
         *
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function show($id)
        {
            //
        }
    
        /**
         * Update the specified resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function update(Request $request, $id)
        {
            //
        }
    
        /**
         * Remove the specified resource from storage.
         *
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function destroy($id)
        {
            //
        }
    }
    ```

- returnの型がすべて`\Illuminate\Http\Response`で指定されている。

### オプション -i

- 例

    ```shell
    php artisan make:controller -i FooController
    ```

- 生成されるコード

    ```FooController.php
    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class FooController extends Controller
    {
        /**
         * Handle the incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
        public function __invoke(Request $request)
        {
            //
        }
    }
    ```

- シングルアクションコントローラー用のコントローラーを生成してくれる。
- 最初から__invokeメソッドが記載されている。

### オプション --model=

- 例(コマンド実行後にプロンプトでYES/NOを問われる) 

    ```shell
    php artisan make:controller --model=Foo FooController
    ```

- 生成されるコード
    - モデル

        ```Foo.php
        <?php
        
        namespace App;
        
        use Illuminate\Database\Eloquent\Model;
        
        class Foo extends Model
        {
            //
        }
        ```

    - コントローラー

        ```FooController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use App\Foo;
        use Illuminate\Http\Request;
        
        class FooController extends Controller
        {
            /**
             * Display a listing of the resource.
             *
             * @return \Illuminate\Http\Response
             */
            public function index()
            {
                //
            }
        
            /**
             * Show the form for creating a new resource.
             *
             * @return \Illuminate\Http\Response
             */
            public function create()
            {
                //
            }
        
            /**
             * Store a newly created resource in storage.
             *
             * @param  \Illuminate\Http\Request  $request
             * @return \Illuminate\Http\Response
             */
            public function store(Request $request)
            {
                //
            }
        
            /**
             * Display the specified resource.
             *
             * @param  \App\Foo  $foo
             * @return \Illuminate\Http\Response
             */
            public function show(Foo $foo)
            {
                //
            }
        
            /**
             * Show the form for editing the specified resource.
             *
             * @param  \App\Foo  $foo
             * @return \Illuminate\Http\Response
             */
            public function edit(Foo $foo)
            {
                //
            }
        
            /**
             * Update the specified resource in storage.
             *
             * @param  \Illuminate\Http\Request  $request
             * @param  \App\Foo  $foo
             * @return \Illuminate\Http\Response
             */
            public function update(Request $request, Foo $foo)
            {
                //
            }
        
            /**
             * Remove the specified resource from storage.
             *
             * @param  \App\Foo  $foo
             * @return \Illuminate\Http\Response
             */
            public function destroy(Foo $foo)
            {
                //
            }
        }
        ```

- 必要そうなメソッドがコントローラーに記載され、更にモデルクラスまで型指定されていたりする。（すごい、、、！）

### オプション -r

- 例

    ```shell
    php artisan make:controller -r FooController
    ```

- 生成されるコード

    ```FooController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        
        class FooController extends Controller
        {
            /**
             * Display a listing of the resource.
             *
             * @return \Illuminate\Http\Response
             */
            public function index()
            {
                //
            }
        
            /**
             * Show the form for creating a new resource.
             *
             * @return \Illuminate\Http\Response
             */
            public function create()
            {
                //
            }
        
            /**
             * Store a newly created resource in storage.
             *
             * @param  \Illuminate\Http\Request  $request
             * @return \Illuminate\Http\Response
             */
            public function store(Request $request)
            {
                //
            }
        
            /**
             * Display the specified resource.
             *
             * @param  int  $id
             * @return \Illuminate\Http\Response
             */
            public function show($id)
            {
                //
            }
        
            /**
             * Show the form for editing the specified resource.
             *
             * @param  int  $id
             * @return \Illuminate\Http\Response
             */
            public function edit($id)
            {
                //
            }
        
            /**
             * Update the specified resource in storage.
             *
             * @param  \Illuminate\Http\Request  $request
             * @param  int  $id
             * @return \Illuminate\Http\Response
             */
            public function update(Request $request, $id)
            {
                //
            }
        
            /**
             * Remove the specified resource from storage.
             *
             * @param  int  $id
             * @return \Illuminate\Http\Response
             */
            public function destroy($id)
            {
                //
            }
        }
    ```

- RESTfulなコントローラーで使いそうなメソッドが予め用意されている。

## `make:model`のオプション（スカフォールド）

### オプション　-a

- 例

    ```shell
    php artisan make:model -a Foo
    ```

- 生成されるコード
    - app/Foo.php（モデル）
    - app/Http/Controllers/FooController.php（コントローラー）
    - database/factories/FooFactory.php（ファクトリ）
    - database/migrations/YYYY_MM_DD_HHMMSS_create_foos_table.php（マイグレーション）
    - database/seeds/FooSeeder.php（シーダー）
- 要は必要なクラスを一式作ってくれる。

### オプション --api

- 例

    ```shell
    php artisan make:model --api Foo
    ```

- 生成されるコード
    - app/Foo.php（モデル）
    - app/Http/Controllers/FooController.php（コントローラー）
- モデルとコントローラーを生成する。
- コントローラーはAPIで使われることを想定した内容（`$ php artisan make:controller --api FooController`で生成するものと同じ）が作られる。

### オプション -r

- 例

    ```shell
    php artisan make:model -r Foo
    ```

- 生成されるコード
    - app/Foo.php（モデル）
    - app/Http/Controllers/FooController.php（コントローラー）
- モデルとコントローラーを生成する。
- RESTfulなコントローラーで使いそうなメソッド想定した内容（`$ php artisan make:controller -r FooController`で生成するものと同じ）が作られる。

### オプション -aと--apiや-rを指定することも可能

- 例（オプション -aと-r）

    ```shell
    php artisan make:model -ar Foo
    ```

- 例（オプション -aと--api）

    ```shell
    php artisan make:model -a --api Foo
    ```

- -aなのでモデル、コントローラー、ファクトリ、マイグレーション、シーダーが生成されることは変わらないが、コントローラーだけ指定した形式で生成される。
- ちなみにシングルアクションコントローラー生成オプションである-iは`make:model`には存在しないっぽい。