root09
@root09

Как правильно сделать ЧПУ на laravel?

Сейчас страницы идут такого вида: /watch/1
Нужно добавить slug в адрес страницы, т.е что бы было как-то так: /watch/1-slug

И тут есть несколько вопросов:
Нужно ли делать (для сео?) что бы при заходе на /watch/1 перекидывало 301 редиректом на /watch/1-slug?
Нужно ли делать (для сео?) что бы при заходе на /watch/1-рандомная-строка перекидывало 301 редиректом на /watch/1-slug?

Как правильно сделать это в самом laravel?
Сейчас я сделал так:
Route::get('/watch/{id}-{slug}', 'WatchController@get');

public function get($id, $slug)
{
        $watch = Watch::findOrFail($id);
        if ($slug != $watch->slug)
            return redirect('/watch/'.$watch->id.'-'.$watch->slug, 301);
}


Но есть две проблемы:
При заходе на /watch/1 выкидывает 404 ошибку
При заходе на /watch/1- выкидывает 404 ошибку
Как правильно сделать?
  • Вопрос задан
  • 2332 просмотра
Решения вопроса 2
@Yan-s
С точки зрения SEO редирект делается чтобы не было дублей. Если у вас не используется "/watch/1" и отдает не дубль страницы "/watch/1-slug", а 404, то всё ок и ничего больше не нужно.

Сделал бы просто по slug, но есть одинаковые названия, поэтому добавил еше id

Вероятно лучше будет уникализировать slug
Ответ написан
@iljaGolubev
Laravel 5.6
https://laravel.com/docs/5.6/routing#implicit-binding
В модель добавить 2 метода
// это для формирования верного url через хелпер
public function getRouteKey()
{
    return "{$this->id}-{$this->slug}";
}

public function resolveRouteBinding($value)
{
    $keys = explode('-', $value);
    return Watch::where(['id'=>$keys[0], 'slug'=>$keys[1]])
}

Роут будет
Route::get('/watch/{fullSlug}', 'WatchController@get');

Контроллер
public function get(Watch $fullSlug)
{
        // fullSlug обязательно существует или 404 ещё до входа в контроллер
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Arik
1. что мешает всю строку сделать как slug и уже в контроллере парсить или отдать модели чтоб она сама решила что с таким slug делать?
2. да, лучше делать переадресацию на нужный УРЛ, т.е. если вы знаете id, то спросите модель текущий УРЛ равен или нет
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы