2016-05-23 23 views
6

Po wytycznej, mamExtend rdzeń i pokazują dane z każdej strony w laravel

1) Utwórz usługodawcy

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) rejestruje dostawcy

App\Providers\ViewComposerServiceProvider::class, 

3) I echo zmienna w szablonie

Problemem jest:

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 i HomeController może pokazać $ series_list, ale ProductController zwróci błąd:

Undefined variable: series_list in the template 

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

Thanks a lot dla pomocy.

+0

Można domu i widoki produkt/list? –

Odpowiedz

2

Twoja wspólna zmienna jest tylko widokem o nazwie "szablon", a produkt ProductController korzysta z widoków "produkt/lista" i "produkt/szczegół". Jeśli chcesz udostępnić dane z wszystkich widoków, można zrobić:

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

lub nawet:

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

przeciwnym razie zrobić pierwszy parametr tablicę i obejmują wszystkie widoki tam:

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

Dziękuję za pomoc, ta dziwna część to produkt/lista, a produkt/szczegóły rozszerzają szablon (taki sam jak kontakt i dom), ale tylko kontakt i dom mogą uzyskać zmienną $ seria_list – user782104

+3

Szybkie dwa centy, dlaczego Twoja pierwsza sekcja kodu jest czyste zło: jeśli masz 20 widoków, zostanie wykonanych 20 zapytań SQL. Napraw jest przekazanie 'Series :: all()' jako zmiennej zamiast wywołania jej 20 razy. Kod: http://pastebin.com/xLVCPViy –

+0

@ GiedriusKiršys z ciekawości, czy Twoje rozwiązanie nie przyniesie rezultatów, nawet jeśli nie będziemy tego potrzebować? – Abhishek

0

utwórz MainController użyj View :: share na MainController :: metoda __constructor teraz możesz przeciążać i udostępniać tylko dane kontroler podrzędny

5

Innym sposobem, nieco krótszy

class AppServiceProvider extends ServiceProvider 
{ 
    // other methods 

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

    // other methods 

} 
0

Dlaczego nie wystarczy użyć @inject? W niektórych przypadkach nie jest to zły pomysł na globalną usługę, do której można uzyskać dostęp na całym świecie, np. Statystyki lub inne odosobnione rzeczy.

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

{{ $stats->series() }} 

Trzeba tylko globalną klasę usług do obsługi co trzeba służyć/wstrzyknąć globalnie:

namespace App\Services; 

use App\Series; 

class Stats { 

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