2016-05-23 12 views
6

Nach der Richtlinie habe ichErweiterte Kern und zeigt die Daten, die in jeder Seite in Laravel

1) Erstellen Sie einen Dienstleister

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) Registrieren Anbieter

App\Providers\ViewComposerServiceProvider::class, 

3) Und echo die Variable in der Vorlage

{!! var_dump($series_list) !!} 

Das Problem ist:

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 und Homecontroller die $ series_list zeigen kann, aber Product kehrt Fehler:

Undefined variable: series_list in the template 

Hier ist der Product:

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'); 
    } 
} 

Vielen Dank für die Hilfe.

+0

Können Sie nach Hause und Produkt/Listenansichten? –

Antwort

2

Sie haben die Variable nur mit der Ansicht 'Vorlage' geteilt, und Ihr ProductController verwendet die Ansichten 'Produkt/Liste' und 'Produkt/Detail'. Wenn Sie die Daten mit allen Ansichten teilen möchten, können Sie tun:

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

Oder auch:

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

Andernfalls machen Sie den ersten Parameter ein Array und umfassen alle Ansichten gibt:

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

Danke für die Hilfe, das seltsame Teil ist Produkt/Liste und Produkt/Detail ist die Vorlage (wie der Kontakt und zu Hause) erweitern, aber nur Kontakt und zu Hause können die Variable $ series_list – user782104

+3

Quick zwei Cent erhalten, warum Ihre erste Codeabschnitt ist pure evil: Wenn Sie 20 Ansichten haben, werden 20 SQL-Abfragen ausgeführt. Fix ist es, 'Series :: all()' als Variable zu übergeben, anstatt sie 20-mal aufzurufen. Code: http://pastebin.com/xLVCPViy –

+0

@ GiedriusKiršys aus Neugier, wird nicht Ihre Lösung Ergebnisse erzielen, auch wenn wir das nicht brauchen? – Abhishek

0

erstellen MainController verwenden View :: Freigabe auf MainController :: __constructor Methode jetzt können Sie überladen und teilen nur Daten untergeordneten Controller

5

Eine andere Möglichkeit, ein bisschen kürzer

class AppServiceProvider extends ServiceProvider 
{ 
    // other methods 

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

    // other methods 

} 
0

Warum nicht einfach verwenden @inject? In einigen Fällen ist es keine schlechte Idee, einen globalen Dienst zu erstellen, auf den global zugegriffen werden kann, wie Statistiken oder andere isolierte Daten.

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

{{ $stats->series() }} 

Sie haben soeben eine globale Service-Klasse müssen zu handhaben, was Sie dienen müssen/injizieren global:

namespace App\Services; 

use App\Series; 

class Stats { 

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