为什么我的单例视图作曲家无法正常工作,我想念什么?

时间:2018-10-27 13:39:46

标签: laravel

我已经在我的项目中创建了这个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查询和类。我在哪里做错了?

1 个答案:

答案 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的提示。