如何在 Laravel 5 中向所有视图传递数据?
如何在 Laravel 5 中向所有视图传递数据?
我想在Laravel 5 应用程序的所有视图中都能访问一些默认数据。
我试图搜索这个问题,但只能找到Laravel 4 的结果。我已经阅读了文档“在所有视图中共享数据”这里,但我不知道该把以下代码放在哪里
View::share('data', [1, 2, 3]);
感谢您的帮助。
你可以创建自己的服务提供者(通常命名为ViewServiceProvider
),或者使用现有的AppServiceProvider
。
在你选择的提供者中,在boot
方法中放置你的代码。
public function boot() { view()->share('data', [1, 2, 3]); }
这将使$data
变量在所有视图中都可访问。
如果你更喜欢使用facade而不是帮助程序,请将view()->
更改为View::
,但不要忘记在文件顶部添加use View;
。
这个目标可以通过不同的方法实现,
1. 使用BaseController
我喜欢设置这样的方式,我创建一个BaseController类来继承Laravel自己的Controller,并在其中设置一些全局的内容,然后其他所有控制器都会扩展自BaseController而不是Laravel的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. 使用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. 使用中间件
使用middleware
和View::share
Route::group(['middleware' => 'SomeMiddleware'], function(){ // routes }); class SomeMiddleware { public function handle($request) { \View::share('user', auth()->user()); } }
4. 使用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"); } }
之后,在"providers"部分下的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"); } }
参考资料
欲了解详细信息,请参见Laracast Episode
如果还有不清楚的地方,请让我知道。