gotakk / view-model-bundle
A Symfony2 bundle to filter and organize data sent to the View from the Controller
dev-master
2017-02-03 01:51 UTC
Requires
- php: >=5.3.3
- symfony/framework-bundle: >=2.3
Requires (Dev)
- satooshi/php-coveralls: dev-master
This package is not auto-updated.
Last update: 2025-07-05 23:03:24 UTC
README
A Symfony2 bundle to filter and organize data sent to the View from the Controller
Installation
Step 1: Add this bundle to your project in composer.json
$ composer require gotakk/view-model-bundle
Step 2: Enable the bundle to your app/AppKernel.php
// app/AppKernel.php public function registerBundles() { return array( // ... new gotakk\ViewModelBundle\gotakkViewModelBundle(), // ... ); }
Step 3: Create your ViewModel folder structure
- Create a ViewModel folder in your bundle root
- Inside the ViewModel folder create subfolders to organize your files. The convention is to create a subfolder per each controller file.
- In these subfolders, create one ViewModelAssembler file per action.
Example of ViewModel structure in your project
src/Acme/FooBarBundle
|
|
|-- Controller
| |-- CorporateController.php # <- contactAction(), homeAction()
| `-- TravelController.php # <- belgiumAction(), franceAction()
|
...
|
`-- ViewModel
|-- Corporate
| |-- ContactViewModelAssembler.php
| `-- HomeViewModelAssembler.php
`-- Travel
|-- BelgiumViewModelAssembler.php
`-- FranceViewModelAssembler.php
Step 4: Create your Assembler!
<?php // src/Acme/FooBarBundle/ViewModel/Corporate/ContactViewModelAssembler.php namespace Acme\FooBarBundle\ViewModel\Corporate; use gotakk\ViewModelBundle\ViewModel\ViewModelAssembler; use Acme\FooBarBundle\Entity\Model1; use Acme\FooBarBundle\Entity\Model2; use Acme\FooBarBundle\Entity\Model3; class ContactViewModelAssembler extends ViewModelAssembler { public function __construct() { $this->skel = array( 'pageTitle', 'mails' => array(), ); } public function generateViewModel($model1, $model2, $model3) { $vm = $this->vmService->createViewModel(); $vm->setPageTitle('Contact Us'); $vm->addMail('abc@gmail.com'); $vm->addMail('def@gmail.com'); return $vm->toArray(); } }
Step 5: Declare your assembler as a service.
# src/Acme/FooBarBundle/Resouces/config/services.yml services: acme_foobar.contact_view_model_assembler: class: Acme\FooBarBundle\ViewModel\Corporate\ContactViewModelAssembler parent: gotakk.view_model.view_model_assembler
Step 6: Use your assembler in your controler
// src/Acme/FooBarBundle/Controller/CorporateController.php namespace Acme\FooBarBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; class MainController extends Controller { /** * @Template */ public function landingAction(Request $request) { $model1 = $this->get('doctrine')->getManager()->getRepository('AcmeFooBarBundleBundle:Model1')->findAll(); $model2 = $this->get('doctrine')->getManager()->getRepository('AcmeFooBarBundleBundle:Model2')->findAll(); $model3 = $this->get('doctrine')->getManager()->getRepository('AcmeFooBarBundleBundle:Model3')->findAll(); $vm = $this->get('acme_foobar.contact_view_model_assembler')->generateViewModel($model1, $model2, $model3); return array( 'vm' => $vm, ); }
That's it!
License
ViewModelBundle is licensed under the MIT license (see LICENSE.md file).
Authors
Thanks to