Моя индексная / целевая / домашняя страница отображает все изображения из моей таблицы изображений с новейшими отправленными вверху. Думаю добавить фильтрацию по:
Добавление элементов <a> с URL-адресами типа www.domain.com/hot и www.domain.com/trending.
Создание моего домашнего маршрута Route::get('/', 'PagesController@index')->name('home'); с дополнительным параметром, например Route::get('/{filter?}', 'PagesController@index')->name('home');
На основе необязательного параметра я отправлю в представление другую переменную $ images:
public function index($filter){
if ($filter == 'hot') {
$images = hot images;
} else if ($filter == 'trending') {
$images = get trending images;
} else {
$images = Image::orderBy('created_at', 'desc')->get();
}
return view('home', ['images' => $images]);
}
Я не использовал реальный код для получения горячих и популярных изображений, так как я еще не понял, как определить, являются ли изображения популярными или популярными, но вы поняли суть.
Это правильный способ создания фильтрации? Есть ли лучшие способы сделать это?






Возможно, вы захотите использовать оператор switch, чтобы все было красиво и аккуратно.
switch($filter) {
case 'hot' : $images = hot images;break;
case 'trending': $images = get trending images;break;
default : $images = Image::orderBy('created_at', 'desc')->get();
}
Если вы хотите сделать его более управляемым, вы можете выбрать массив, в котором вспомогательный код ищет правильный метод для вызова с помощью метода $object->{variable with string}() для динамического доступа к этой функции.
Когда вы добавляете новые элементы в массив, вам нужно только сделать, например, метод предоставления и запись массива 'newest' => 'getNewestImages',.
private $image_getters = [
'hot' => 'getHotImages',
'trending' => 'getTrendingImages',
];
public function index($filter)
{
$images = $this->getImages();
return view('home', ['images' => $images]);
}
protected function getImages($filter)
{
if (array_key_exists($filter, $this->image_getters)) {
$getter = $this->image_getters[$filter];
$images = $this->{$getter}();
}
else {
$images = Image::orderBy('created_at', 'desc')->get();
}
return $images;
}
Но кроме этого, это правильный способ добиться этого?
@Bobimaru Я добавил пример того, как я бы сделал это, чтобы все было управляемо, с помощью только одного массива для обновления, если есть новый получатель.
оператор переключения было бы лучше