Здравствуйте. Я в процессе создания учебного проекта на Laravel 8, и мне нужна консультация. Подскажите, пожалуйста, как правильно настроить отображение нескольких моделей на определенном роуте? Конкретно на примере: главная страница имеет роут "/". По этому роуту работает контроллер HomeController@home Там требуется вывести: Слайдер (буду использовать модель Slider) Отзывы (Модель Reviews) Товары (Модель Products) Напрашивается такой способ: PHP: class HomeController { public static function home () { $menu = new Menu()::all(); $banner = new Banner()::all(); /*....*/ return view('front.home')->with(compact($menu, $banner))->name('home'); } } Правильно ли? Момент 2-й: Динамическое меню для шапки и подвала (Используется модель Menu с созданием своих пунктов). Соответственно выводиться это меню должно через основной слой (welcome.blade.php). Как в этом случае посоветуете поступить?
Я дополню свой топик: Я планирую сделать сайт с динамическим контентом. То есть, с настраиваемым из-под админки контентом, а именно: меню(поля id, название пункта, ссылка у пункта). Создаю Модель и ресурсный контроллер для Menu. Слайдер для главной страницы. Поля id, активность, ссылка баннера, хранимое изображение и приоритет показа. Создал Ресурсный контроллер и Модель. Отзывы на главную страницу. и тд. Главную страницу будет обрабатывать контроллер HomeController. Его код: PHP: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Reviews; use App\Models\Sliders; class HomeController extends Controller { public function home () { $reviews = Reviews::orderBy('created_at','desc') ->take(10) ->get(); $sliders = Sliders::orderBy('created_at','desc') ->get(); return view('front.main.home', [ 'reviews'=>$reviews, 'sliders' => $sliders ]); } } В web.php для роутинга я указываю обработчик маршрута: PHP: Route::get('/', [HomeController::class, 'home']); В blade шаблоне для главной страницы использую секции @hasSection с проверкой существования передаваемых через контроллер ассоциативных массивов. В целом тут вопросов нет. Но вот есть динамический контент Меню. Оно вызывается в шапке и футере любой страницы. Можно ли его как-то вызывать через родительский слой (layout.blade.php)? Или в каждом контроллере придется получать и передавать меню в шаблон-наследник (по аналогии с HomeController)? Я хочу научиться делать правильные вещи сразу, поэтому и прошу у опытных специалистов совета.
к сожалению друг я тут попик дублировался я удалил старый все удалилось. Странно настроено не замечал раньше такого. Создай норм модели через модели заведи контроллер через коппакт пропиши их обращайся к ним к 3м. Сразу что не соображу а что слайдеры уже через базу данных делают. Вроде там HTML справляется на кройняк JS, это какой то мега слайдер для всех типа виджета. В принципе у меня есть сейчас время могу пообщаться онлайн над темой вашего проекта, данные для связи передайте для того же телеграмма. Вот это отвал совместить контроллер маршрутизатором - return view('front.home')->with(compact($menu, $banner))->name('home'); Это что такое ваще? with(compact($menu,$banner)) очень странный реквест очень удивляет он так работает вообще а если работает зачем это писать все. Может есть такие возможности я хз так логично вроде бы но все очень странно.
return view('front.main.home' - когда вы успели из ничего создать замысловатую структуру из 2х вложенных папок? Это вы засунули файл в 2е директории front.main нам как не крути получается 2х уровневая модель у вас уже 3х уровневая, возможно нужно иногда вынести на 3й уровень у вас в начале 3 й со временем если будет развиваться сами не найдете а другие тем более.
Спасибо за замечание к структуре папок: я создаю front и back сайта, поэтому, чтобы не запутаться, была введена 3-х уровневая архитектура шаблона. Я хочу сделать слайдер управляемым через админ-панель (приоритет показа, время показа, активный слайд или нет и тп). На многих сайтах получение картинок для галерей и слайдеров происходит через БД. Что касается моего вопроса. Ответом послужил Компонент. PHP: <?php namespace App\View\Components; use Illuminate\View\Component; use App\Models\Menu; class MainMenu extends Component { /** * Create a new component instance. * * @return void */ public $menu; public function __construct() { $this->menu = Menu::where('active', 'Y')->orderby('priority', 'asc')->get(); } /** * Get the view / contents that represent the component. * * @return \Illuminate\Contracts\View\View|\Closure|string */ public function render() { return view('front.menu.main-menu'); } } А в моем непосредственном родительском шаблоне front.layout я прописал в шапке вызов компонента HTML: <x-main-menu></x-main-menu>