我目前正在使用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]);
});
}
非常感谢任何帮助。
答案 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
文件已被解析,因此将调用视图编辑器。