如何实现Laravel 4的局部视图 - 绑定数据到局部视图

4

我正在考虑是否应该使用Laravel构建一个在线商店。

要求 - 在侧边栏显示购物车,主区域显示产品列表。我需要将数据绑定到我的部分视图。

我创建了一个PartialController来显示部分视图。

class PartialController extends BaseController {

    public function showCartSummary()
    {
        $cartItems = Cart::all();   
        return View::make('partials.cartsummary', array(
            'cart' => $cartItems,
        ));
    }

    public function showProducts()
    {
        $products = Products::all();
        return View::make('partials.products', array(
            'products' => $products,
        ));
    }
}

我已经创建了一个商店索引视图,以引入局部视图。
Shop.Index.Blade.php
@extends('master')

@section('content')
    @include('partials.cart')
@stop

@section('side1')
    @include('partials.products')
@stop

问题在于这些视图没有从它们自己的控制器中调用partials.cart和partials.products,因此没有数据传递到这些视图。
我的解决方法是在ShopController内查询数据库并将结果传递给shop.index视图。
ShopController.php 我还创建了一个ShopController。
    public function showIndex()
    {
        $cartItems = Cart::all();   
        $products = Product::all();

        return View::make('shop.index', array(
            'cartItems' => $cartItems,
            'products' => $products
        ));
    }

当然,我现在正在重复我的数据库查询,我不想在使用多个视图的每个控制器方法中重复相同的查询。
最好的方法是什么?
注:出于本问题的目的,我已经简化了数据库调用,并且可能会有一两个代码打字错误/语法错误,但对于本问题并不重要。
迭代2:
我发现可以使用“视图组成员”创建视图模型/演示者。
shop.blade.php
@extends('master')
@section('content')
    @include('partials.products')
@stop
@section('side1')
    @include('partials.cartitems')
@stop

现在将数据传递给局部视图: 首先,我放弃了PartialController.php,然后修改了filters.php。 filters.php
App::before(function($request)
{
    View::composer('partials.products', 'ProductComposer');
    View::composer('partials.cartitems', 'CartComposer');
});

class ProductComposer {
    public function compose($view)
    {
        $view->with('products', Product::all()); 
    }
}

class CartComposer {
    public function compose($view)
    {
        $view->with('cartitems', Cart::all());    
    }
}

目前还很混乱,我不想把所有的局部视图都塞进 filters.php 文件中... 有没有正确/官方的方法来做这个?有任何例子吗?


迭代2是正确的。你可以将这些类放在它们自己的文件中并包含它们在命名空间中,那样会更清晰。 - itachi
你为什么要重新发明(嘎吱作响的)购物车呢?已经有足够免费且经过充分测试的选项,让你可以专注于有趣的事情。 - Mawg says reinstate Monica
3个回答

4
在你的app/目录下创建一个composers.php文件,并通过app/start/global.php包含它。在这个文件中,进行View::composer调用(无需将它们放在App::before中)。
将composer类移动到一个新的app/composers/目录中,并将该目录添加到您的composer.json自动加载器中。
除此之外,您对composer的使用是正确的。

0

对于我来说,创建一个抽象类ShopController扩展BaseController

在构造函数中编写View::composer

你可以使用DB::table('products')->remember(100)->get();来代替all()进行缓存


-1

你可以简单地做

@include('partials.products', array('data'=>'here'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接