如何使用Laravel创建数据库驱动的多级导航菜单

时间:2014-01-23 10:13:46

标签: php mysql laravel laravel-4

我是Laravel 4的新手,我对它的模型完全感到困惑。 我正在尝试为我的项目创建一个数据库驱动的导航菜单,我所知道的是我必须创建一个与数据库交互的模型(基于我在codeigniter中的知识)。我一直在研究很多,而且我已经厌倦了无法前进,这是我迄今为止提出的代码:

/app/models/navigation.php

<?php

class Navigation extends Eloquent {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'navigation';

    /**
     * Get the unique identifier for the menu item.
     *
     * @return mixed
     */
    public function getItemIdentifier()
    {
        return $this->getKey();
    }

}

这是我将用于此模型的导航数据库表:

enter image description here

3 个答案:

答案 0 :(得分:26)

所以在做了更多搜索和阅读不同来源之后,这就是我想出来的并且工作正常:

<强> /app/models/Navigation.php

<?php

class Navigation extends Eloquent {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'navigation';

    public function parent() {

        return $this->hasOne('navigation', 'id', 'parent_id');

    }

    public function children() {

        return $this->hasMany('navigation', 'parent_id', 'id');

    }  

    public static function tree() {

        return static::with(implode('.', array_fill(0, 4, 'children')))->where('parent_id', '=', NULL)->get();

    }

}

<强> /app/controllers/HomeController.php

<?php

class HomeController extends BaseController {

    protected $layout = "layouts.main";

    public function showWelcome()
    {

        $items = Navigation::tree();

        $this->layout->content = View::make('layouts.home.index')->withItems($items);

    }

}

<强> /app/views/layouts/home/index.blade.php

<ul>
    @foreach($items as $item)
        <li>{{ $item->title }}
            @foreach($item['children'] as $child)
            <li>{{ $child->title }}</li>
            @endforeach
        </li>
    @endforeach
</ul>

答案 1 :(得分:4)

Laravel不会为您创建菜单,但它会帮助您编写干净的代码来执行此操作。

使用您的模型查询您的表并创建菜单项:

<?php

class HomeController extends Controller {

    public function index()
    {
        $items = Navigation::all();

        return View::make('index')->withItems($items);
    }

}

在您看来,您将能够

<ul>
    @foreach($items as $item)
        <li>{{ $item->title }}</li>  
    @endforeach
</ul>

PHP,Composer甚至Laravel为您提供的另一种可能性是安装一个特定的软件包来帮助您完成工作,这个方法是简化菜单生成:https://github.com/anhsaker/laravel-menu

修改

看起来您需要无限制的多级菜单,并且您不想使用包,对吗?

不要忘记Laravel和Laravel Blade都是PHP,所以你可以用PHP创建类来帮助你在Laravel中构建东西,比如:

class Menu {

   public function build($collection)
   {
      // build your <li> $items

      return $items;   
   }

}

然后你的控制器看起来像:

<?php

class HomeController extends Controller {

    public function index()
    {
        $items = with(new Menu)->build(Navigation::all());

        return View::make('index')->withItems($items);
    }

}

在刀片中你只需要

<ul>
    {{ $items }}
</ul>

你必须明白那些你无法开箱即用的东西,因为它们超出了框架的范围,你可以通过使用PHP完美地获得,

这是构建多级菜单的一些PHP逻辑,当然,您必须适应您的需求:http://forrst.com/posts/Flat_Array_Multi_HTML_UL-IKp

答案 2 :(得分:0)

对于像我这样近4年后访问这篇文章的人,我会说这个视频中有新的最佳解决方案:

https://laracasts.com/series/laravel-5-fundamentals/episodes/25

查看作曲家

https://laravel.com/docs/5.4/views#view-composers

  

视图作曲家是a时调用的回调或类方法   视图呈现。如果您有要绑定到视图的数据   每次渲染视图时,视图编辑器都可以帮助您进行组织   把这个逻辑放到一个地方。