我已经在我的项目中创建了这个View Composer。但是,当我运行该站点时,它将多次运行该类。我正在使用部分循环来生成一些菜单,而这是多次调用视图的地方。而且因为我在每个视图中都设置了视图编辑器(view()->composer('*', ViewComposer::class);
,所以该类被调用了200多次。我以前没有使用过View Composer和Singleton,所以不确定自己在哪里做错了。
这是我的提供者:
namespace App\Providers;
use App\Http\Composers\ViewComposer;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
view()->composer('*', ViewComposer::class);
}
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->singleton(ViewComposer::class);
}
}
这是我的视图编辑器
<?php
namespace App\Http\Composers;
use Illuminate\Contracts\View\View;
class ViewComposer
{
public function compose(View $view)
{
\Log::debug('view composer runned');
if( auth()->check() ){
$permissions = auth()->user()->permissions()
}
$view->with( "permissions", $permissions);
}
}
这可以使服务提供商在config / app.php中注册。但是正如我所说的,它会多次运行sql查询和类。我在哪里做错了?
答案 0 :(得分:0)
@Devon让我清楚表明,与单例绑定确保不运行一次类,而是仅实例化一次(但仍可多次运行),因此我决定将处理(SQL查询)部分移至__construct并将结果存储到类的属性。因此,仅当类仅实例化一次且结果保留在单例实例中时,才进行该过程。
<?php
namespace App\Http\Composers;
use Illuminate\Contracts\View\View;
class ViewComposer
{
public $permissions;
public function __construct(){
$this->initPermissions();
}
public function compose(View $view)
{
$view->with( "permissions", $permissions);
}
public function initPermissions(){
if( auth()->check() ){
$this->permissions = auth()->user()->permissions()
}
}
}
一次又一次地解决了我的多重sql进程问题。但是现在我有很多观点在起作用。这可能不是一个大问题,但是我想生成这些菜单的正确方法是在视图编辑器中进行循环,而不是使用@foreach和@include在视图中循环。这样,我不能一遍又一遍地加载多个视图。谢谢@Devon的提示。