Laravel, правильно ли так выводить страницы?

роут:

Route::get('/page/{url}', 'PageController@page')->where('url', '[a-z]+');

контроллер:

<?php

namespace App\Http\Controllers;

use App\Category;
use App\Page;
use Illuminate\Http\Request;
use DB;

class PageController extends Controller
{

    protected $category;
    protected $page;

    public function __construct()
    {
       // Коллекция всех категорий
      $this->category = Category::all();
      // Коллекция всех страниц
      $this->page = Page::all();
    }

    public function page($url) {
        $page_info = DB::select("select * from pages where url ='". $url ."'");
        $title = $page_info[0]->title;
        $description = $page_info[0]->description;
        $catalog = $this->category;
        $page = $this->page;

        return view('page', ['page' => $page, 'catalog' => $catalog, 'title' => $title, 'description' => $description]);
    }

}

вьюшка:

@extends('layout')

@section('content')
  <h1>{{$title}}</h1>
  <p>{{$description}}</p>
@endsection

Подскажите плиз, такой способ рабочий, НО что-то подсказывает что так делать нельзя (не профессионально). Может подскажите как лучше?


Ответы (1 шт):

Автор решения: E_K
  1. Используйте Eloquent или возможности Сервис контейнера, это куда проще и удобней.

    Если используете Laravel 7 можно сделать так.

    //Route.php
    Route::get('page/{page:slug}', 'PageController@show');
    
    |------------------------------------------------------------|
    
    //PageController.php
    public function show(Page $page)
    {
        return view('page', compact('page'));
    }
    
    |------------------------------------------------------------|
    
    //page.blade.php
    @section('content')
      <h1>{{$page->title}}</h1>
      <p>{{$page->description}}</p>
    @endsection
    
  2. Давайте осмысленные и запоминающиеся имена переменным и методам, у вас свойство $page вместо 1 страницы содержит коллекцию.
  3. Список всех страниц и категорий можно вынести View Composers или попробовать использовать новые компоненты

p.s. Посмотрите курсы от Laracast по Larvael.

→ Ссылка