Убрать дубли URL в Ларавел
Только начинаю пробовать Лару и вот вопрос. У меня есть контроллер, который показывает одну новость
Route::get('/news/{id}-{alias}', [App\Http\Controllers\NewsController::class, 'getOne'])->where(['id' => '[0-9]+', 'alias' => '(.*)']);
Но статья будет доступна по адресам
/news/688-virus
/news/688-viru
/news/688-vir и т.д.
Как сделать чтобы все эти варианты приводили к переадресации на единственно верный
/news/688-virus
Т.е. если после /news/ есть ID и такой ID реально есть в базе, была переадресация на /news/id-реальный_алиас_данного_ID
Ответы (1 шт):
Автор решения: Ded Dram
→ Ссылка
Делаем именной роут
Route::get('/news/{id}-{alias?}', [App\Http\Controllers\NewsController::class, 'getOne'])->where(['id' => '[0-9]+', 'alias' => '(\w+|-){1,40}'])->name('OneNews');
Делаем модель нужной таблицы, подключаем ее в контроллере
use App\Models\News;
И сам метод контроллера будет выглядеть так
public function getOne($id, $alias = null)
{
$newsOne = News::findOrFail($id);
if ($newsOne->alias !== $alias) {
return redirect(route('OneNews', ['id' => $id, 'alias' => $newsOne->alias]));
}
return view('news_one', ['newsOne' => $newsOne]);
}
Метод findOrFail позволит получать 404 ошибку при отсутствии ID в базе, а именной роут поможет с редиректом без лишнего кода.