LoginSignup
3
6

More than 3 years have passed since last update.

モデル結合ルートを使えば冗長な処理を書かなくてもオッケー

Posted at

いいこと

役割を分担させることで、Fatにならない。
ソースコードがスッキリするだけじゃなく、テストもしやすい。

Before

Route::get('/user/{name}', 'UserController');
class UserController extends Controller
{
    public function __invoke(string $name)
    {
        $user = User::where('name', $name)->first();
        if (empty($user)) {
            abort(404);
        }

        return view('users.index')->with(compact('user'));
    }
}

After

ルーティングの引数はモデルと同じ名前にする。

Route::get('/user/{user}', 'UserController');

モデルに必要な処理を追加する。

class User extends Authenticatable
{
    protected $fillable = [
        'name',
        'email',
        // ...
    ];

    /**
     * モデルのルートキーの取得
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'name';
    }

    /**
     * 結合値のモデル取得
     *
     * @param  mixed  $value
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function resolveRouteBinding($value)
    {
        return $this->where('name', $value)->first() ?? abort(404);
    }
}
class UserController extends Controller
{
    public function __invoke(User $user)
    {
        return view('users.index')->with(compact('user')); // これだけ!
    }
}

参考

公式ドキュメントをみるのだ!
https://readouble.com/laravel/5.7/ja/routing.html#%E3%83%A2%E3%83%87%E3%83%AB%E7%B5%90%E5%90%88%E3%83%AB%E3%83%BC%E3%83%88

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6