在Laravel 5中制作动态导航的正确方法


Proper way to make a dynamic navigation in Laravel 5

我正在使用5.1构建我的第一个Laravel应用程序,它是一个电子商务网站。

我从创建"静态"页面开始。我引用是因为页面不是从产品列表等动态生成的,但html仍然是从数据库中检索的。

我创建了一个PagesController,一个Page模型,pages/index.blade.phppages/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,但我也将有其他控制器,如ProductControllerCartController,它们将有自己的页面,我将在导航栏中需要,并且我不能很好地在每个控制器的每个indexshow方法中包含$pages, $products$cart

我仍然是相当新的MVC,所以我不确定最好的方法来处理这个,与导航控制器/模型或其他东西。

使用多个控制器实现动态导航条的正确方法是什么?

这就是我如何能够在我的应用程序的任何地方有我的动态导航栏。

AppServiceProviderboot方法中测试以下内容:

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