【问题标题】:Proper way to make a dynamic navigation in Laravel 5在 Laravel 5 中进行动态导航的正确方法
【发布时间】:2017-06-24 13:41:03
【问题描述】:

我正在使用 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'
]);

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

当我去添加我的导航时出现了我的问题。由于我计划使用两个不同的导航栏(一个用于用户,一个用于管理员),我选择创建一个 _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 还很陌生,所以我不确定使用导航控制器/模型或其他东西的最佳方法。

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

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

    这就是我能够在我的应用中随处使用动态导航栏的方式。

    AppServiceProviderboot 方法中测试以下内容:

    View::composer('*', function($view)
    {
        $view->with('pages', Page::all());
    });
    

    * 表示所有视图都将收到$pages

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

    【讨论】:

    • 不仅仅是将其添加到启动功能中。您可以扩展“您现在可以将其提取到专门用于查看作曲家的服务提供商。”
    • 现在官方文档中提供了这种方法。 laravel.com/docs/5.7/views#view-composers
    【解决方案2】:

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

    docs

    【讨论】:

      【解决方案3】:

      [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

      【讨论】:

      • 根据包含与您的用户名相同的目录和/或子域的链接的 URL,您似乎已链接到自己的站点。如果您这样做,您需要披露它是您的网站。如果您不透露它是您自己的网站,它通常被视为垃圾邮件。请参阅:What signifies "Good" self promotion?How to not be a spammer
      猜你喜欢
      • 2012-07-04
      • 2015-06-30
      • 2014-02-28
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多