在每个子视图中共享数据

时间:2014-06-26 09:15:13

标签: view laravel-4 blade

我创建了一个包含标题和主要内容的布局,这些内容会定期更改。

 @include('tshop.includes.header')

    @yield('content')

@include('tshop.includes.footer')

我创建了下面的视图编辑器,以便将我的购物篮中的产品传递到标题中的弹出对话框。

View::composer('tshop.includes.header', function($view)
{
    $basket = App::make('BasketInterface');

    $view->with( 'productsIterator' , $basket->getIterator() );
});

我想在所有观点中分享它,包括主要内容。

我尝试使用与share相同的shares(和View::share)函数,但事实并非如此。

View::composer('tshop.includes.header', function($view)
{
    $basket = App::make('BasketInterface');

    $view->share( 'productsIterator' , $basket->getIterator() );
});

我还尝试使用视图编辑器进行布局,但徒劳无功。

View::composer('tshop.layouts.default', function($view)
{
    $basket = App::make('BasketInterface');

    $view->shares( 'productsIterator' , $basket->getIterator() );
});

接下来,我将下面的过滤器放到我的构造函数中。

    $this->beforeFilter(function()
    {
        $basket = App::make('BasketInterface');

        View::share('productsIterator' , $basket->getIterator());
    });

它有效,但我使用了几个控制器,所以这不是最好的事情。我知道我可以创建一个基本控制器类并扩展它但是没有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用App::before事件使用View::share向全局所有观看视频分享一些数据,例如:

App::before(function($request) {
    $basket = App::make('BasketInterface');
    View::share( 'productsIterator' , $basket->getIterator() );
});

现在,您可以从任何视图访问$productsIterator,顺便说一下,您使用的是shares而不是share。您也可以使用View作曲家而不是View::share,如下所示:

View::composer('tshop.includes.header', function($view) {
    $basket = App::make('BasketInterface');
    return $view->with( 'productsIterator' , $basket->getIterator() );
});

在这种情况下,您需要使用$view->with()方法而不是share