如何将数据传递给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]); }
这将使所有视图都可以访问$data
variables。
如果您宁愿使用外观而不是帮助器,请将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_i
与GlobalComposer
组成的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,但我会分解;
-
在应用程序的根目录下查找目录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() { // } }
-
从应用程序的根目录打开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' );
- 如果刷新应用程序,则会出现错误,因为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?