Как создать управляемое базой данных многоуровневое меню навигации с помощью 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();
}
}
и это моя навигация таблица базы данных, которую я буду использовать для этой модели:
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 может помочь вам организовать эта логика в одном месте.