SimpleHMVCBundle
Simple HMVC Bundle for Symfony2, (*1)
The HMVC design pattern, came about when trying resolve the problem of embedding widgets into pages.
HMVC allows us to cleanly separate Controller, Model and View logic's, enabling us to create easier to work with and clearly encompassed code., (*2)
Symfony2 does provide us with tools that allow us to "load" routes within our controllers and our views, but the process, behind the scenes,
is more complex than I like., (*3)
For info on embedding using the symfony provided options see:
http://symfony.com/doc/2.8/book/templating.html#templating-embedding-controller, (*4)
HMVC (Hierarchical model-view-controller) symfony bundle enables you to "Widgetize" or as used in this bundle "Elementize" your controllers.
Architecturally this allows you to recursively include the same element one or many times across multiple pages without having to rebuild or restate the model logic., (*5)
Installation
Composer (Recommended)
composer require beyerz/simple-hmvc-bundle
Application Kernel
Add SimpleHMVC to the registerBundles()
method of your application kernel:, (*6)
public function registerBundles()
{
return array(
new Beyerz\SimpleHMVCBundle\BeyerzSimpleHMVCBundle(),
);
}
Usage
Pages and Elements can be created by hand or generated using the provided commands.
If you choose to create them manually or need to update manually, please consider the expected file structure, (*7)
Creating Pages
Using the command, (*8)
php app/console hmvc:page
For additional options or help, (*9)
php app/console hmvc:page --help
This command will generate a controller with one or many actions according to your specification.
For every controller action the following classes will be created, {action}Model, {action}Context, {action}Input
and a view in snake case format., (*10)
The creation of a page with results in the following directory structure
The Controller name used here is: BeyerzTestingBundle:GitExample, (*11)
โโโ Context
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ FirstExampleContext.php
โย ย โโโ SecondExampleContext.php
โโโ Controller
โย ย โโโ Page
โย ย โโโ GitExampleController.php
โโโ Input
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ FirstExampleInput.php
โย ย โโโ SecondExampleInput.php
โโโ Model
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ FirstExampleModel.php
โย ย โโโ SecondExampleModel.php
โโโ Resources
โย ย โโโ config
โย ย โย ย โโโ routing.yml
โย ย โย ย โโโ services.yml
โย ย โโโ views
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ first_example.html.twig
โย ย โโโ second_example.html.twig
โโโ Tests
โโโ Controller
โโโ Page
โโโ GitExampleControllerTest.php
You can also create controllers under different directories by specifying the path during the creation.
A simple sub-controller would generate this file structure
The Controller name used here is: BeyerzTestingBundle:GitExample/SubExample, (*12)
โโโ Context
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ SubExample
โย ย โโโ FirstSubExampleContext.php
โย ย โโโ SecondSubExampleContext.php
โโโ Controller
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ SubExampleController.php
โโโ Input
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ SubExample
โย ย โโโ FirstSubExampleInput.php
โย ย โโโ SecondSubExampleInput.php
โโโ Model
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ SubExample
โย ย โโโ FirstSubExampleModel.php
โย ย โโโ SecondSubExampleModel.php
โโโ Resources
โย ย โโโ config
โย ย โย ย โโโ routing.yml
โย ย โย ย โโโ services.yml
โย ย โโโ views
โย ย โโโ Page
โย ย โโโ GitExample
โย ย โโโ SubExample
โย ย โโโ first_sub_example.html.twig
โย ย โโโ second_sub_example.html.twig
โโโ Tests
โโโ Controller
โโโ Page
โโโ GitExample
โโโ SubExampleControllerTest.php
Creating Elements
Elements are very similar to pages, except that no controller is generated for elements., (*13)
Using the command, (*14)
php app/console hmvc:element
For additional options or help, (*15)
php app/console hmvc:element --help
This command will generate the following classes, {element}Model, {element}Context, {element}Input
and a view in snake case format., (*16)
The creation of an element results in the following directory structure
The Element name used here is: BeyerzTestingBundle:GitElement, (*17)
โโโ Context
โย ย โโโ Element
โย ย โโโ GitElementContext.php
โโโ Controller
โโโ DependencyInjection
โย ย โโโ BeyerzTestingExtension.php
โย ย โโโ Configuration.php
โโโ Input
โย ย โโโ Element
โย ย โโโ GitElementInput.php
โโโ Model
โย ย โโโ Element
โย ย โโโ GitElementModel.php
โโโ Resources
โย ย โโโ config
โย ย โย ย โโโ routing.yml
โย ย โย ย โโโ services.yml
โย ย โโโ views
โย ย โโโ Element
โย ย ย ย โโโ git_element.html.twig
โโโ Tests
You can also create elements under different directories by specifying the path during the creation.
A simple sub-element would generate this file structure
The element name used here is: BeyerzTestingBundle:GitExample/SubElement, (*18)
โโโ Context
โย ย โโโ Element
โย ย โโโ GitExample
โย ย โโโ SubElementContext.php
โโโ Controller
โโโ DependencyInjection
โย ย โโโ BeyerzTestingExtension.php
โย ย โโโ Configuration.php
โโโ Input
โย ย โโโ Element
โย ย โโโ GitExample
โย ย โโโ SubElementInput.php
โโโ Model
โย ย โโโ Element
โย ย โโโ GitExample
โย ย โโโ SubElementModel.php
โโโ Resources
โย ย โโโ config
โย ย โย ย โโโ routing.yml
โย ย โย ย โโโ services.yml
โย ย โโโ views
โย ย โโโ Element
โย ย ย ย โโโ GitExample
โย ย ย ย โโโ sub_element.html.twig
โโโ Tests
How it works
Some useful articles
- http://www.javaworld.com/article/2076128/design-patterns/hmvc--the-layered-pattern-for-developing-strong-client-tiers.html