Как передать данные во все представления в Laravel 5?
Я хочу, чтобы некоторые данные по умолчанию были доступны во всех представлениях в моем приложении Laravel 5.
Я попытался найти его, но только найти результаты для Laravel 4. Я прочитал документацию "обмен данными со всеми представлениями"здесь но я не могу понять, что делать. Где должен быть размещен следующий код?
View::share('data', [1, 2, 3]);
Спасибо за вашу помощь.
11 ответов:
эта цель может достигнуть через Различный метод,
1. Используя BaseController
то, как мне нравится настраивать вещи, я делаю
BaseControllerкласс, который расширяет собственный LaravelController, и настроить различные глобальные вещи там. Все остальные контроллеры затем расширяются от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 но я его сломаю
посмотреть в каталоге 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() { // } }из корня вашего приложения откройте 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' );
- если вы обновите приложение, вы получите сообщение об ошибке, потому что класс 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