我正在使用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'
]);
这很好用,我可以查看数据库中的索引和单个页面。
当我添加导航时出现问题。由于我打算使用两个不同的导航栏(一个用于用户,一个用于管理员),因此我选择创建一个_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的新手,所以我不确定使用导航控制器/模型或其他方法来处理这个问题的最佳方法。
使用多个控制器实现动态导航栏的正确方法是什么?
答案 0 :(得分:8)
这就是我可以在我的应用中随处可见动态导航栏的方式。
在UITableView
的{{1}}方法中测试以下内容:
boot
AppServiceProvider
表示所有观看都会收到View::composer('*', function($view)
{
$view->with('pages', Page::all());
});
。
您现在可以将其提取到专门用于查看作曲家的服务提供商。
答案 1 :(得分:4)
如果我理解你的问题,你需要为导航创建一个局部视图,并使用视图编辑器来确保部分视图具有正确的数据。
答案 2 :(得分:1)
[edit]这是我的项目,我总是可以在github上做出贡献。
适用于您的Laravel 5.4支持包,用于创建动态,数据库驱动,支持Bootstrap,下拉菜单。
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
答案 3 :(得分:0)
对于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);
});
}