2015-04-18 10 views

risposta

60

Opzione 1:

È possibile utilizzare view::share() in questo modo:

<?php namespace App\Http\Controllers; 

use View; 

//You can create a BaseController: 

class BaseController extends Controller { 

    public $variable1 = "I am Data"; 

    public function __construct() { 

     $variable2 = "I am Data 2"; 


     View::share ('variable1', $this->variable1); 
     View::share ('variable2', $variable2); 
     View::share ('variable3', 'I am Data 3'); 
     View::share ('variable4', ['name'=>'Franky','address'=>'Mars']); 
    } 

} 

class HomeController extends BaseController { 

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so: 

    public function __construct(){ 
     parent::__construct(); 
    } 

    public function Index(){ 
     //All variable will be available in views 
     return view('home'); 
    } 

} 

Opzione 2: Utilizzare un compositore:

  1. Creare un file di compositore al app\Composers\HomeComposer.php

NB: creare app\Composers se non esiste

<?php namespace App\Composers; 

class HomeComposer 
{ 

    public function compose($view) 
    { 
     //Add your variables 
     $view->with('variable1',  'I am Data') 
      ->with('variable2',  'I am Data 2'); 
    } 
} 

Poi si può attaccato al compositore di qualsiasi vista in questo modo

<?php namespace App\Http\Controllers; 

use View; 

class HomeController extends Controller{ 


    public function __construct(){ 

     View::composers([ 
      'App\Composers\HomeComposer' => ['home'] //attaches HomeComposer to home.blade.php 
     ]); 

    } 

    public function Index(){ 
     return view('home'); 
    } 

} 
+1

La tua risposta mi ha davvero aiutato con l'Opzione 1, anche se cosa stai provando ad accedere a '$ user = Auth :: user();' e passare la variabile $ user a tutti i template blade inclusa l'intestazione e la parte del contenuto ? Ho provato questo mettendo la variabile $ utente nel BaseController e poi condividendola, ma se var_dump $ utente ottengo un sacco di valori protetti nella matrice. Fondamentalmente voglio essere in grado di accedere a tutte le variabili utente auth in tutta l'app in tutti i modelli e le visualizzazioni. Sembra semplice, ma ho passato ore a cercare di capirlo. –

+1

In realtà questo ha funzionato: ' 'ma questo non ha funzionato:' {{$ user-> name}} ' –

+0

@Chad Priddle Questo dovrebbe funzionare per un array' {{$ user ['name']}} 'mentre questo funziona per un oggetto '{{$ user-> nome}}' – Digitlimit

6

È possibile farlo con view composers. Visualizza i compositori vengono eseguiti quando viene caricato un modello. È possibile passare una chiusura con funzionalità aggiuntive per quella vista. Con i compositori di visualizzazione è possibile utilizzare i caratteri jolly. Per creare un compositore di viste per ogni vista basta usare un *.

View::composer('*', function($view) 
{ 
    $view->with('variable','Test value'); 
}); 

È inoltre possibile eseguire questa operazione senza una chiusura, come si può vedere nei documenti.

View::composer('*', 'App\Http\ViewComposers\ProfileComposer'); 

La classe del compositore del profilo deve avere un metodo di composizione.

I compositori di vista vengono eseguiti quando viene visualizzata una vista. Laravel ha anche visto i creatori. Questi vengono eseguiti quando una vista viene istanziata.

È anche possibile scegliere di utilizzare un BaseController con un metodo setupLayout. Quindi ogni vista che caricherete viene caricata tramite il metodo setupLayout che aggiunge alcuni dati aggiuntivi. Tuttavia, usando i compositori di visualizzazione sei sicuro che il codice sia eseguito. Ma con l'approccio BaseController hai più flessibilità perché puoi saltare il caricamento dei dati extra.

MODIFICA: come accennato da Nic Gutierrez puoi anche utilizzare view share.

+0

La differenza tra questo e 'view() -> share' è che questo viene eseguito solo quando viene usata una vista - ma con 'view() -> share' è eseguito indipendentemente da cosa - potresti restituire alcuni JSON in una chiamata API, ad esempio - che non usa una vista . – Petecoop

14

Create a new Service Provider as suggested in here

aggiungere il nuovo fornitore di servizi per il file di configurazione (config/app.php).

Nel metodo di avvio del nuovo uso Service Provider:

View::share('something_cool', 'this is a cool shared variable'); 

Ora siete pronti per l'uso $ something_cool in tutti i punti di vista.

Spero che questo aiuti.

+0

Inoltre, è la soluzione definitiva per ** variabili utilizzate in più occasioni in una pagina 503 dopo "artigiano in basso". ** Iniettare la stringa di versione di un'app come parametro cache buster o visualizzarla nel footer mentre l'aggiornamento è un lavoro ingrato con altre soluzioni . (utilizzando una variabile env per quella sarebbe probabilmente la soluzione più pulita) – luchaos

+0

questa è una soluzione migliore rispetto alla risposta approvata – Christophvh

+0

Penso che la differenza principale sia che l'utente chiede come avere una variabile * global * disponibile in tutti i template . Con la soluzione accettata l'utente deve ricordare di estendere BaseController e chiamare genitore :: costrutto e con la soluzione ViewComposer ha bisogno di chiamare View :: compositori in ogni metodo di costruzione di controller per rendere disponibili le variabili. –

-6

si può lampeggiare in sessione, è possibile definirlo nel.file env (vars statici)

8

Cercare la soluzione dello stesso problema e trovare la soluzione migliore nella documentazione di Laravel. Basta usare View::share in AppServiceProvider come questo:

View::share('key', 'value'); 

Dettagli here.

1

Inoltre, è possibile farlo nel file Route.php:

view()->share('variableName', $variable);