2016-05-23 45 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(); 
    } 
}