Come posso fare in Laravel 5 una variabile globale che sarà disponibile in tutti i modelli Blade?Laravel 5: variabile globale di visualizzazione Blade disponibile in tutti i modelli
risposta
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:
- 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');
}
}
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. –
In realtà questo ha funzionato: ' = $ Utente ['nome']; ?> 'ma questo non ha funzionato:' {{$ user-> name}} ' –
@Chad Priddle Questo dovrebbe funzionare per un array' {{$ user ['name']}} 'mentre questo funziona per un oggetto '{{$ user-> nome}}' – Digitlimit
È 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.
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
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.
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
questa è una soluzione migliore rispetto alla risposta approvata – Christophvh
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. –
si può lampeggiare in sessione, è possibile definirlo nel.file env (vars statici)
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.
Inoltre, è possibile farlo nel file Route.php
:
view()->share('variableName', $variable);
http://laravel.com/docs/5.0/views#view-composers – lukasgeiter