我需要在大多数视图中访问一些数据(用户详细信息)。我做了什么:
我创建了ComposerServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
view()->composer(
['includes.header','profile'],
'App\Http\ViewComposers\CustomerComposer'
);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
创建了CustomerComposer类
<?php
namespace App\Http\ViewComposers;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
use Modules\Customers\Entities\CustomerDetail;
class CustomerComposer
{
public $customer = [];
/**
* Bind data to the view.
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$user = Auth::guard('customer');
$this->customer = CustomerDetail::where('user_id',$user->id())->first();
$view->with( 'customer', $this->customer );
}
}
一切正常但是当我查看调试栏时,它会向我显示每个视图的相同查询,例如,如果我定义['includes.header','profile']如果['includes.header},则相同的SQL将被激活两次','profile','something_else'] 3次等等......
在这种情况下,查询是
select * from `customer_details` where `user_id` = '1' limit 1
select * from `customer_details` where `user_id` = '1' limit 1
如果我在
中提供通配符view()->composer(
['*'],
'App\Http\ViewComposers\CustomerComposer'
);
它将生成23个查询!我错过了什么?
答案 0 :(得分:3)
好的我觉得我找到了解决方案。在ComposerServiceProvider类中:
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(\App\Http\ViewComposers\CustomerComposer::class);
}
那就是它。
在Laravel Docs中
注册单身人士
有时,您可能希望将某些内容绑定到容器中 应该只解析一次,并且应该返回相同的实例 随后调用容器:
答案 1 :(得分:0)
根据https://laravel.com/docs/5.5/views#view-composers的手册:
“视图作曲家是在渲染视图时调用的回调或类方法。如果您希望在每次渲染视图时将视图绑定到视图 ,则视图编辑器可以帮助您将逻辑组织到一个位置。“
(强调我的)
在这种情况下:
view()->composer(
['includes.header','profile'],
'App\Http\ViewComposers\CustomerComposer'
);
您正在附加includes.header
视图和profile
视图,我认为该视图包含includes.header
视图。因此,由于在渲染视图时执行编辑器,它将执行两次,一次是渲染profile
视图,另一次是渲染includes.header
视图时。
答案 2 :(得分:0)
您可以在此处使用配置来解决视图组合的多次查询运行问题。例如显示下面的代码。
公共函数compose(查看$view) {
if(!Config::has('composeVars'))
{
Config::set('composeVars') = [
'users' => User::all();
];
}
$view->with('*', Config::get('composeVars'));
}