我正在使用5.1构建我的第一个Laravel应用程序,它是一个电子商务网站。
我从创建"静态"页面开始。我引用是因为页面不是从产品列表等动态生成的,但html仍然是从数据库中检索的。
我创建了一个PagesController
,一个Page
模型,pages/index.blade.php
和pages/show.blade.php
视图,以及一个MasterTemplate.blade.php
模板文件。
我的routes.php
看起来像:
$router->get('/', [
'uses' => 'PagesController@index',
'as' => 'pages.index'
]);
$router->get('/{page}', [
'uses' => 'PagesController@show',
'as' => 'pages.show'
]);
这工作得很好,我可以查看我的索引和单独的页面在DB。
当我去添加我的导航时出现了问题。因为我计划使用两个不同的导航条(一个用于用户,一个用于管理员),所以我选择创建一个_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
未定义,这是完全有意义的。
我可以在show
方法中定义$pages
,但我也将有其他控制器,如ProductController
和CartController
,它们将有自己的页面,我将在导航栏中需要,并且我不能很好地在每个控制器的每个index
和show
方法中包含$pages
, $products
和$cart
。
我仍然是相当新的MVC,所以我不确定最好的方法来处理这个,与导航控制器/模型或其他东西。
使用多个控制器实现动态导航条的正确方法是什么?
这就是我如何能够在我的应用程序的任何地方有我的动态导航栏。
在AppServiceProvider
的boot
方法中测试以下内容:
View::composer('*', function($view)
{
$view->with('pages', Page::all());
});
*
表示所有视图将接收$pages
。
你现在可以把它提取到一个专门用于视图作曲家的Service Provider。
如果我对你的问题理解正确的话,你需要为你的导航创建一个局部视图,并使用视图编写器来确保局部视图有适当的数据。
文档
[edit]这是我的项目,我随时可以在github上获得它的贡献。
一个完美的为您的问题Laravel 5.4支持的包创建动态,数据库驱动,支持引导,下拉菜单可用。
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