我正在使用Laravel 5.1。
我有很多观点,它们以某种方式包含在彼此中。例如,我有主要布局,一些模态窗口,一些自定义页面。所以基本上我有N个观点。
让我向您展示一个具体的例子。 layout.blade.php
是基本布局。 companies/index.blade.php
是公司列表。 modals/companies/create.blade.php
是一个模态模板,包含在布局中。
想象一下,我有一份公司行业清单。我需要向modals/companies/create.blade.php
和companies/index.blade.php
提供列表。该列表不应该从控制器传递,因为它的代码重复并且列表与任何条件无关,所以我不想用相同的代码行污染控制器
所以我有一个视图编辑器服务提供者,我将视图编辑器链接到视图。我可能有两种方法:
当我尝试第一种方式时,我的服务提供文件如下:
'App\ViewComposers\IndustriesViewComposer' => [
'modals.companies.create',
'modals.companies.edit'
... some other views ...
],
在这种情况下,如果某些视图包含在同一视图中,则将复制检索行业列表的查询。因此,如果我有许多小视图作曲家和相应的视图,那么在我将这些视图包含在一起的情况下,查询会重复。由于我有很多模态包含在一起,我得到重复。
在第二种方式中,我只有一个视图作曲家用于一个视图。这种情况也是如此。例如,我知道我需要提供公司创建模式的行业列表,以及我需要提供给公司版模式的相同列表。
查看作曲家的分享无法奏效,因为我只需要为登录用户的特定页面提供数据。
所以基本上问题是:如果在当前请求中呈现视图并且避免重复,如何为多个视图执行一个查询。
想象一下,我有一个公司页面。 1)在我的系统的每个页面中,我都有公司创建模式,需要行业列表 2)在单一公司页面中,我包括需要行业清单的公司版模式 3)单页还需要行业清单
如何只检索一次列表并将其提供给单一视图,新公司模式和编辑公司模态视图?
答案 0 :(得分:-1)
您可以使用中间件。在中间件中,您进行查询并使用绑定到IoC容器来保存模型(或集合)。
因此,在您的中间件中,您可以(例如):
$my_data = Data::where('some_field','some_value')->first();
App::instance('my_data_saved', $my_data);
不要忘记包含use App;
之后,您可以使用IoC Container访问所需的数据(控制器,视图等),例如:
<title>{{ App::make('my_data_saved')->title }}</title>
然后,您只需要在需要视图数据的路径或控制器中包含中间件。