如何在Laravel中重用控制器代码

时间:2015-04-19 14:05:20

标签: php laravel model-view-controller laravel-5

我是Laravel的新手(一般来说相对较新的MVC概念)并且已经观看了几个小时的教程并阅读了许多其他内容,但有一个简单的常见任务让我望而却步:什么是最好的方法在控制器中重用系统中的相同基本元素(比如CMS)?

情境:

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

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

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

2 个答案:

答案 0 :(得分:4)

这正是View Composers的用途!

View Composers允许您注册在呈现特定视图之前执行的回调。通常你在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 :(得分:1)

您可以{base}扩展其他控制器的基本控制器中的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');