いいこと
役割を分担させることで、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