Laravel – данные провайдера запрашиваются на всех маршрутах

В настоящее время я использую Laravel Provider для передачи данных в представление каждый раз, когда оно вызывается. App.blade.php включает блейд-файл, если пользователь аутентифицирован.

Моя проблема в том, что на данный момент, независимо от того, в каком представлении находится пользователь, он все равно вызывает ViewServiceProvider.php, что кажется не очень эффективным.

Я пытался использовать @if(view()->exists('home')), но это, кажется, не имеет никакого эффекта, и, таким образом, запросы по-прежнему вызываются из ViewServiceProvider.php.

App.blade.php:

@if(!Auth::guest())

  @if(view()->exists('home'))

    @include('layouts.check')

  @endif

@endif

ViewServiceProvider.php:

public function boot()
    {
      view()->composer('layouts.check', function ($view) {

        $sites = Site::where('trust_id', Auth::id())->get();

        $view->with(['sites' => $sites]);
      });
    }

Любая помощь будет очень признательна.


person Community    schedule 29.02.2016    source источник
comment
Кажется нормальным, что он запускает ViewServiceProvider, потому что ему нужно зарегистрировать композиторов представлений. Однако закрытие должно выполняться только при использовании layouts.check. Кроме того, представление существует всегда будет истинным, если у вас есть представление, называемое домом, потому что оно проверяет существование, а не присутствие.   -  person vonec    schedule 01.03.2016


Ответы (2)


Проблема с вашим кодом заключается в том, что он проверяет, существует ли представление. Скорее всего, представление «дом» всегда будет существовать, поэтому оно всегда будет включать ваше представление; "макеты.проверить".

Если, конечно, вид "дом" динамичен и находится там лишь условно, что не кажется правильным. Если вы хотите, чтобы файл представления «layouts.check» загружался только на определенных страницах, вы можете попробовать «Request::is()».

@if(Request::is('home'))
    @include('layouts.check')
@endif
person IllegalPigeon    schedule 29.02.2016

Композитор представления будет вызываться всякий раз, когда отображается ваше представление «layouts.check».

Несмотря на то, что вы пытались не отображать его (добавляя в свои операторы if), представление все равно будет отображаться, и ваш компоновщик представлений все равно будет вызываться.

Механизм шаблонов будет анализировать ваше представление за один проход. Движок не заботится о какой-либо логике внутри вашего представления, его единственная задача состоит в том, чтобы преобразовать эту логику в код PHP. Таким образом, даже если у вас есть оператор @if(!Auth::guest()), синтаксический анализатор не понимает реальной логики, он просто знает, как преобразовать его в <?php if (!Auth::guest()) { </php>.

По сути, ваши операторы @if не мешают движку анализировать ваш включаемый файл, это проанализированный PHP-код, который предотвращает отображение результатов включаемого файла в вашем выводе. Итак, поскольку ваш файл @include проанализирован, вызывается компоновщик представления.

person patricus    schedule 29.02.2016