Меню, управляемое базой данных, которое можно загрузить в представлении
Я создал меню, управляемое базой данных, с помощью контроллера,
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
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,