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


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

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

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

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

Author: Ragnarsson, 2015-02-19

11 answers

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

1. Использование базового контроллера

Как мне нравится настраивать, я создаю класс BaseController, который расширяет собственный класс Laravel Controller, и настраиваю там различные глобальные вещи. Все остальные контроллеры затем расширяются от 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. Использование Фильтра

Если вы точно знаете, что хотите что-то настроить для просмотров по каждому запросу на протяжении всего приложение, вы также можете сделать это с помощью фильтра, который запускается перед запросом - вот как я работаю с объектом пользователя в 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 в разделе "поставщики" раздел.

Testviewкомпозер

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

Для Дальнейшего Разъяснения Эпизод с Ларакастом

Если с моей стороны все еще что-то неясно, позвольте мне знать.

 135
Author: Safoor Safdar, 2017-09-11 13:45:12

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

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

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

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

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

 48
Author: Marwelln, 2015-02-19 14:51:15

Я обнаружил, что это самый простой вариант. Создайте нового поставщика и используйте подстановочный знак '*', чтобы прикрепить его ко всем представлениям. Также работает в 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()
    {
        //
    }
}
 7
Author: Stan Smulders, 2016-09-28 11:07:22

Лучшим способом было бы совместное использование переменной с помощью 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());
  }
}

Обновление

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

 3
Author: Reza Shadman, 2016-11-22 11:53:52

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

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

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

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

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

 2
Author: Santiago Mendoza Ramirez, 2015-02-19 14:56:48

Документация слушается 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 и найдите раздел Поставщики в файле и скопируйте и вставьте это "Приложение\Поставщики\Составители", в массив.

Сделав это, мы создали поставщика услуг 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 еще не существует. Теперь давайте создадим его.

Перейдите по пути к каталогу app/Http

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

  • Создайте файл 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'
);
 2
Author: Samuel Kwame Antwi, 2017-04-08 16:04:15

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

 0
Author: Panagiotis Koursaris, 2017-05-23 12:34:39

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

 0
Author: Samuel Kwame Antwi, 2017-04-08 14:39:01

Внутри вашей папки конфигурации вы можете создать файл php, назовите его, например"variable.php "с содержанием ниже:

<?php return [ 'versionNumber' => '122231', ];

Теперь во всех представлениях вы можете использовать config('variable.versionNumber') для вызова этой переменной.

 0
Author: Mehran, 2018-04-08 03:43:11

Добавьте их поставщику услуг приложений в метод загрузки

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('signedIn', \Auth::check());

     View::share('user', \Auth::user());
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
 0
Author: Nasser Ali Karimi, 2018-04-11 06:01:10

Метод Laravel 5.6: https://laravel.com/docs/5.6/views#passing-data-to-views

Пример, с общим доступом к коллекции моделей для всех представлений (AppServiceProvider.php ):

use Illuminate\Support\Facades\View;
use App\Product;

public function boot()
{
    $products = Product::all));
    View::share('products', $products);

}
 0
Author: Alexander Kim, 2018-06-30 10:04:23