Как реализовать Laravel 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 )); } 

Конечно, я сейчас повторяю свои запросы на db, и я не хочу повторять одни и те же запросы в каждом методе контроллера, где используются несколько просмотров.

Каков наилучший способ сделать это?

NB: У меня есть более упрощенные вызовы базы данных для целей этого вопроса, и в коде может быть одна или две ошибки опечатки / синтаксиса, но это не важно для этого вопроса.

Итерация 2:

Я обнаружил, что я могу использовать view composers для создания viewmodels / презентаторов.

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 … Есть ли у вас надлежащий / официальный способ сделать это? Любые примеры?

Создайте файл composers.php в своем каталоге app / app и включите его через app / start / global.php. В этом файле вызовы View :: composer (вам не нужно размещать их внутри App :: before).

Переместите классы композитора в новый каталог app / composers / и добавьте каталог в автозагрузчик в вашем composer.json.

Кроме того, ваше использование композиторов является правильным.

для меня создать абстрактный класс ShopController расширяет BaseController

и в constructor () write View :: composer

и вы можете использовать DB :: table ('products') -> запомнить (100) -> get (); vs all () для кеша

Вы можете просто сделать

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