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

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

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

Контроллер.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


person Karl Wong    schedule 21.10.2015    source источник
comment
Вам нужны компоновщики представлений: laravel.com/docs/5.1/views#view-composers Вы можете передавать переменные всем или определенным представлениям.   -  person Iamzozo    schedule 21.10.2015


Ответы (1)


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

php artisan make:provider ComposerServiceProvider

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

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

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

Чтобы сделать ваш код чище, вы можете создать новую функцию в 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);
}
}

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

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

Не забудьте добавить этот недавно созданный ServiceProvider в ваш config/app.php

App\Providers\ComposerServiceProvider::class,
person Khan Shahrukh    schedule 21.10.2015