Laravel:如何使用composer在所有视图中注入数据?

时间:2014-10-20 19:50:00

标签: laravel

我想将网站的某些HTML部分卸载到部分(包含)文件中,而不是重复每个视图或布局中的信息。但是,我还需要它们来包含特定数据。一个明显的例子是头部;我想把它放到一个部分,但我也希望能够为每个页面设置文档标题和META字段。

我认为最好的方法是使用Laravel's view-composer

根据文档,我可以使用数组一次为多个视图定义作曲家:

View::composer(array('view1','view2', 'view3'), function($view)
{
    $view->with('count', User::count());
});

但是,如果我想在每个视图中使用这个作曲家,就像我在这种情况下那样呢?

有一些答案围绕着SO(例如this one),这表明我使用了通配符。所以这是我的代码:

View::composer('*', function($view)
{
    $view->with('header', View::make('partials.head', $view->getData()));
    $view->with('footer', View::make('partials.footer', $view->getData()));
});

问题在于:使用这个目前正在给我一个内存不足错误,这表明效率非常低(因此我真的不应该这么做这一点)。

所以我真的需要传递一个列出我网站上每个页面的数组吗?

是否有办法在每个呈现的网页上使用composer,就像我可以使用View::share();一样?

2 个答案:

答案 0 :(得分:2)

如果每个视图的数据都是唯一的,那么将它放在视图编辑器中是没有意义的;您只需使用刀片模板即可完成此操作,并将特定于页面的数据传递给控制器​​中的视图。

设置页眉和页脚部分,然后设置一个基本模板,使用@include加载页眉和页脚部分,然后使用@yield('content')添加内容部分。

<!DOCTYPE html>
...
@include('partials.header')

@yield('content')

@include('partials.footer')
...

然后您的各个页面的视图将扩展此基本模板:

@extends('base')

@section('content')
//...specific page content here
@stop

在页眉和页脚部分中,包括{{ $someData }},以便在页面之间更改任何特定需求,并将该数据传递给控制器​​中的每个视图。

答案 1 :(得分:0)

现在是possible in Laravel 5.5

这是您的AppServiceProvider boot方法:

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