【问题标题】:How to avoid query duplication when using view composers?使用视图作曲家时如何避免查询重复?
【发布时间】:2015-08-23 01:20:41
【问题描述】:

我正在使用 Laravel 5.1。

我有很多观点,它们以某种方式相互包含。例如,我有主布局、一些模式窗口、一些自定义页面。所以基本上我有 N 个视图。

让我给你看一个具体的例子。 layout.blade.php 是基本布局。 companies/index.blade.php 是公司列表。 modals/companies/create.blade.php 是一个包含在布局中的模态模板。

假设我有一份公司行业列表。我需要将列表提供给modals/companies/create.blade.phpcompanies/index.blade.php。列表不应该从控制器传递,因为它是一种代码重复,并且列表与任何条件无关,所以我不想用相同的代码行污染控制器。

所以我有一个视图编写器服务提供商,我将视图编写器链接到视图。我可能有两种方法:

  1. 每个视图编写器代表一小部分数据,例如服务于行业列表的“IndustriesViewComposer”
  2. 每个视图合成器都代表某个视图所需的所有数据,例如“CreateCompanyModalViewComposer”

当我尝试第一种方式时,我的服务提供文件如下所示:

'App\ViewComposers\IndustriesViewComposer' => [
    'modals.companies.create',
    'modals.companies.edit'
    ... some other views ...
],

在这种情况下,如果某些视图包含在同一视图中,则检索行业列表的查询将重复。因此,如果我有许多小视图编写器和相应的视图,那么查询会重复,以防我将这些视图包含在一起。由于我有许多包含在一起的模态,所以我得到了重复。

在第二种方式中,一个视图只有一个视图作曲家。同样的情况也发生在这里。例如,我知道我需要为公司创建模式提供行业列表,并且我需要为公司版本模式提供相同的列表。

作曲家的视图共享不起作用,因为我只需要为已登录的用户提供特定页面的数据。

所以基本上问题是:如何为多个视图执行一个查询,以防视图在当前请求中呈现并避免重复。

假设我只有一个公司页面。 1)在我系统的每个页面中,我都有需要行业列表的公司创建模式 2)在单个公司页面中,我包括需要行业列表的公司版本模式 3) 单页也需要行业列表

如何只检索一次列表并将其提供给单一视图、新公司模式和编辑公司模式视图?

【问题讨论】:

  • 您不能简单地在执行查询的模型中创建一个方法吗?还是你在寻找更性感的东西?

标签: php laravel-5


【解决方案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>

那么您只需在需要视图数据的路由或控制器中包含中间件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
相关资源
最近更新 更多