在Laravel 5

时间:2015-09-05 21:20:55

标签: php laravel-5

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

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

我创建了PagesControllerPage模型,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'
]);

这很好用,我可以查看数据库中的索引和单个页面。

当我添加导航时出现问题。由于我打算使用两个不同的导航栏(一个用于用户,一个用于管理员),因此我选择创建一个_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,但我还会有其他控制器,例如ProductControllerCartController,这些控制器将拥有我自己需要的页面导航栏,我不能在每个控制器的每个$pages$products方法中包含$cartindexshow

我仍然是MVC的新手,所以我不确定使用导航控制器/模型或其他方法来处理这个问题的最佳方法。

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

4 个答案:

答案 0 :(得分:8)

这就是我可以在我的应用中随处可见动态导航栏的方式。

UITableView的{​​{1}}方法中测试以下内容:

boot

AppServiceProvider表示所有观看都会收到View::composer('*', function($view) { $view->with('pages', Page::all()); });

您现在可以将其提取到专门用于查看作曲家的服务提供商。

答案 1 :(得分:4)

如果我理解你的问题,你需要为导航创建一个局部视图,并使用视图编辑器来确保部分视图具有正确的数据。

docs

答案 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

完整文档:https://secrethash.github.io/dropmenu

答案 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);
    });
}