За последние 24 часа нас посетили 18926 программистов и 1606 роботов. Сейчас ищут 1185 программистов ...

Как настроить отображение 3 моделей по 1 роуту

Тема в разделе "Laravel", создана пользователем DmitriyLutsenko, 20 апр 2022.

Метки:
  1. DmitriyLutsenko

    DmitriyLutsenko Новичок

    С нами с:
    20 апр 2022
    Сообщения:
    5
    Симпатии:
    1
    Здравствуйте.

    Я в процессе создания учебного проекта на Laravel 8, и мне нужна консультация.
    Подскажите, пожалуйста, как правильно настроить отображение нескольких моделей на определенном роуте?
    Конкретно на примере:

    главная страница имеет роут "/".

    По этому роуту работает контроллер HomeController@home
    Там требуется вывести:
    • Слайдер (буду использовать модель Slider)
    • Отзывы (Модель Reviews)
    • Товары (Модель Products)
    Напрашивается такой способ:
    PHP:
    1. class HomeController {
    2. public static function home () {
    3. $menu = new Menu()::all();
    4. $banner = new Banner()::all();
    5. /*....*/
    6. return view('front.home')->with(compact($menu, $banner))->name('home');
    7. }
    8. }
    Правильно ли?

    Момент 2-й:

    Динамическое меню для шапки и подвала (Используется модель Menu с созданием своих пунктов).
    Соответственно выводиться это меню должно через основной слой (welcome.blade.php).
    Как в этом случае посоветуете поступить?
     
  2. DmitriyLutsenko

    DmitriyLutsenko Новичок

    С нами с:
    20 апр 2022
    Сообщения:
    5
    Симпатии:
    1
    Я дополню свой топик:
    Я планирую сделать сайт с динамическим контентом. То есть, с настраиваемым из-под админки контентом, а именно:
    • меню(поля id, название пункта, ссылка у пункта). Создаю Модель и ресурсный контроллер для Menu.
    • Слайдер для главной страницы. Поля id, активность, ссылка баннера, хранимое изображение и приоритет показа. Создал Ресурсный контроллер и Модель.
    • Отзывы на главную страницу.
    и тд.

    Главную страницу будет обрабатывать контроллер HomeController.

    Его код:
    PHP:
    1. <?php
    2.  
    3. namespace App\Http\Controllers;
    4.  
    5. use Illuminate\Http\Request;
    6. use App\Models\Reviews;
    7. use App\Models\Sliders;
    8.  
    9.  
    10. class HomeController extends Controller
    11. {
    12.     public function home () {
    13.        
    14.         $reviews = Reviews::orderBy('created_at','desc')
    15.         ->take(10)
    16.         ->get();
    17.  
    18.         $sliders = Sliders::orderBy('created_at','desc')
    19.         ->get();
    20.  
    21.         return view('front.main.home', [ 'reviews'=>$reviews, 'sliders' => $sliders ]);
    22.     }
    23. }
    В web.php для роутинга я указываю обработчик маршрута:
    PHP:
    1. Route::get('/', [HomeController::class, 'home']);
    В blade шаблоне для главной страницы использую секции @hasSection с проверкой существования передаваемых через контроллер ассоциативных массивов.
    В целом тут вопросов нет.

    Но вот есть динамический контент Меню.

    Оно вызывается в шапке и футере любой страницы. Можно ли его как-то вызывать через родительский слой (layout.blade.php)?

    Или в каждом контроллере придется получать и передавать меню в шаблон-наследник (по аналогии с HomeController)?

    Я хочу научиться делать правильные вещи сразу, поэтому и прошу у опытных специалистов совета.
     
  3. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    к сожалению друг я тут попик дублировался я удалил старый все удалилось.
    Странно настроено не замечал раньше такого.
    Создай норм модели через модели заведи контроллер через коппакт пропиши их обращайся к ним к 3м.
    Сразу что не соображу а что слайдеры уже через базу данных делают.
    Вроде там HTML справляется на кройняк JS, это какой то мега слайдер для всех типа виджета.
    В принципе у меня есть сейчас время могу пообщаться онлайн над темой вашего проекта, данные для связи передайте для того же телеграмма.
    Вот это отвал совместить контроллер маршрутизатором -
    return view('front.home')->with(compact($menu, $banner))->name('home');
    Это что такое ваще?
    with(compact($menu,$banner))
    очень странный реквест очень удивляет
    он так работает вообще а если работает зачем это писать все.
    Может есть такие возможности я хз так логично вроде бы но все очень странно.
     
    #3 Павел Голубцов, 23 апр 2022
    Последнее редактирование: 23 апр 2022
  4. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    return view('front.main.home' - когда вы успели из ничего создать замысловатую структуру из 2х вложенных папок?
    Это вы засунули файл в 2е директории front.main
    нам как не крути получается 2х уровневая модель у вас уже 3х уровневая, возможно нужно иногда вынести на 3й уровень у вас в начале 3 й
    со временем если будет развиваться сами не найдете а другие тем более.
     
    #4 Павел Голубцов, 23 апр 2022
    Последнее редактирование: 23 апр 2022
  5. DmitriyLutsenko

    DmitriyLutsenko Новичок

    С нами с:
    20 апр 2022
    Сообщения:
    5
    Симпатии:
    1
    Спасибо за замечание к структуре папок: я создаю front и back сайта, поэтому, чтобы не запутаться, была введена 3-х уровневая архитектура шаблона.

    Я хочу сделать слайдер управляемым через админ-панель (приоритет показа, время показа, активный слайд или нет и тп). На многих сайтах получение картинок для галерей и слайдеров происходит через БД.

    Что касается моего вопроса. Ответом послужил Компонент.

    PHP:
    1. <?php
    2.  
    3. namespace App\View\Components;
    4.  
    5. use Illuminate\View\Component;
    6. use App\Models\Menu;
    7.  
    8. class MainMenu extends Component
    9. {
    10.     /**
    11.      * Create a new component instance.
    12.      *
    13.      * @return void
    14.      */
    15.     public $menu;
    16.     public function __construct()
    17.     {
    18.         $this->menu = Menu::where('active', 'Y')->orderby('priority', 'asc')->get();
    19.     }
    20.  
    21.     /**
    22.      * Get the view / contents that represent the component.
    23.      *
    24.      * @return \Illuminate\Contracts\View\View|\Closure|string
    25.      */
    26.     public function render()
    27.     {
    28.         return view('front.menu.main-menu');
    29.     }
    30. }
    А в моем непосредственном родительском шаблоне front.layout я прописал в шапке вызов компонента
    HTML:
    1. <x-main-menu></x-main-menu>
     
    mkramer нравится это.
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Приятно, когда люди находят ответы в документации.