variabile globale per tutti i controller e le viste

In Laravel ho le impostazioni di una tabella e ho recuperato i dati completi dalla tabella nel BaseController, come segue

public function __construct() { // Fetch the Site Settings object $site_settings = Setting::all(); View::share('site_settings', $site_settings); } 

Ora voglio accedere a $ site_settings. in tutti gli altri controller e visualizzazioni in modo che non sia necessario scrivere lo stesso codice più e più volte, quindi per favore qualcuno mi dica la soluzione o qualsiasi altro modo in modo da poter recuperare i dati dal tavolo una volta e usarlo in tutti i controller e vista.

All’inizio, un file di configurazione è appropriato per questo genere di cose, ma puoi anche usare un altro approccio, che è come indicato di seguito (Laravel – 4):

 // You can keep this in your filters.php file App::before(function($request) { App::singleton('site_settings', function(){ return Setting::all(); }); // If you use this line of code then it'll be available in any view // as $site_settings but you may also use app('site_settings') as well View::share('site_settings', app('site_settings')); }); 

Per ottenere gli stessi dati in qualsiasi controller è ansible utilizzare:

 $site_settings = app('site_settings'); 

Ci sono molti modi, basta usare l’uno o l’altro, quale preferisci ma sto usando il Container .

Va bene, ho intenzione di ignorare completamente la quantità ridicola di ingegneria e ipotesi che le altre risposte sono diffuse e andare con la semplice opzione.

Se stai bene perché ci sia una singola chiamata al database durante ogni richiesta, allora il metodo è semplice, allarmante:

 class BaseController extends \Controller { protected $site_settings; public function __construct() { // Fetch the Site Settings object $this->site_settings = Setting::all(); View::share('site_settings', $this->site_settings); } } 

Ora che tutti i tuoi controller estendono questo BaseController, possono semplicemente fare $this->site_settings .

Se si desidera limitare la quantità di query tra più richieste, è ansible utilizzare una soluzione di caching come precedentemente fornito, ma in base alla domanda, la risposta semplice è una proprietà di class.

Usa la class Config:

 Config::set('site_settings', $site_settings); Config::get('site_settings'); 

http://laravel.com/docs/4.2/configuration

I valori di configurazione impostati in fase di esecuzione sono impostati solo per la richiesta corrente e non verranno trasferiti alle richieste successive.

In Laravel 5.1 avevo bisogno di una variabile globale popolata con dati del modello accessibili in tutte le viste.

Ho seguito un approccio simile alla risposta di ollieread e sono stato in grado di utilizzare la mia variabile ($ notifiche) in qualsiasi vista.

Posizione del mio controller: /app/Http/Controllers/Controller.php

 get_notifications(); View::share('notifications', $notifications); } } 

Posizione del mio modello: /app/Models/Main.php

 namespace App\Models; use Illuminate\Database\Eloquent\Model; use DB; class Main extends Model { public function get_notifications() {... 

In Laravel, 5+ puoi creare un file nella cartella config e creare variabili in quello e utilizzarlo attraverso l’app. Ad esempio, voglio memorizzare alcune informazioni basate sul sito. Creo un file chiamato siteVars.php , che assomiglia a questo

  '[email protected]', 'adminEmail' => '[email protected]' ]; 

Ora nelle routes , controller , views è ansible accedervi utilizzando

 Config::get('siteVars.supportEmail') 

Nelle opinioni se io questo

 {{ Config::get('siteVars.supportEmail') }} 

Darà [email protected]

Spero che questo ti aiuti.

Se sei preoccupato per l’accesso ripetuto al database, assicurati di avere un tipo di memorizzazione nella cache incorporata nel tuo metodo in modo che le chiamate al database vengano effettuate solo una volta per ogni richiesta di pagina.

Qualcosa come (esempio semplificato):

 class Settings { static protected $all; static public function cachedAll() { if (empty(self::$all)) { self::$all = self::all(); } return self::$all; } } 

Quindi Settings::cachedAll() invece di all() e questo farebbe solo una chiamata al database per ogni richiesta di pagina. Le chiamate successive utilizzeranno il contenuto già recuperato memorizzato nella cache nella variabile di class.

L’esempio sopra è semplicissimo e utilizza una cache in memoria, quindi dura solo per la singola richiesta. Se lo si desidera, è ansible utilizzare il caching di Laravel (utilizzando Redis o Memcached) per mantenere le impostazioni su più richieste. Puoi leggere ulteriori informazioni sulle opzioni di caching molto semplici qui:

http://laravel.com/docs/cache

Ad esempio potresti aggiungere un metodo al tuo modello di Settings che assomiglia a:

 static public function getSettings() { $settings = Cache::remember('settings', 60, function() { return Settings::all(); }); return $settings; } 

Ciò farebbe solo una chiamata al database ogni 60 minuti altrimenti restituirebbe il valore memorizzato nella cache ogni volta che si chiama Settings::getSettings() .

Le risposte più popolari qui con BaseController non hanno funzionato per me su Laravel 5.4, ma hanno funzionato su 5.3. Non ho idea del perché.

Ho trovato un modo che funziona su Laravel 5.4 e fornisce variabili anche per le viste che stanno saltando i controller. E, naturalmente, puoi ottenere variabili dal database.

aggiungi la tua app/Providers/AppServiceProvider.php

 class AppServiceProvider extends ServiceProvider { public function boot() { // Using view composer to set following variables globally view()->composer('*',function($view) { $view->with('user', Auth::user()); $view->with('social', Social::all()); // if you need to access in controller and views: Config::set('something', $something); }); } } 

credito: http://laraveldaily.com/global-variables-in-base-controller/

 View::share('site_settings', $site_settings); 

Aggiungere a

app->Providers->AppServiceProvider avvio del file app->Providers->AppServiceProvider

è una variabile globale.

Vedo che questo è ancora necessario per 5.4+ e ho appena avuto lo stesso problema, ma nessuna delle risposte era abbastanza pulita, quindi ho cercato di ottenere la disponibilità con ServiceProviders . Ecco cosa ho fatto:

  1. Creato il Provider SettingsServiceProvider
     php artisan make: provider SettingsServiceProvider
  1. Creato il modello di cui avevo bisogno ( GlobalSettings )
     php artigianale: modello GlobalSettings
  1. Modificato il metodo di register generato in \App\Providers\SettingsServiceProvider . Come puoi vedere, recupero le mie impostazioni usando il modello eloquente per esso con Setting::all() .
 public function register() { $this->app->singleton('App\GlobalSettings', function ($app) { return new GlobalSettings(Setting::all()); }); } 
  1. Definiti alcuni parametri e metodi utili (incluso il costruttore con il parametro Collection necessario) in GlobalSettings
 class GlobalSettings extends Model { protected $settings; protected $keyValuePair; public function __construct(Collection $settings) { $this->settings = $settings; foreach ($settings as $setting){ $this->keyValuePair[$setting->key] = $setting->value; } } public function has(string $key){ /* check key exists */ } public function contains(string $key){ /* check value exists */ } public function get(string $key){ /* get by key */ } } 
  1. Finalmente ho registrato il provider in config/app.php
 'providers' => [ // [...] App\Providers\SettingsServiceProvider::class ] 
  1. Dopo aver svuotato la cache di configurazione con php artisan config:cache puoi usare il tuo singleton come segue.
 $foo = app(App\GlobalSettings::class); echo $foo->has("company") ? $foo->get("company") : "Stack Exchange Inc."; 

È ansible leggere ulteriori informazioni sui contenitori di servizi e sui provider di servizi in Documenti Laravel> Service Container e Laravel Docs> Provider di servizi.

Questa è la mia prima risposta e non ho avuto molto tempo per scriverlo, quindi la formattazione è un po ‘particolare, ma spero che tu abbia tutto.


Ho dimenticato di includere il metodo di boot di SettingsServiceProvider , per rendere la variabile delle impostazioni globale disponibile nelle visualizzazioni, quindi ecco qua:

 public function boot(GlobalSettings $settinsInstance) { View::share('globalsettings', $settinsInstance); } 

Prima che i metodi di avvio vengano richiamati, tutti i provider sono stati registrati, quindi possiamo semplicemente utilizzare la nostra istanza GlobalSettings come parametro, in modo che possa essere iniettata da Laravel.

Nel modello di lama:

 {{ $globalsettings->get("company") }} 

In Laravel 5+, per impostare una variabile solo una volta e accedervi ‘globalmente’, trovo più semplice aggiungerla come attributo alla richiesta:

 $request->attributes->add(['myVar' => $myVar]); 

Quindi puoi accedervi da uno qualsiasi dei tuoi controller usando:

 $myVar = $request->get('myVar'); 

e da uno qualsiasi dei tuoi blade che utilizza:

 {{ Request::get('myVar') }} 

Ci sono due opzioni:

  1. Creare un file di class php all’interno di app / librerie / YourClassFile.php

    un. Qualsiasi funzione creata in essa sarebbe facilmente accessibile in tutte le viste e i controller.

    b. Se si tratta di una funzione statica, puoi facilmente accedervi tramite il nome della class.

    c. Assicurati di includere “app / libraries” nella classmap autoload nel file del compositore.

  2. In app / config / app.php crea una variabile e puoi fare riferimento allo stesso usando

    Config :: get ( ‘nome_variabile’);

Spero che questo ti aiuti.

Modifica 1:

Esempio per il mio primo punto:

 // app/libraries/DefaultFunctions.php class DefaultFunctions{ public static function getSomeValue(){ // Fetch the Site Settings object $site_settings = Setting::all(); return $site_settings; } } //composer.json "autoload": { "classmap": [ .. .. .. "app/libraries" // add the libraries to access globaly. ] } //YourController.php $default_functions = new DefaultFunctions(); $default_functions->getSomeValue();