Как создать управляемое базой данных многоуровневое меню навигации с помощью Laravel

Я новичок в Laravel 4, и я полностью запутался в его моделях. Я пытаюсь создать навигационное меню, управляемое базой данных для моего проекта, и все, что я знаю, это то, что мне нужно создать модель для взаимодействия с базой данных (на основе моих знаний из codeigniter). Я много изучал, и я устал от того, что не могу идти вперед, это код, который я придумал до сих пор:

/ app / модели / навигация.в 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 ответов


поэтому после гораздо большего поиска и чтения из разных источников это то, что я придумал, и он работает нормально:

/ app / модели / навигация.в 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 / контроллеры / 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 / макеты / главная / индекс.лезвие.в PHP

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

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

}

и в blade Вы просто будете иметь к

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

вы должны понимать, что те вещи, которые вы не можете получить из коробки, потому что они выходят за рамки фреймворка, вы можете прекрасно получить с помощью PHP,

вот некоторая логика PHP для создания многоуровневых меню, но, конечно, вам придется адаптироваться к вашим потребностям:http://forrst.com/posts/Flat_Array_Multi_HTML_UL-IKp.


для таких, как я, посетив эту статью почти 4 года спустя, я бы сказал, что новое лучшее решение-это все в этом видео:

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

Посмотреть Композиторов

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

view composers-это обратные вызовы или методы класса, которые вызываются при представление. Если у вас есть данные, что вы хотите быть привязаны к виду каждый раз, когда это представление отображается, view composer может помочь вам организовать эта логика в одном месте.