在Laravel中传递所有视图的数据
在Laravel中传递所有视图的数据
我想在我的Laravel 5应用程序的所有视图中都能访问一些默认数据。
我已经尝试搜索,但只找到了Laravel 4的结果。我已阅读了文档“与所有视图共享数据”here,但我不知道该把下面的代码放在哪里?
View::share('data', [1, 2, 3]);
谢谢您的帮助。
在Laravel中,有时候我们需要在所有视图中共享一些数据。解决这个问题的方法之一是创建自己的服务提供者(通常命名为`ViewServiceProvider`),或者可以使用现有的`AppServiceProvider`。无论选择哪种方式,都需要在所选的提供者中的`boot`方法中放置代码。代码如下:
public function boot() { view()->share('data', [1, 2, 3]); }
这将使得`$data`变量在所有视图中都可以访问。
如果你更喜欢使用外观(facade)而不是助手函数,可以将`view()->`改为`View::`,但不要忘记在文件顶部加上`use View;`。
如果你只需要共享一两个变量,将其放在`AppServiceProvider`中是可以的。但是如果你需要共享更多的内容,建议创建一个新的提供者。
需要注意的是,如果你在`boot()`方法中获取数据库记录,这种方法将不起作用。因为在执行迁移之前,`boot()`方法会被调用,这样你就会在数据库记录存在之前尝试获取它们。至少在我的情况下是这样。另外,这种方法似乎无法与共享登录用户`Auth::user()`一起使用,但是Safoor在下面的回答中给出了解决方法。
如果你从Redis中获取一些缓存数据,可以使用类似的方法来共享这些数据。
在Laravel中,我们经常需要将数据传递给视图,以便在视图中使用该数据。本文将介绍如何在Laravel中传递数据给所有视图的方法以及解决方法。
在Laravel中,有多种方法可以实现将数据传递给所有视图:
1. 使用BaseController
首先,我们可以创建一个名为BaseController
的类,它继承自Laravel的Controller
类,并在其中设置各种全局数据。其他控制器可以继承自BaseController
而不是Laravel的Controller。
class BaseController extends Controller { public function __construct() { //这只是一个虚拟数据对象。 $user = User::all(); //共享数据 View::share('user', $user); } }
2. 使用过滤器
如果你确定你想要在整个应用程序的每个请求中为视图设置一些数据,你还可以通过在请求之前运行一个过滤器来实现这一点。下面是我在Laravel中处理User对象的示例。
App::before(function($request) { //为视图设置全局用户对象 View::share('user', User::all()); });
或者你可以定义自己的过滤器:
Route::filter('user-filter', function() { View::share('user', User::all()); });
然后通过简单的过滤器调用来调用它。
3. 使用中间件
在Laravel 5.*中,我们可以使用middleware
和View::share
来实现将数据传递给所有视图。
Route::group(['middleware' => 'SomeMiddleware'], function(){ // routes }); class SomeMiddleware { public function handle($request) { \View::share('user', auth()->user()); } }
4. 使用视图组合器(View Composer)
视图组合器也可以帮助将特定数据绑定到视图中的不同部分。你可以直接将变量绑定到特定的视图或所有视图上。例如,你可以根据需要创建自己的目录来存储视图组合器文件,并通过服务提供者与视图进行交互。
视图组合器可以有不同的使用方法,首个示例可能如下所示:
你可以创建一个App\Http\ViewComposers
目录。
Service Provider
namespace App\Providers; use Illuminate\Support\ServiceProvider; class ViewComposerServiceProvider extends ServiceProvider { public function boot() { view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer"); } }
然后,在config/app.php文件的"providers"部分中添加此提供者。
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}}
这种方法只适用于特定的视图。但是,如果你想将视图组合器应用于所有视图,只需对ServiceProvider进行一处更改即可。
namespace App\Providers; use Illuminate\Support\ServiceProvider; class ViewComposerServiceProvider extends ServiceProvider { public function boot() { view()->composer('*', "App\Http\ViewComposers\TestViewComposer"); } }
以上就是在Laravel中传递数据给所有视图的方法和解决方法。根据不同的需求,你可以选择适合自己的方法来实现此目标。
参考资料:
[Laravel文档](http://laravel.com/docs/5.1/views#view-composers)
[Laracast Episode](https://laracasts.com/series/laravel-5-fundamentals/episodes/25)
在Laravel中,有时候我们希望能够在所有的视图中传递数据。上面的代码展示了如何通过创建一个新的提供者,并使用通配符'*'将其附加到所有视图上,来实现这个目的。这个方法在Laravel 5.3版本中同样适用。
具体的实现步骤如下:
1. 创建一个新的提供者类ViewServiceProvider,该类应继承自ServiceProvider类。
2. 在boot方法中,使用view()函数和composer()方法来注册一个视图composer。通配符'*'表示将该composer应用于所有的视图。
3. 在composer的回调函数中,使用request()函数获取当前请求中的用户对象$user,并将其传递给视图。
4. 在register方法中,留空即可。
5. 将ViewServiceProvider类添加到config/app配置文件中的providers数组中,以使其生效。
这样,我们就可以在所有的视图中通过$user变量来访问当前请求中的用户对象了。这对于在导航栏、页脚等视图中展示当前登录用户的信息非常有用。
总结起来,通过创建一个新的提供者,并使用通配符将其附加到所有视图上,我们可以在Laravel中实现在所有视图中传递数据的功能。