【问题标题】:How to Reuse Code Across Controllers in Laravel如何在 Laravel 中跨控制器重用代码
【发布时间】:2015-04-19 14:05:20
【问题描述】:

我是 Laravel 的新手(总体上对 MVC 概念相对较新)并且已经观看了数小时的教程并阅读了许多其他教程,但是有一个简单的常见任务让我无法理解:重用跨控制器的系统(例如 CMS)中的基本元素是否相同?

场景:

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

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

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

【问题讨论】:

  • 谢谢,这正是我想要的。您可以将其发布为答案吗?
  • 不客气。我不喜欢只发布一个链接作为答案。也许我稍后会写一个正确的答案......

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


【解决方案1】:

这正是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

【讨论】:

    【解决方案2】:

    您可以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');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多