如何将数据传递给Laravel 5中的所有视图?

我想在我的Laravel 5应用程序的所有视图中都可以使用一些默认数据。

我试图search它,但只能findLaravel 4的结果。我已阅读文档“共享数据与所有视图” 在这里,但我不明白该怎么做。 下面的代码应该放在哪里?

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

谢谢你的帮助。

这个目标可以通过不同的方法实现,

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

如果你知道你需要在整个应用程序中为每个请求设置一些视图,那么你也可以通过在请求之前运行的filter来实现,这就是我如何处理Laravel中的User对象。

 App::before(function($request) { // Set up global user object for views View::share('user', User::all()); }); 

要么

你可以定义你自己的filter

 Route::filter('user-filter', function() { View::share('user', User::all()); }); 

并通过简单的filter调用来调用它。

根据版本5更新*

3.使用View Composer

View Composer还有助于绑定特定的数据以不同的方式进行查看。 您可以直接将variables绑定到特定视图或所有视图。 例如,您可以根据需要创build自己的目录来存储视图编辑器文件。 而这些视图作曲文件通过Service提供了与视图的交互。

视图composer php的方法可以用不同的方式,第一个例子可以看起来像:

你可以创build一个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"); } } 

参考

Laravel文档

为进一步澄清Laracast情节

如果还有什么不清楚的,请告诉我。

您可以创build自己的服务提供者 ( ViewServiceProvider名称是通用的),也可以使用现有的AppServiceProvider

在你select的提供者中,把你的代码放在引导方法中。

 public function boot() { view()->share('data', [1, 2, 3]); } 

这将使所有视图都可以访问$datavariables。

如果您宁愿使用外观而不是帮助器,请将view()->更改为View::但不要忘记use View; 在你的文件的顶部。

我发现这是最简单的一个。 创build一个新的提供商和用户的'*'通配符将其附加到所有视图。 在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);来分享variablesView::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类使用App::make实例化1000次。
  • composing:some_partial_view_to_display_i的事件处理1000次。
  • GlobalComposer类中的compose函数被称为1000次。

但部分视图some_partial_view_to_display_iGlobalComposer组成的variables无关,但大大增加了渲染时间。

最好的办法?

使用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()); } } 

更新

如果您正在使用通过中间件pipe道进行计算的东西,则可以简单地监听正确的事件,或将视图共享中间件放在pipe道的最后一个底部。

该文档是听到https://laravel.com/docs/5.4/views#view-composers,但我会分解;

  1. 应用程序的根目录下查找目录app \ Providers ,并创buildComposerServiceProvider.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并查找文件中的Providers部分,并复制并将此“App \ Providers \ ComposerServiceProvider”复制到数组中。

通过这样做,我们创build了Composer服务提供者。 当你运行你的应用程序的视图configuration文件就像这样http:// yourdomain / something / profile ,服务提供者ComposerServiceProvider被调用,类App \ Http \ ViewComposers \ ProfileComposer被实例化,调用方法作曲者由于下面的代码启动方法或function。

  // Using class based composers... View::composer( 'profile', 'App\Http\ViewComposers\ProfileComposer' ); 
  1. 如果刷新应用程序,则会出现错误,因为App \ Http \ ViewComposers \ ProfileComposer类尚不存在。 现在让我们创build它。

转到目录pathapp / Http

  • 创build名为ViewComposers的目录

  • 创build文件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' ); 

在文档中:

通常情况下,您可以在服务提供者的引导方法中调用share方法。 您可以自由地将它们添加到AppServiceProvider中,或者生成一个单独的服务提供程序来保存它们。

我同意Marwelln,只是把它放在启动函数中的AppServiceProvider

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

我build议为variables使用一个特定的名称,以避免与其他没有“全局”variables的混淆或错误。

我认为最好的方式是使用View Composers 。 如果有人来到这里想要find如何使用View Composer的方式,请阅读我的答案=> 如何在所有视图之间共享variables?