我已经创建了一个使用控制器的数据库驱动菜单,
HomeController扩展了在Controller的construct函数中加载菜单的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: Using laravel 5.1通过以下命令从artisan生成新的ServiceProvider
php artisan make:provider ComposerServiceProvider
这将在app/Providers下创建一个新文件名ComposerServiceProvider.php。在这个新创建的服务提供程序的boot函数中,你可以像这样创建闭包函数:
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,