Как передать данные во все представления в Laravel 5?
Я хочу, чтобы некоторые данные по умолчанию были доступны во всех представлениях в моем приложении Laravel 5.
Я пытался найти его, но нашел только результаты для Laravel 4. Я прочитал документацию "Обмен данными со всеми представлениями" здесь, но я не могу понять, что делать. Где должен быть размещен следующий код?
View::share('data', [1, 2, 3]);
Спасибо за вашу помощь.
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");
}
}
Ссылка
Для Дальнейшего Разъяснения Эпизод с Ларакастом
Если с моей стороны все еще что-то неясно, позвольте мне знать.
Вы можете либо создать своего собственного поставщика услуг (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());
}
}
Обновление
Если вы используете что-то, что вычисляется по конвейеру промежуточного программного обеспечения, вы можете просто прослушать соответствующее событие или поместить промежуточное программное обеспечение общего доступа к представлению в последнюю нижнюю часть трубопровод.
В документации:
Как правило, вы выполняете вызовы метода общего доступа в службе метод загрузки провайдера. Вы можете добавить их в 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 и найдите раздел Поставщики в файле и скопируйте и вставьте это "Приложение\Поставщики\Составители", в массив.
Сделав это, мы создали поставщика услуг 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
Создайте каталог под названием Составители представлений
-
Создайте файл 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'
);
Я думаю, что лучший способ - это View Composers
. Если кто-то пришел сюда и хочет узнать, как это можно сделать с помощью View Composers, прочитайте мой ответ => Как совместно использовать переменную во всех представлениях?
Документация слушается https://laravel.com/docs/5.4/views#view-composers но я разобью его 1. Найдите поставщиков каталогов в своем корневом каталоге и создайте для ComposerServiceProvider.php с содержанием
Внутри вашей папки конфигурации вы можете создать файл php, назовите его, например"variable.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);
}