2016-02-29 85 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文件被解析,視圖編輯器被調用。

相關問題