2016-05-23 42 views
6

繼指引,我有擴展核心和顯示數據在每一頁Laravel

1)創建一個服務提供商

class ViewComposerServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     view()->composer('template', function ($view) { 
      $view->with('series_list', Series::all()); 
     }); 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     // 
    } 
} 

2)註冊商

App\Providers\ViewComposerServiceProvider::class, 

3 )並在模板處回顯變量

{!! var_dump($series_list) !!} 

的問題是:

Route::get('/', '[email protected]'); 
Route::get('product/view/{id}', '[email protected]'); 
Route::get('product/detail/{id}', '[email protected]'); 
Route::get('/page/contact', '[email protected]'); 

的PageController和HomeController中可以顯示$ series_list,但ProductController的將返回錯誤:

Undefined variable: series_list in the template 

這裏是ProductController的:

class ProductController extends Controller 
{ 
    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     //$this->middleware('auth'); 
    } 

    /** 
    * Show the application dashboard. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function view($id = 1) 
    { 
     return view('product/list'); 
    } 

    public function detail($id = 1) 
    { 
     return view('product/detail'); 
    } 
} 

非常感謝幫助。

+0

你能回家和產品/列表視圖? –

回答

2

您只與名爲'template'的視圖共享變量,並且您的ProductController使用視圖'product/list'和'product/detail'。如果你想分享的所有視圖中的數據,你可以這樣做:

view()->composer('*', function ($view) { 
    $view->with('series_list', Series::all()); 
}); 

甚至:

view()->share('series_list, Series:all()); 

否則,請第一個參數數組,幷包括有所有的觀點:

view()->composer(['template', 'product.list'], function ($view) { 
    $view->with('series_list', Series::all()); 
}); 
+0

感謝您的幫助,奇怪的部分是產品/列表和產品/細節擴展模板(與聯繫人和主頁相同),但只有聯繫人和首頁可以獲得$ series_list變量 – user782104

+3

快速兩美分爲什麼您的第一個代碼部分是純粹的邪惡:如果你有20個視圖,將執行20個SQL查詢。修正是將'Series :: all()'作爲變量傳遞,而不是調用它20次。代碼:http://pastebin.com/xLVCPViy –

+0

@GiedriusKiršys出於好奇,即使我們不需要這個,你的解決方案不會取得結果嗎? – Abhishek

0

創建MainController 使用View :: share MainController :: __constructor方法現在你可以超載和共享數據只有子控制器

5

的另一種方式,有點短

class AppServiceProvider extends ServiceProvider 
{ 
    // other methods 

    public function boot() 
    { 
     $series = Series::all(); 
     view()->share('series_list', $series); 
    } 

    // other methods 

} 
0

爲什麼不直接使用@注入? 在某些情況下,創建一個可以全局訪問的全局服務(如統計信息或任何其他孤立的東西)並不是一個壞主意。

@inject('stats','App\Services\Stats') 

{{ $stats->series() }} 

你只需要一個全球性的服務類來處理您要爲/全球注入什麼:

namespace App\Services; 

use App\Series; 

class Stats { 

    public function series() 
    { 
     return Series::all(); 
    } 
}