глобальная переменная для всех controllerов и просмотров

В Laravel у меня есть настройки таблицы, и я получил полные данные из таблицы в BaseController, как показано ниже.

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

Теперь я хочу получить доступ к $ site_settings. во всех других controllerах и представлениях, так что мне не нужно писать один и тот же код снова и снова, поэтому кто-нибудь, пожалуйста, скажите мне решение или любым другим способом, чтобы я мог однажды извлечь данные из таблицы и использовать их во всех controllerах и Посмотреть.

Сначала конфигурационный файл подходит для такого рода вещей, но вы также можете использовать другой подход, который приведен ниже (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')); }); 

Чтобы получить те же данные в любом controllerе, вы можете использовать:

 $site_settings = app('site_settings'); 

Есть много способов, просто используйте тот или иной, который вы предпочитаете, но я использую Container .

Хорошо, я собираюсь полностью игнорировать смехотворную сумму над разработкой и предположениями, что другие ответы изобилуют и идут с простым вариантом.

Если у вас все в порядке, чтобы быть единственным вызовом базы данных во время каждого запроса, тогда метод прост, тревожно:

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

Теперь, при условии, что все ваши controllerы расширяют этот BaseController, они могут просто выполнить $this->site_settings .

Если вы хотите ограничить количество запросов по нескольким запросам, вы можете использовать кэширующее решение, как указано ранее, но на основе вашего вопроса простой ответ – это свойство classа.

Используйте class Config:

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

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

Значения конфигурации, установленные во время выполнения, устанавливаются только для текущего запроса и не переносятся на последующие запросы.

В Laravel 5.1 мне нужна глобальная переменная, заполненная данными модели, доступными во всех представлениях.

Я последовал аналогичному подходу к ответу ollieread и смог использовать свою переменную ($ notifications) в любом представлении.

Место моего controllerа: /app/Http/Controllers/Controller.php

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

Место моей модели: /app/Models/Main.php

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

В Laravel, 5+, вы можете создать файл в папке config и создать в нем переменные и использовать его в приложении. Например, я хочу сохранить некоторую информацию на основе сайта. Я создаю файл под названием siteVars.php , который выглядит так:

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

Теперь на routes , controller , views вы можете получить к нему доступ, используя

 Config::get('siteVars.supportEmail') 

В представлениях, если я это

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

Он даст [email protected]

Надеюсь это поможет.

Если вас беспокоит многократный доступ к базе данных, убедитесь, что у вас есть какое-то кэширование, встроенное в ваш метод, чтобы вызовы базы данных делались только один раз на запрос страницы.

Что-то вроде (упрощенный пример):

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

Затем вы получите доступ к Settings::cachedAll() а не all() и это приведет только к одному запросу базы данных на страницу. Последующие вызовы будут использовать уже полученное содержимое, кэшированное в переменной classа.

Вышеприведенный пример супер прост и использует кеш в памяти, поэтому он длится только для одного запроса. Если вы этого захотите, вы можете использовать кеширование Laravel (используя Redis или Memcached), чтобы сохранить свои настройки в нескольких запросах. Вы можете узнать больше об очень простых вариантах кеширования здесь:

http://laravel.com/docs/cache

Например, вы можете добавить метод в свою модель Settings которая выглядит так:

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

Это будет делать только вызов базы данных каждые 60 минут, иначе он будет возвращать кешированное значение всякий раз, когда вы вызываете Settings::getSettings() .

Самые популярные ответы здесь, в BaseController, не работали для меня на Laravel 5.4, но они работали над 5.3. Не знаю, почему.

Я нашел способ, который работает на Laravel 5.4 и дает переменные даже для просмотров, которые пропускают controllerы. И, конечно же, вы можете получить переменные из базы данных.

добавьте в 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); }); } } 

кредит: http://laraveldaily.com/global-variables-in-base-controller/

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

добавить в

app->Providers->AppServiceProvider загрузки файла app->Providers->AppServiceProvider

это глобальная переменная.

Я вижу, что это все еще необходимо для 5.4+, и у меня была такая же проблема, но ни один из ответов не был достаточно чистым, поэтому я попытался выполнить доступность с помощью ServiceProviders . Вот что я сделал:

  1. Создан провайдер SettingsServiceProvider
     php artisan make: поставщик SettingsServiceProvider
  1. Создал нужную мне модель ( GlobalSettings )
     php artisan make: модель GlobalSettings
  1. Отредактирован созданный метод register в \App\Providers\SettingsServiceProvider . Как вы можете видеть, я извлекаю свои настройки, используя для этого красноречивую модель с Setting::all() .
 public function register() { $this->app->singleton('App\GlobalSettings', function ($app) { return new GlobalSettings(Setting::all()); }); } 
  1. Определены некоторые полезные параметры и методы (включая конструктор с необходимым параметром Collection ) в 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. Наконец, я зарегистрировал провайдера в config/app.php
 'providers' => [ // [...] App\Providers\SettingsServiceProvider::class ] 
  1. После очистки кеша конфигурации с помощью конфигурационного кеша php artisan config:cache вы можете использовать свой синглтон следующим образом.
 $foo = app(App\GlobalSettings::class); echo $foo->has("company") ? $foo->get("company") : "Stack Exchange Inc."; 

Вы можете больше узнать о контейнерах и поставщиках услуг в Laravel Docs> Service Container и Laravel Docs> Service Providers.

Это мой первый ответ, и у меня было мало времени, чтобы записать его, поэтому форматирование немного немного, но я надеюсь, что вы получите все.


Я забыл включить метод boot SettingsServiceProvider , чтобы сделать переменные параметров глобальными доступными в представлениях, поэтому здесь вы идете:

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

Прежде чем методы загрузки будут вызваны, все поставщики зарегистрированы, поэтому мы можем просто использовать наш экземпляр GlobalSettings качестве параметра, поэтому его можно ввести Laravel.

В шаблоне клинка:

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

В Laravel 5+, чтобы установить переменную только один раз и получить доступ к ней «глобально», мне проще всего просто добавить ее как атрибут запроса:

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

Затем вы можете получить доступ к нему с любого из ваших controllerов, используя:

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

и с любого из ваших лезвий, используя:

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

Существует два варианта:

  1. Создайте файл classа php внутри приложения / библиотек / YourClassFile.php

    а. Любая функция, которую вы создаете в ней, будет легко доступна во всех представлениях и controllerах.

    б. Если это статическая функция, вы можете легко получить к ней доступ по имени classа.

    с. Удостоверьтесь, что вы включили «приложение / библиотеки» в classlap для автозагрузки в файле композитора.

  2. В app / config / app.php создайте переменную, и вы можете ссылаться на то же самое, используя

    Config :: получить ( ‘имя_переменной’);

Надеюсь это поможет.

Изменить 1:

Пример для моего первого пункта:

 // 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(); 
  • Глобальные переменные в cocoa / цель-C?
  • Когда можно использовать глобальную переменную в C?
  • Объявление глобальной переменной в MATLAB
  • Ошибка компилятора: «Инициализатор не является константой времени компиляции»
  • Обмен переменной между controllerами в angular.js
  • Вызывает ли C ++ деструкторы для глобальных и classовых переменных?
  • Глобальная переменная Android
  • Глобальные переменные в c # .net
  • Глобальные переменные в AngularJS
  • Как создать глобальную переменную?
  • Как объявить глобальную переменную в VBA?
  • Давайте будем гением компьютера.