A Symfony2 bundle to filter and organize data sent to the View from the Controller
$ composer require gotakk/view-model-bundle
// app/AppKernel.php
public function registerBundles()
{
return array(
// ...
new gotakk\ViewModelBundle\gotakkViewModelBundle(),
// ...
);
}
- 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
<?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('[email protected]');
$vm->addMail('[email protected]');
return $vm->toArray();
}
}
# 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
// 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!
ViewModelBundle is licensed under the MIT license (see LICENSE.md file).
Thanks to