Как передавать данные во все виды в Laravel 5?

Я хочу, чтобы некоторые данные по умолчанию были доступны во всех представлениях в моем приложении Laravel 5.

Я попытался найти его, но только найти результаты для Laravel 4. Я прочитал документацию «Совместное использование данных со всеми представлениями» здесь, но я не могу понять, что делать. Где должен быть размещен следующий код?

View::share('data', [1, 2, 3]); 

Спасибо за вашу помощь.

Эта цель может достигаться с помощью другого метода,

1. Использование BaseController

Как мне нравится настраивать вещи, я делаю класс BaseController который расширяет собственный Controller Laravel и настраивает там различные глобальные вещи. Все остальные контроллеры затем распространяются от BaseController а не контроллера Laravel.

 class BaseController extends Controller { public function __construct() { //its just a dummy data object. $user = User::all(); // Sharing is caring View::share('user', $user); } } 

2. Использование фильтра

Если вам известно, что вы хотите, чтобы что-то настроенное для просмотров по каждому запросу по всему приложению, вы также можете сделать это с помощью фильтра, который выполняется перед запросом, – вот как я общаюсь с объектом User в Laravel.

 App::before(function($request) { // Set up global user object for views View::share('user', User::all()); }); 

ИЛИ

Вы можете определить свой собственный фильтр

 Route::filter('user-filter', function() { View::share('user', User::all()); }); 

и называть его простым вызовом фильтра.

Обновление по версии 5. *

3. Использование View Composer

View Composer также помогает привязывать определенные данные для просмотра по-разному. Вы можете напрямую привязать переменную к определенному виду или ко всем представлениям. Например, вы можете создать свой собственный каталог для хранения файла композитора вида в соответствии с требованием. и эти файлы композиций представления через службу обеспечивают взаимодействие с представлением.

Просмотр метода композитора может использоваться по-разному, Первый пример может выглядеть одинаково:

Вы можете создать каталог App\Http\ViewComposers .

Поставщик услуг

 namespace App\Providers; use Illuminate\Support\ServiceProvider; class ViewComposerServiceProvider extends ServiceProvider { public function boot() { view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer"); } } 

После этого добавьте этого провайдера в config / app.php в разделе «поставщики».

TestViewComposer

 namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; class TestViewComposer { public function compose(View $view) { $view->with('ViewComposerTestVariable', "Calling with View Composer Provider"); } } 

ViewName.blade.php

 Here you are... {{$ViewComposerTestVariable}} 

Этот метод может помочь только для определенного вида. Но если вы хотите вызвать ViewComposer для всех представлений, мы должны применить это единственное изменение к ServiceProvider.

 namespace App\Providers; use Illuminate\Support\ServiceProvider; class ViewComposerServiceProvider extends ServiceProvider { public function boot() { view()->composer('*',"App\Http\ViewComposers\TestViewComposer"); } } 

Справка

Документация Laravel

Для дальнейшего уточнения Laracast Episode

Скажите мне, если еще что-то неясно с моей стороны.

Вы можете либо создать своего собственного поставщика услуг ( ViewServiceProvider имя ViewServiceProvider ), либо вы можете использовать существующий AppServiceProvider .

В выбранном вами провайдере введите свой код в метод загрузки.

 public function boot() { view()->share('data', [1, 2, 3]); } 

Это сделает переменную $data доступной во всех ваших представлениях.

Если вы предпочитаете использовать фасад вместо помощника, измените view()-> на View:: но не забудьте use View; в верхней части файла.

Я нашел это самым простым. Создайте нового поставщика и пользователя подстановочный знак '*' чтобы прикрепить его ко всем представлениям. Работает также в 5.3 🙂

 <?php namespace App\Providers; use Illuminate\Http\Request; use Illuminate\Support\ServiceProvider; class ViewServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * @return void */ public function boot() { view()->composer('*', function ($view) { $user = request()->user(); $view->with('user', $user); }); } /** * Register the application services. * * @return void */ public function register() { // } } 

Лучший способ – обмен информацией с помощью View::share('var', $value);

Проблемы с составлением с использованием "*" :

Рассмотрим следующий подход:

 <?php // from AppServiceProvider::boot() $viewFactory = $this->app->make(Factory::class); $viewFacrory->compose('*', GlobalComposer::class); 

Из примера:

  @for($i = 0; $i<1000; $i++) @include('some_partial_view_to_display_i', ['toDisplay' => $i]) @endfor 

Что происходит?

  • Класс GlobalComposer создается 1000 раз, используя App::make .
  • Событие, composing:some_partial_view_to_display_i , обрабатывается 1000 раз.
  • Функция compose внутри класса GlobalComposer называется 1000 раз.

Но частичный вид some_partial_view_to_display_i имеет ничего общего с переменными, составленными GlobalComposer но значительно увеличивает время рендеринга.

Лучший подход?

Использование View::share по объединенному промежуточному программному обеспечению.

 Route::group(['middleware' => 'WebMiddleware'], function(){ // Web routes }); Route::group(['prefix' => 'api'], function (){ }); class WebMiddleware { public function handle($request) { \View::share('user', auth()->user()); } } 

Обновить

Если вы используете что-то, что вычисляется по конвейеру промежуточного программного обеспечения, вы можете просто прослушать соответствующее событие или поместить промежуточное ПО shareware в последнюю нижнюю часть конвейера.

Документация слышится https://laravel.com/docs/5.4/views#view-composers, но я сломаю ее

  1. Найдите каталог app \ Providers в корневой папке вашего приложения и создайте файл ComposerServiceProvider.php и скопируйте и пропустите текст ниже и сохраните его.

     <?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider { /** * Register bindings in the container. * * @return void */ public function boot() { // Using class based composers... View::composer( 'profile', 'App\Http\ViewComposers\ProfileComposer' ); // Using Closure based composers... View::composer('dashboard', function ($view) { // }); } /** * Register the service provider. * * @return void */ public function register() { // } } 
  2. Из корня вашего приложения откройте Config / app.php и найдите раздел «Провайдеры» в файле и скопируйте и пройдите мимо этого «App \ Providers \ ComposerServiceProvider» в массив.

Делая это, мы создали Поставщика услуг Composer. Когда вы запускаете свое приложение с профилем вида так, чтобы он вызывал http: // yourdomain / something / profile , вызывается поставщик услуг ComposerServiceProvider и экземпляр класса App \ Http \ ViewComposers \ ProfileComposer, вызывающий метод Composer из-за кода ниже внутри загрузки или функции.

  // Using class based composers... View::composer( 'profile', 'App\Http\ViewComposers\ProfileComposer' ); 
  1. Если вы обновите приложение, вы получите сообщение об ошибке, поскольку класс App \ Http \ ViewComposers \ ProfileComposer еще не существует. Теперь давайте создадим его.

Перейдите в приложение каталога / приложение Http

  • Создайте каталог с именем ViewComposers

  • Создайте файл ProfileComposer.php .

     class ProfileComposer { /** * The user repository implementation. * * @var UserRepository */ protected $users; /** * Create a new profile composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // Dependencies automatically resolved by service container... $this->users = $users; } /** * Bind data to the view. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); } } 

Теперь перейдите к своему представлению или в этом случае Profile.blade.php и добавьте

 {{ $count }} 

и это покажет количество пользователей на странице профиля.

Чтобы показать счет на всех страницах, измените

 // Using class based composers... View::composer( 'profile', 'App\Http\ViewComposers\ProfileComposer' ); 

к

 // Using class based composers... View::composer( '*', 'App\Http\ViewComposers\ProfileComposer' ); 

В документации:

Как правило, вы отправляете вызовы методу share в способе загрузки поставщика услуг. Вы можете добавлять их в AppServiceProvider или создавать отдельный поставщик услуг для их размещения.

Я согласен с Marwelln, просто поставьте его в AppServiceProvider в функции загрузки:

 public function boot() { View::share('youVarName', [1, 2, 3]); } 

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

Я думаю, что лучший способ – View Composers . Если кто-то пришел сюда и хочет найти способ сделать это с помощью метода View Composers, прочитайте мой ответ => Как разделить переменную во всех представлениях?

Документация слышится https://laravel.com/docs/5.4/views#view-composers, но я сломаю ее 1. Посмотрите на каталог Провайдеры в корневом каталоге и создайте для ComposerServiceProvider.php содержимое