Вы можете создать глобальные области видимости, как предлагалось ранее, однако, если это просто используется в качестве единственного экземпляра, то я бы, вероятно, go для чего-то вроде этого:
Route::get('user/{type?}', function ($name) {
//point to your controller
})->where('type', 'museum|fortress');
И затем в вашем контроллер, который, конечно, назовите, что вы хотите ..
function genericSharedFunction($type){
$totalCount = User::sum('count_'.$type);
$lastVisit = User::orderBy('last_visit_'.$type, 'DESC')->first('last_visit_'.$type);
$topFiveUsers = User::whereNotNull(['count_'.$type, 'last_visit_'.$type])
->orderBy('count_'.$type, 'DESC')
->orderBy('last_visit_'.$type, 'DESC')
->get(['id', 'count_'.$type, 'last_visit_'.$type])
->take(5);
$last_visit_prop = 'last_visit_'.$type;
return response()->json([
"$type" => [
"total_count" => $totalCount,
"last_visited" => $lastVisit->$last_visit_prop,
"users" => $topFiveUsers
]
]);
}