2015-04-19 158 views
3

我是Laravel的新手(相对较新的MVC概念),并观看了几个小时的教程并阅读了许多其他内容,但有一个简单的常见任务使我无法理解:跨控制器在系统中重复使用相同基本元素(如CMS)的最佳方式是什么?如何在Laravel中重新使用控制器中的代码

场景:

我有一个内容管理系统,并希望使用不同的控制器,用于每种类型的功能:例如用于管理帖子的帖子控制器,用于管理用户的用户控制器,用于菜单项目的菜单控制器等等。大多数教程推荐这种类型的工作流程。

但是,在实际的CMS前端,我有很多常见的动态元素(来自数据库),但仍然需要在所有控制器上显示。例如,菜单(来自数据库),当前用户的详细信息(用户名和与权限相关的按钮)等。使用Blade显示给用户(前端)很容易,但我可以'找出在后端执行此操作的最佳方法。

例如,如果每个控制器分别从数据库获取菜单,那就是(缺少)代码重复使用的噩梦。另一方面,从我可以插入此代码并将其传递到所有控制器的视图中,似乎没有一个中心位置。我确信Laravel开发人员已经想到了这种非常常见的情况。实施它的最佳方式是什么?

+1

[View Composers!](http://laravel.com/docs/5.0/views#view-composers) – lukasgeiter

+0

谢谢,这正是我一直在寻找的。你能把它作为答案吗? – Ynhockey

+0

不客气。我不喜欢只发布一个链接作为答案。也许我会稍后写一个适当的答案... – lukasgeiter

回答

4

这正是View Composers的目的!

View Composer允许您注册在呈现特定视图之前执行的回调。通常你注册他们在Service Provider。您可以使用现有的AppServiceProvider或为此创建新的ComposerServiceProvider

这将是视图的非常简单的例子名称为menu

public function boot(){ 
    View::composer('menu', function($view){ 
     $menu = DB::table('menu')->get(); 
     $view->with('menu', $menu); 
    }); 
} 

你也可以指定包含作曲家逻辑的类。 Read more about that in the docs

1

您可以View::share在基本控制器的变量,它扩展了其他的控制器是这样的:

基本控制器

protected $variable; 

public function __construct() 
{ 
    $this->variable= Model::all(); 
    View::share('variable', $this->variable); 
} 

然后,只需使用扩展其它控制器$this->variable主控制器,让您的变量。

你可以尝试的另一件事是注册一个独立的,并使用这种方法,而不是

在,它的自动加载某些文件或它的命名空间是自动加载

App::before(function($request) 
     { 
     App::singleton('variable', function(){ 
      $variable= Model::all(); 
      return $variable; 
     }); 

然后使用您的控制器$variable= app('variable');

相关问题