Laravel10のmake:controllerで用意されている各typeを見てみる

# Laravel10のmake:contorller

Laravel10では
```
$ php artisan make:controller
```
とコントローラ名を入力せずに`make:controller`コマンドを打つと、
```
  What should the controller be named?
❯
```
という案内が表示されてコントローラー名を受け付け、さらに
```
  Which type of controller would you like: [empty]
  empty ........................................... 0
  api ............................................. 1
  invokable ....................................... 2
  resource ........................................ 3
  singleton ....................................... 4 
```
と、作ろうとしているコントローラーのある程度のひな形を用意してくれてそうです。

各ひな形がどんなものか見ていきます。

# empty
```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class EmptyController extends Controller
{
    //
}
```
空っぽですね。`Illuminate\Http\Request`があらかじめインポートされているくらいです。

# api
apiを選ぶと追加でモデルを聞かれました。
```
  What model should this api controller be for? [none]
❯ 
```
今回は`User`モデルを指定しました。
```php
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class ApiController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(User $user)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, User $user)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(User $user)
    {
        //
    }
}
```
指定した`App\Models\User`がインポートされ、よくあるCRUDの各メソッドが空っぽで作成されています。`show`、`update`、`destroy`ではAPIのパスにidが含まれているであろうことからルートモデルバインディングで取得されるはずの`User`が引数に加えられています。
[APIリソースルート](https://readouble.com/laravel/10.x/ja/controllers.html#api-resource-routes)で指定するコントローラーのひな形のようです。

# invokable
```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class InvokableController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function __invoke(Request $request)
    {
        //
    }
}
```
`__invoke`メソッドがあらかじめ作られています。
[シングルアクションコントローラー](https://readouble.com/laravel/10.x/ja/controllers.html#single-action-controllers)のひな形のようです。

# resource
resourceを選ぶと追加でさらにモデルを聞かれたので、`User`を指定しました。
```php
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class ResourceController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(User $user)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(User $user)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, User $user)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(User $user)
    {
        //
    }
}
```
apiと似ていますが、`create`と`edit`が増えています。
[リソースコントローラー](https://readouble.com/laravel/10.x/ja/controllers.html#resource-controllers)のひな形のようです。

# singleton
```php
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class SingletonController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(User $user)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(User $user)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, User $user)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(User $user)
    {
        //
    }
}
```
[シングルトンリソースコントローラー](https://readouble.com/laravel/10.x/ja/controllers.html#singleton-resource-controllers)のひな形のようですが、ルートモデルバインディングが無いので引数になっている`User`はどこから来るのかよくわからないです。あと`create`が何故かあります。