Как передавать данные во все виды в Laravel 5?
Я хочу, чтобы некоторые данные по умолчанию были доступны во всех представлениях в моем приложении Laravel 5.
Я попытался найти его, но только найти результаты для Laravel 4. Я прочитал документацию "Совместное использование данных со всеми видами" здесь, но я не могу понять, что делать. Где должен быть размещен следующий код?
View::share('data', [1, 2, 3]);
Спасибо за вашу помощь.
Ответы
Ответ 1
Эта цель может быть достигнута с помощью другого метода,
1. Использование BaseController
Как мне нравится это настраивать, я делаю класс BaseController
, который расширяет собственный Laravels Controller
, и настраиваю там различные глобальные вещи. Все остальные контроллеры тогда выходят из BaseController
, а не из Laravels Controller.
class BaseController extends Controller
{
public function __construct()
{
//its just a dummy data object.
$user = User::all();
// Sharing is caring
View::share('user', $user);
}
}
2. Использование фильтра
Если вы точно знаете, что вам нужно что-то настроить для представлений по каждому запросу во всем приложении, вы также можете сделать это с помощью фильтра, который выполняется перед запросом - так я поступаю с объектом User в 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. Использование Middleware
Использование View::share
с middleware
Route::group(['middleware' => 'SomeMiddleware'], function(){
// routes
});
class SomeMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
4. Использование View Composer
View Composer также помогает связывать определенные данные для просмотра различными способами. Вы можете напрямую привязать переменную к конкретному представлению или ко всем представлениям. Например, вы можете создать свой собственный каталог для хранения вашего файла 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 в разделе "провайдеры".
TestViewComposer
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");
}
}
Reference
Документация Laravel
Для дальнейшего уточнения Эпизод Laracast
Если что-то неясно с моей стороны, дайте мне знать.
Ответ 2
Вы можете либо создать свой собственный поставщик услуг (ViewServiceProvider
имя является общим), либо вы можете использовать существующий AppServiceProvider
.
В выбранном поставщике введите код в метод загрузки.
public function boot() {
view()->share('data', [1, 2, 3]);
}
Это сделает переменную $data
доступной во всех ваших представлениях.
Если вы предпочитаете использовать фасад вместо помощника, измените view()->
на View::
, но не забудьте оставить use View;
в верхней части файла.
Ответ 3
Я нашел, что это самый простой. Создайте нового поставщика и пользователя подстановочный знак '*'
, чтобы прикрепить его ко всем представлениям. Работает также в 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()
{
//
}
}
Ответ 4
Лучший способ - обмен информацией с помощью 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());
}
}
Обновление
Если вы используете что-то, что вычисляется по конвейеру промежуточного программного обеспечения, вы можете просто прослушать в нужное событие или поместить промежуточное программное обеспечение share share на последней нижней части конвейера.
Ответ 5
В документации:
Как правило, вы должны отправлять вызовы методу share в службе метод загрузки поставщика. Вы можете добавить их в AppServiceProvider или создать отдельный поставщик услуг для размещения их.
Я согласен с Marwelln, просто поставьте его в AppServiceProvider
в функции загрузки:
public function boot() {
View::share('youVarName', [1, 2, 3]);
}
Я рекомендую использовать определенное имя для переменной, чтобы избежать конфуций или ошибок с другими глобальными переменными.
Ответ 6
Документация слышится 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 еще не существует. Теперь давайте создадим его.
Перейдите в каталог path application/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());
}
}
Теперь перейдите к своему представлению или в этом случае Profile.blade.php и добавьте
{{ $count }}
и это покажет количество пользователей на странице профиля.
Чтобы показать счет на всех страницах, измените
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
To
// Using class based composers...
View::composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);
Ответ 7
Я думаю, что лучший способ - View Composers
. Если кто-то пришел сюда и захочет найти способ сделать это с помощью View Composers, прочитайте мой ответ = > Как передать переменную во всех представлениях?
Ответ 8
Документация здесь https://laravel.com/docs/5.4/views#view-composers, но я сломаю ее
1. Найдите поставщиков каталога в вашем корневом каталоге и создайте файл для ComposerServiceProvider.php с содержимым.
Ответ 9
Внутри вашей папки конфигурации вы можете создать имя php файла, например, "variable.php" с содержанием ниже:
<?php
return [
'versionNumber' => '122231',
];
Теперь внутри всех представлений вы можете использовать его как
config('variable.versionNumber')
Ответ 10
добавьте их поставщику услуг приложений в режиме загрузки
<?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()
{
//
}
}
Ответ 11
Метод 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);
}