2016-02-29 54 views
0

我目前使用Laravel Provider在每次调用时将数据传递到视图。如果用户通过身份验证,App.blade.php将包含刀片文件。Laravel - 在所有路由上请求的提供程序数据

我的问题是,目前,无论用户在哪个视图上,它仍然会调用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]); 
     }); 
    } 

任何帮助将非常感激。

+0

运行ViewServiceProvider似乎很正常,因为它需要注册视图编辑器。但是,只有在使用layouts.check时才能执行闭包。如果你有一个称为home的视图,那么存在的视图总是成立的,因为它检查存在而不是存在。 – vonec

回答

0

你代码的问题在于它检查视图是否存在。有机会,“家”的观点将永远存在,所以它总会包含你的观点; “layouts.check”。

除非当然,“家”的观点是动态的,只有有条件的,这看起来不正确。如果您希望“layouts.check”视图文件仅在特定页面上加载,则可能需要尝试“Request :: is()”。

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

这很好用,谢谢! – Ben

0

只要呈现'layouts.check'视图,视图编辑器就会被调用。

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

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

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

相关问题