Правильный способ сделать динамическую навигацию в Laravel 5

Я создаю свое первое приложение 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); }); }