我是Laravel的新手(一般来说相对较新的MVC概念)并且已经观看了几个小时的教程并阅读了许多其他内容,但有一个简单的常见任务让我望而却步:什么是最好的方法在控制器中重用系统中的相同基本元素(比如CMS)?
情境:
我有一个内容管理系统,并希望为每种类型的功能使用不同的控制器:例如用于操纵帖子的帖子控制器,用于管理用户的用户控制器,用于菜单项目的菜单控制器等。大多数教程推荐这种类型的工作流程。
但是,在实际的CMS前端中,我有许多动态的常见元素(来自数据库)但仍需要在所有控制器上显示。例如,菜单(来自数据库),当前用户的详细信息(用户名和根据权限的相关按钮)等。使用Blade,向用户(前端)显示它很容易但是我无法找到在后端执行此操作的最佳方式。
例如,如果每个控制器分别从数据库中获取菜单,则表示(缺少)代码重用噩梦。另一方面,我似乎不是一个中心位置,我可以插入此代码并将其传递到所有控制器上的视图。我确信Laravel开发人员已经考虑过这种非常常见的情况。实施它的最佳方法是什么?
答案 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');
。