Я создаю свое первое приложение Laravel с использованием 5.1, это сайт электронной торговли.
Я начал с создания «статических» страниц. Я цитирую, потому что страницы не динамически генерируются из списков продуктов и т. Д., Но html все еще извлекается из базы данных.
Я создал PagesController
, модель pages/index.blade.php
, pages/index.blade.php
и pages/show.blade.php
, а также MasterTemplate.blade.php
шаблона MasterTemplate.blade.php
.
Мои routes.php
выглядят так:
$router->get('/', [ 'uses' => 'PagesController@index', 'as' => 'pages.index' ]); $router->get('/{page}', [ 'uses' => 'PagesController@show', 'as' => 'pages.show' ]);
Это отлично работает, я могу просмотреть индекс и отдельные страницы, находящиеся в БД.
Моя проблема возникает, когда я добавляю навигацию. Поскольку я планирую использовать две разные панели навигации (один для пользователя, один для админов), я решил создать файл _navDefault.php
для включения в MasterTemplate
.
Извлекая избыточный html, он выглядит так:
@foreach ($pages as $page) <li>{!! link_to_route('pages.show', $page->title, [$page->slug]) !!}</li> @endforeach
Это создает ссылки очень хорошо, и они работают. Но поскольку мой PagesController
:
... public function index() { $pages = $this->page->get(); return view('pages.index', compact('pages')); } ...
$pages
существует только в представлении index
, и поэтому переход к представлению show
дает мне ошибку, что $pages
не определено, что имеет смысл.
Я мог бы определить $pages
в методе show
, но у меня также будут другие контроллеры, такие как ProductController
и CartController
которые будут иметь свои собственные страницы, которые мне понадобятся в панели навигации, и я не могу включить в него $pages
, $products
, и $cart
в каждом index
и метод show
для каждого контроллера.
Я все еще довольно новичок в MVC, поэтому я не уверен в лучшем способе справиться с этим, с навигационным контроллером / моделью или чем-то еще.
Каков правильный способ создания динамических навигационных панелей с использованием нескольких контроллеров?
Вот как я могу использовать динамический навигатор везде в своем приложении.
Протестируйте следующее в методе boot
AppServiceProvider
:
View::composer('*', function($view) { $view->with('pages', Page::all()); });
*
Означает, что все представления получат $pages
.
Теперь вы можете извлечь его поставщику услуг, предназначенному для просмотра композиторов.
Если бы я правильно понял ваш вопрос, вам нужно создать частичный вид для вашей навигации и использовать композитор представления, чтобы убедиться, что частичный вид имеет правильные данные.
документы
[edit] Это мой проект, и я всегда готов за его вклад в github.
Доступен пакет поддержки Laravel 5.4 для создания динамического, управляемого базой данных, Bootstrap, Drop Down Menu.
https://github.com/secrethash/dropmenu
Установите его, используя:
composer require secrethash/dropmenu
Применение:
use Dropmenu; class SampleController extends Controller { public function index() { $menu = Dropmenu:: display('menuName'); return view('some.view', ['menu' => $menu]); } }
ИЛИ просто используйте его в шаблоне клинка
@extends('demoLayout') @section('menu') {!! Dropmenu:: display('menuName') !!} @endsection
Полная документация: https://secrethash.github.io/dropmenu
Для Laravel 5.2
public function boot() { //I use categories in my case and call model category at start of this file view()->composer('*', function ($view) { $categories = Category::all(); $view->with('categories', $categories); }); }