Más con Symfony

2.4. Colecciones de rutas

Para finalizar la aplicación Sympal Builder, es preciso crear un área de administración individual para que cada cliente (Client) pueda gestionar sus páginas (Pages). Para ello, se necesitan varias acciones que permitan listar, crear, actualizar y borrar los objetos de tipo Page. Como este tipo de acciones son muy comunes, Symfony puede generar automáticamente el módulo completo. Ejecuta la siguiente tarea en la línea de comandos para generar un módulo llamado pageAdmin dentro de la aplicación llamada backend:

$ php symfony doctrine:generate-module backend pageAdmin Page --with-doctrine-route --with-show

La tarea anterior genera un módulo con un archivo de acciones y todas las plantillas necesarias para realizar cualquier modificación sobre los objetos Page. Aunque se pueden realizar muchas modificaciones sobre estas acciones y plantillas generadas, es algo que está fuera del alcance de este capítulo.

Aunque la tarea anterior genera un módulo completo, todavía es necesario crear una ruta para cada acción. La opción --with-doctrine-route que se ha pasado a la tarea hace que todas las acciones generadas funcionen con una ruta de objeto. De esta forma se reduce el código de cada acción. La siguiente acción edit contiene por ejemplo una única línea:

public function executeEdit(sfWebRequest $request)
{
  $this->form = new PageForm($this->getRoute()->getObject());
}

Todas las rutas necesarias son index, new, create, edit, update, y delete. Normalmente crear estas rutas de tipo RESTful requeriría añadir lo siguiente en el archivo routing.yml.

pageAdmin:
  url:         /pages
  class:       sfDoctrineRoute
  options:     { model: Page, type: list }
  params:      { module: page, action: index }
  requirements:
    sf_method: [get]
pageAdmin_new:
  url:        /pages/new
  class:      sfDoctrineRoute
  options:    { model: Page, type: object }
  params:     { module: page, action: new }
  requirements:
    sf_method: [get]
pageAdmin_create:
  url:        /pages
  class:      sfDoctrineRoute
  options:    { model: Page, type: object }
  params:     { module: page, action: create }
  requirements:
    sf_method: [post]
pageAdmin_edit:
  url:        /pages/:id/edit
  class:      sfDoctrineRoute
  options:    { model: Page, type: object }
  params:     { module: page, action: edit }
  requirements:
    sf_method: [get]
pageAdmin_update:
  url:        /pages/:id
  class:      sfDoctrineRoute
  options:    { model: Page, type: object }
  params:     { module: page, action: update }
  requirements:
    sf_method: [put]
pageAdmin_delete:
  url:        /pages/:id
  class:      sfDoctrineRoute
  options:    { model: Page, type: object }
  params:     { module: page, action: delete }
  requirements:
    sf_method: [delete]
pageAdmin_show:
  url:        /pages/:id
  class:      sfDoctrineRoute
  options:    { model: Page, type: object }
  params:     { module: page, action: show }
  requirements:
    sf_method: [get]

Para ver estas rutas, ejecuta la tarea app:routes, que muestra un resumen de cada ruta de la aplicación indicada:

$ php symfony app:routes backend

>> app       Current routes for application "backend"
Name             Method Pattern
pageAdmin        GET    /pages
pageAdmin_new    GET    /pages/new
pageAdmin_create POST   /pages
pageAdmin_edit   GET    /pages/:id/edit
pageAdmin_update PUT    /pages/:id
pageAdmin_delete DELETE /pages/:id
pageAdmin_show   GET    /pages/:id

2.4.1. Sustituyendo las rutas por una colección de rutas

Afortunadamente Symfony permite añadir todas las rutas relacionadas con el CRUD de forma mucho más concisa. Reemplaza el contenido del archivo routing.yml por la siguiente ruta.

pageAdmin:
  class:   sfDoctrineRouteCollection
  options:
    model:        Page
    prefix_path:  /pages
    module:       pageAdmin

Ejecuta de nuevo la tarea app:routes para visualizar todas las rutas. Como puedes ver, todavía se muestran las siete rutas anteriores.

$ php symfony app:routes backend

>> app       Current routes for application "backend"
Name             Method Pattern
pageAdmin        GET    /pages.:sf_format
pageAdmin_new    GET    /pages/new.:sf_format
pageAdmin_create POST   /pages.:sf_format
pageAdmin_edit   GET    /pages/:id/edit.:sf_format
pageAdmin_update PUT    /pages/:id.:sf_format
pageAdmin_delete DELETE /pages/:id.:sf_format
pageAdmin_show   GET    /pages/:id.:sf_format

Las colecciones de rutas son un tipo especial de objeto que internamente representan más de una ruta. La ruta ~sfDoctrineRouteCollection~ por ejemplo genera automáticamente las siete rutas habitualmente necesarias para el CRUD. En realidad, la ruta sfDoctrineRouteCollection crea internamente las mismas siete rutas que se incluyeron antes en el archivo routing.yml. Las colecciones de rutas básicamente existen como atajo para crear grupos comunes de rutas.