ControllerExtraBundle
Controller extra Bundle for Symfony2
Install / Use
/learn @mmoreram/ControllerExtraBundleREADME
ControllerExtra for Symfony2
This bundle provides a collection of annotations for Symfony2 Controllers, designed to streamline the creation of certain objects and enable smaller and more concise actions.
Table of contents
- Reference
- Entity Provider
- Controller Annotations
- Custom annotations
Reference
By default, all annotations are loaded, but any individual annotation can be
completely disabled by setting to false active parameter.
Default values are:
controller_extra:
resolver_priority: -8
request: current
paginator:
active: true
default_name: paginator
default_page: 1
default_limit_per_page: 10
entity:
active: true
default_name: entity
default_persist: true
default_mapping_fallback: false
default_factory_method: create
default_factory_mapping: true
form:
active: true
default_name: form
object_manager:
active: true
default_name: form
flush:
active: true
default_manager: default
json_response:
active: true
default_status: 200
default_headers: []
log:
active: true
default_level: info
default_execute: pre
ResolverEventListener is subscribed to
kernel.controllerevent with priority -8. This element can be configured and customized withresolver_priorityconfig value. If you need to get ParamConverter entities, make sure that this value is lower than 0. The reason is that this listener must be executed always after ParamConverter one.
Entity provider
In some annotations, you can define an entity by several ways. This chapter is about how you can define them.
By namespace
You can define an entity using its namespace. A simple new new() be performed.
/**
* Simple controller method
*
* @SomeAnnotation(
* class = "Mmoreram\CustomBundle\Entity\MyEntity",
* )
*/
public function indexAction()
{
}
By doctrine shortcut
You can define an entity using Doctrine shortcut notations. With this format
you should ensure that your Entities follow Symfony Bundle standards and your
entities are placed under Entity/ folder.
/**
* Simple controller method
*
* @SomeAnnotation(
* class = "MmoreramCustomBundle:MyEntity",
* )
*/
public function indexAction()
{
}
By parameter
You can define an entity using a simple config parameter. Some projects
use parameters to define all entity namespaces (To allow overriding). If you
define the entity with a parameter, this bundle will try to instance it
with a simple new() accessing directly to the container ParametersBag.
parameters:
#
# Entities
#
my.bundle.entity.myentity: Mmoreram\CustomBundle\Entity\MyEntity
/**
* Simple controller method
*
* @SomeAnnotation(
* class = "my.bundle.entity.myentity",
* )
*/
public function indexAction()
{
}
Controller annotations
This bundle provide a reduced but useful set of annotations for your controller actions.
@CreatePaginator
Creates a Doctrine Paginator object, given a request and a configuration. This
annotation just injects into de controller a new
Doctrine\ORM\Tools\Pagination\Pagination instance ready to be iterated.
You can enable/disable this bundle by overriding active flag in configuration file
config.yml
controller_extra:
pagination:
active: true
By default, if
nameoption is not set, the generated object will be placed in a parameter named$paginator. This behaviour can be configured usingdefault_namein configuration.
This annotation can be configured with these sections
Paginator Entity
To create a new Pagination object you need to refer to an existing Entity. You can check all available formats you can define it just reading the Entity Provider section.
<?php
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
* @CreatePaginator(
* entityNamespace = "MmoreramCustomBundle:User",
* )
*/
public function indexAction(Paginator $paginator)
{
}
Paginator page
You need to specify Paginator annotation the page to fetch. By default, if none
is specified, this bundle will use the default one defined in configuration. You
can override in config.yml
controller_extra:
pagination:
default_page: 1
You can refer to an existing Request attribute using ~value~ format, to any
$_GET element by using format ?field? or to any $_POST by using format
#field#
You can choose between Master Request or Current Request accessing to its attributes, by configuring the request value of the configuration.
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
* This Controller matches pattern /myroute/paginate/{foo}
*
* @CreatePaginator(
* entityNamespace = "MmoreramCustomBundle:User",
* page = "~foo~"
* )
*/
public function indexAction(Paginator $paginator)
{
}
or you can hardcode the page to use.
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
* This Controller matches pattern /myroute/paginate/
*
* @CreatePaginator(
* entityNamespace = "MmoreramCustomBundle:User",
* page = 1
* )
*/
public function indexAction(Paginator $paginator)
{
}
Paginator limit
You need to specify Paginator annotation the limit to fetch. By default, if none
is specified, this bundle will use the default one defined in configuration. You
can override in config.yml
controller_extra:
pagination:
default_limit_per_page: 10
You can refer to an existing Request attribute using ~value~ format, to any
$_GET element by using format ?field? or to any $_POST by using format
#field#
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
* This Controller matches pattern /myroute/paginate/{foo}/{limit}
*
* @CreatePaginator(
* entityNamespace = "MmoreramCustomBundle:User",
* page = "~foo~",
* limit = "~limit~"
* )
*/
public function indexAction(Paginator $paginator)
{
}
or you can hardcode the page to use.
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
* This Controller matches pattern /myroute/paginate/
*
* @CreatePaginator(
* entityNamespace = "MmoreramCustomBundle:User",
* page = 1,
* limit = 10
* )
*/
public function indexAction(Paginator $paginator)
{
}
Paginator OrderBy
You can order your Pagination just defining the fields you want to orderBy and
the desired direction. The orderBy section must be defined as an array of
arrays, and each array should contain these positions:
- First position: Entity alias (Principal object is set as
x) - Second position: Entity field
- Third position: Direction
- Fourth position: Custom direction map (optional)
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
* @CreatePaginator(
* entityNamespace = "MmoreramCustomBundle:User",
* orderBy = {
* {"x", "createdAt", "ASC"},
* {"x", "updatedAt", "DESC"},
* {"x", "id", 1, {
* 0 => "ASC",
* 1 => "DESC",
* }},
* }
* )
*/
public function indexAction(Paginator $paginator)
{
}
With the third and fourth value you can define a map where to match your own direction nomenclature with DQL one. DQL nomenclature just accept ASC for Ascendant and DESC for Descendant.
This is very useful when you need to match a url format with the DQL one. You
can refer to an existing Request attribute using ~value~ format, to any
$_GET element by using format ?field? or to any $_POST by using format
#field#
use Doctrine\ORM\Tools\Pagination\Pagination;
use Mmoreram\ControllerExtraBundle\Annotation\CreatePaginator;
/**
* Simple controller method
*
*

