RGameShow
@RGameShow
В поисках ответов на глупые вопросы

Как правильно делать маршруты в Laravel 8 конкретных страниц из Базы данных?

Изучаю сейчас Laravel, начал с 8 версии, во многих курсах все делают примитивные вещи, создают главную страницу и страницу постов. А как делать конкретные страницы по типу site.ru/about/, не говорят.

Так вот вопрос, есть в базе таблица со страницами, у каждой страницы есть SLUG, при запросе в роутер передается SLUG далее в контроллере я проверяю по базе есть ли такая страница, если есть я вывожу, если нет отправляю на 404, это сделано для того чтобы я не писал руками в роуты каждый раз типа /about/, /about2/, /about3/ .... /about9999/.

Правильно ли я понял реализацию? Если нет подскажите как правильно...

web.php
Route::get('/{page:slug}', 'PageController@show')->name('page.single')->middleware('shortcode');


PageController.php
class PageController extends Controller
{
    public function index()
    {

        $data = Page::with('layout')->where('slug', 'home-page')->firstOrFail();
        $data->views += 1;
        $data->update();
        $data['thumbnail_url'] = $data->getImage();
        return view(
            "front.pages.{$data->layout->tpl}",
            compact('data'));
    }
    public function show($slug)
    {
        if ($slug === 'home-page'){
            return Redirect::route('home');
        }
        $data = Page::where('slug', $slug)->firstOrFail();
        $data->views += 1;
        $data->update();
        return view(
            "front.pages.{$data->layout->tpl}",
            compact('data'));
    }
}
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Ну, в целом всё выглядит верным, если хочется именно так сделать.

По мелочи:
  • Вы в роуте указываете байндинг модели, но не используете его в контроллере.
  • Оба метода можно объединить в один, сделав 'home-page' дефолтным значением. Редиректить можно тогда, когда запрос пришёл явно на /home-page, а кода будет меньше.
  • В запросе with() имеет смысл указывать когда речь про коллекцию, для одного элемента разницы не будет. Собственно, у вас из-за задвоения кода в одном методе жадная загрузка указана, а в другом нет и всё работает тем не менее.
  • $data->increment('views'), если хотите, чтобы у вас правильно статистика считалась.
  • Почему у вас объект модели Page сохраняется в переменную с неинформативным названием $data?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jazzus
Данная реализация от страницы постов вообще ничем не отличается. Тот же метод show ресурса Page. Правильно делать так.

Route::get('/pages/{page:slug}', 'PageController@show')->name('pages.show');

public function show(Page $page)
{
    $page->increment('views');

    return view('page.show', compact('page'));
}


А как делать конкретные страницы по типу site.ru/about/, не говорят.

Такие страницы не сохраняют в бд, если не из админки.
Route::view('about', 'page.about')->name('about');
И в шаблоне все ручками.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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