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:

我发现我可以view composers用来创建视图模型/演示者。

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 文件中……有没有合适的/官方的方法来做这件事?有什么例子吗?

4

3 回答 3

4

在你的 app/ 目录中创建一个 composers.php 文件,并通过 app/start/global.php 包含它。在这个文件中,执行 View::composer 调用(您不需要将它们放在 App::before 中)。

将 composer 类移动到一个新的 app/composers/ 目录中,并将该目录添加到 composer.json 中的自动加载器。

除此之外,您对作曲家的使用是正确的。

于 2013-09-01T09:13:24.697 回答
0

为我创建一个抽象类 ShopController extends BaseController

并在 constructor() 中写 View::composer

你可以使用 DB::table('products')->remember(100)->get(); vs all() 用于缓存

于 2013-09-02T21:32:57.880 回答
-1

你可以简单地做

@include('partials.products', array('data'=>'here'))
于 2014-02-12T14:02:55.690 回答