Laravel - 在所有路线上请求提供商数据

时间:2016-02-29 22:04:06

标签: php laravel laravel-5 laravel-5.2

我目前正在使用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]);
      });
    }

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

代码的问题在于它检查视图是否存在。机会是,观点"家庭"将永远存在,所以它将始终包括你的观点; " layouts.check&#34 ;.

除非,观点" home"是动态的,只是有条件地存在,这看起来并不正确。如果你想要" layouts.check"查看文件只在某些页面上加载,你可能想尝试" Request :: is()"。

@if(Request::is('home'))
    @include('layouts.check')
@endif

答案 1 :(得分:0)

只要您的' layouts.check'将会调用视图编辑器。视图已呈现。

即使你试图不渲染它(通过添加你的if语句),视图仍然会被渲染,你的视图编辑器仍然会被调用。

模板引擎将在一次传递中解析您的视图。引擎并不关心您内部的任何逻辑类型,唯一的工作就是将该逻辑转换为PHP代码。因此,即使您有语句@if(!Auth::guest()),解析器也不了解实际逻辑,只知道将其转换为<?php if (!Auth::guest()) { </php>

基本上,您的@if语句不会阻止引擎解析您的包含文件,而是解析后的PHP代码会阻止包含文件的结果显示在您的输出中。因此,由于您的@include文件已被解析,因此将调用视图编辑器。