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


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

HomeController расширяет контроллер, меню которого загружается в функцию построения контроллера.

HomeController.php

class HomeController extends Controller
{


    public function __construct()
    {
        parent::__construct();
        $this->middleware('auth');
    }

    public function index(){
        $data['menu'] = $this->menu;
        return view('home', $data);
    }
}

Controller.php

public function __construct()
    {
        $this->user = Auth::user();

        $menu = new Menu();

        if($this->user != NULL && $this->user != ""){
            $this->menu = $menu->getMenu($this->user->user_id);
        }   
    }

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

P/S: Использование laravel 5.1

Author: Karl Wong, 2015-10-21

1 answers

Создайте нового поставщика услуг от artisan, выполнив команду

php artisan make:provider ComposerServiceProvider

Это создаст новое имя файла ComposerServiceProvider.php в разделе приложения/Поставщики. В функции загрузки этого недавно созданного поставщика услуг вы можете создавать функции с закрытием, например, следующие:

view()->composer('partials.navbar', function ($view) {
        $view->with('genre', Genre::all());
    });

Здесь рассматриваемая точка зрения такова navbar.blade.php в разделе просмотр/части, в котором будет доступна переменная с именем жанр через ваше приложение.

Чтобы сделать ваш код чище, чем вы можете сделайте это, создайте новую функцию в ComposerServiceProvider и назовите ее как угодно, скажем, partialnav. Затем сделаем следующее:

public function boot()
{
    $this->partialNav();
}

//create a function independently

public function partialnav()
{
    //code goes here
}

Если вы хотите разделить его еще больше, вы можете создать новую папку под именем app/Http, это позволяет сказать ViewCompoers, В этой папке создайте новый файл с именем NavbarComposer.php со следующим кодом:

class NavbarComposer {


/**
 * Create a new profile composer.
 *
 * @param  UserRepository  $users
 * @return void
 */
public function __construct()
{
    // Dependencies automatically resolved by service container...
}

/**
 * Bind data to the view.
 *
 * @param  View  $view
 * @return void
 */
public function compose(View $view)
{
    //write your code to fetch the data 
    // and pass it to your views, following is an example
    $genre = genre::all();
    $view->with('genre', $genre);
}
}

Теперь вернемся к функции partialnav вашего ComposerServiceProvider

public function partialNav()
{
    view()->composer('partials.nav', 'App\Http\ViewComposers\NavbarComposer');
}

Не забудьте добавить это недавно созданное Поставщик услуг в вашем config/app.php

App\Providers\ComposerServiceProvider::class,
 3
Author: Khan Shahrukh, 2015-10-21 09:03:53