Как передать данные во все представления в Laravel 5?
Я хочу иметь некоторые данные по умолчанию, доступные во всех представлениях в моем приложении Laravel 5.
Я попытался найти его, но только найти результаты для Laravel 4. Я прочитал документацию "обмен данными со всеми представлениями"здесь но я не могу понять, что делать. Где следует разместить следующий код?
View::share('data', [1, 2, 3]);
Спасибо за помощь.
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. Использование Filter
если вы точно знаете, что хотите что-то настроить для просмотры по каждому запросу на протяжении всего приложения вы также можете сделать это через фильтр, который запускается перед запросом - так я имею дело с пользовательским объектом в 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
посмотреть Composer также помогает привязывать определенные данные для просмотра по-разному. Вы можете напрямую привязать переменную к определенному представлению или ко всем представлениям. Например, вы можете создать свой собственный каталог для хранения файла view composer в соответствии с требованиями. и эти просмотр файла композитора через службу обеспечивают взаимодействие с 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);
из примера blade view:
@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 раз. - на внутри
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() { // } }
из корня вашего приложения open Config / app.в PHP и найдите раздел провайдеры в файле и скопируйте и мимо этого 'App\Providers\ComposerServiceProvider', в массив.
таким образом, мы создали поставщика услуг Composer. Когда вы запускаете приложение с профилем просмотра, как so 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, прочитайте мой ответ => как поделиться переменной во всех представлениях?
документация hear 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);
}