Убрать дубли 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 в базе, а именной роут поможет с редиректом без лишнего кода.

→ Ссылка