【问题标题】:Why is my singleton view composer not working, what am I missing?为什么我的单例视图作曲家不起作用,我错过了什么?
【发布时间】:2018-10-27 13:39:46
【问题描述】:

我在我的项目中创建了这个视图编辑器。但是当我运行该站点时,它会多次运行该类。我正在使用部分循环来生成一些菜单,这是多次调用视图的地方。而且因为我在每个视图中都设置了视图作曲家(view()->composer('*', ViewComposer::class);),所以该类被调用了 200 多次。我之前没有使用视图作曲家和单例,所以我不确定我在哪里做错了。

这是我的提供者:

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 查询和类。我哪里做错了?

【问题讨论】:

  • 你的班级是什么样的?单例只保证一个实例,而不是只运行一次。
  • 你的意思是什么类?举例来说,您的意思是该课程被疯狂一次,但无论如何都可以运行多次?我通过获取(注入)此类数据来创建一些菜单。但是因为我对所有视图(带有 *)使用这个视图作曲家,并且因为我在刀片视图基础上使用 (@)foreach 和 (@)include 执行这些循环,所以它在每个部分视图上运行 sql 查询。我想要的是只运行一次。

标签: laravel


【解决方案1】:

在@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 的提示。

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2019-07-31
    • 2018-04-30
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多