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.