Почему мой композитор с одним видом не работает, что мне не хватает? - PullRequest
0 голосов
/ 27 октября 2018

Я создал это представление композитора в моем проекте. Но когда я запускаю сайт, он запускает класс несколько раз. Я использую частичные циклы для создания некоторых меню, и это место, где представления вызываются много раз. И поскольку я устанавливаю представление composer (view()->composer('*', ViewComposer::class);) в каждом представлении, класс вызывается более 200 раз. Я раньше не использовал View Composer и Singletons, поэтому я не уверен, где я делаю неправильно.

Это мой провайдер:

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 голосов
/ 28 октября 2018

После того, как @Devon дал мне понять, что связывание с синглтоном гарантирует, что класс не будет запущен один раз, а будет создан его экземпляр только один раз (но все еще можно запускать много раз), я решил переместить часть обработки (sql query) в __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 за ваш совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...