Я обсуждаю, следует ли использовать 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'))