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



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



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



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


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

1027   11  

11 ответов:

эта цель может достигнуть через Различный метод,

1. Используя BaseController

то, как мне нравится настраивать вещи, я делаю 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 file через сервис обеспечивают взаимодействие с view.

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

вы можете создать

вы можете создать свой собственный провайдер (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

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

  • The GlobalComposer класс создается1000 раз с помощью App::make.
  • событие composing:some_partial_view_to_display_i обрабатывается 1000 раз.
  • The внутри 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());
  }
}

обновление

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

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

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

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

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

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

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

перейдите в каталог путь app / 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());
        }
    }
    

Теперь перейдите в свой вид или в этом случае профиль.лезвие.PHP и добавить

{{ $count }}

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

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

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

до

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

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

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

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

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

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

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

<?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()
    {
        //
    }
}

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

}

Comments

    Ничего не найдено.