Laravel 5.6 从中间件向视图传递变量
问题:如何从中间件将变量传递给视图?
原因:中间件无法直接将变量传递给视图,需要通过请求(request)来传递。
解决方法:
1. 在中间件中定义变量并将其合并到请求中:
public function handle($request, Closure $next) { $foo = 'bar'; $request->merge(compact('foo')); return $next($request); }
2. 在控制器中读取请求中的变量,并将其传递给视图:
public function create(Request $request) { $foo = $request->foo; return view('my.view', compact('foo')); }
3. 在视图中使用该变量:
{{ $foo }}
通过以上步骤,我们可以在中间件中定义变量,并通过请求和控制器将其传递给视图,从而实现将变量传递给视图的目的。
问题的出现原因是用户想要将动态数据传递给所有视图,但是对于使用中间件还是服务提供者存在疑惑。解决方法是使用服务提供者。
在Laravel中,中间件用于修改请求。如果你有一些在每个视图中都使用的动态数据,最好使用服务提供者而不是中间件。例如,你可能在每个页面上都有一些元数据,每个视图都包含一个名为`header.blade.php`的文件,内容可能如下所示:
然后,你可以创建一个服务提供者,在其中进行数据库和缓存的请求,将数据传递给视图。你可以像下面这样编写服务提供者:
public function boot() { view()->composer('view', function ($view) { $slug = request()->path(); $meta = \MetaTags::where('slug' ,'=',$slug)->first(); $view->with('metatag', $meta->tag); }); }
你还可以参考Laracast上的教程,了解更多关于服务提供者的信息。
最后,根据提问者提供的链接,有人建议使用中间件来解决问题。但在这种情况下,我们仍然建议使用服务提供者来实现动态数据的传递。
希望这些信息能对你有所帮助!