可以在视图中加载的数据库驱动菜单

时间:2015-10-21 08:10:19

标签: php laravel laravel-5 laravel-5.1

我使用Controller

创建了一个数据库驱动的菜单

HomeController扩展了Controller,它在Controller的构造函数中加载了菜单。

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 个答案:

答案 0 :(得分:3)

通过以下命令

从artisan生成新的ServiceProvider
php artisan make:provider ComposerServiceProvider

这将在app / Providers下创建一个新文件名ComposerServiceProvider.php。在这个新创建的服务提供者的启动功能中,您可以创建具有以下关闭功能的函数:

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

此处有问题的视图是view / partials下的navbar.blade.php,它将在您的应用中提供名为genre的变量。

要使代码更清晰,您可以在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的partialnav函数

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

不要忘记在config / app.php中添加这个新创建的ServiceProvider

App\Providers\ComposerServiceProvider::class,