Antes que nada deshilemos el problema, necesitamos crear un contrlador donde se definan todos los métodos necesarios para hacer funcionar un CRUD, este será heredado por los controladores respectivos de las entidades que tengamos definidas, por esta razón el controlador necesitará saber de alguna manera con que entidad está trabajando, la estrategia que usaremos será definir una convención de nombre simple para que con reflection podamos decirle al controlador con que entidad está trabajando, pero debemos tener en cuenta el uso de los namespaces en php 5.3+ así que nuestro controlador padre deberá tener un método preAction para ahí poder cargarle toda la información necesaria para poder trabajar con cualquier entidad. Basicamente haremos uso de las siguientes herramientas de Symfony2.
Initializable Interface
Events Listeners
Definicion de Servicios en Symfony2
1) Codificando nuestra interface: Nuestra interface initializable constará de un único método llamado initialize que es el método que será ejecutado justo después del constructor del controlador.
InitializableControllerInterface
2) Codificando nuestro evento:
BeforeControllerActionListener
Como podemos observar en nuestro evento se llama a la función initialize que fue definida en nuestra interface, se aplican algunas bifurcaciones para asegurarnos de que solo manejaremos a los controladores que implementan la interface InitializableControllerInterface
3) Ahora definiremos nuestro servicio EntityReflectionGuesser, el cual será responsable de definir el nombre de nuestra entidad usando reflection.
EntityReflectionGuesser
Ahora con respecto a la convención que usaremos, será la siguiente. Simplemente nombraremos a nuestros contrladores con el nombre de la entidad respectiva, por ejemplo si deseamos hacer un controlador para manejar la entidad Item, entonces nombraremos a nuestro controlador ItemController. Ahora definiremos nuestro controlador padre
CrudController
Ya con nuestro controlador padre definido programar un CRUD a una entidad debería ser tan simple como el siguiente ejemplo.
ItemController
por último solo nos falta definir nuestros servicios en el archivo de configuración de nuestro bundle
services.yml
Bueno esto es todo, cualquier duda o sugerencia no duden en comentar, decidí usar gist por practicidad, de hecho deberían habilitar el uso de gist y pastebin. Para complementar este funcionalidad que acabamos de crear pudieramos modificar el generador de symfony2 para que trabaje con nuestro controlador padre, también configurarle twitter bootstrap a nuestras plantillas y con eso tendriamos una muy poderosa herramienta de desarrollo.