Ver índice de contenidos del libro

4.2. Enlazando a otra acción

Ya se ha comentado que existe una independencia total entre el nombre de la acción y la URL utilizada para llamarla, por lo que si se crea un enlace a actualizar en una plantilla como en el Listado 4-10, sólo funcionará con el enrutamiento establecido por defecto. Si más tarde se decide modificar la manera de mostrar las URL, entonces será necesario verificar todas las plantillas para modificar los enlaces o hipervínculos.

Listado 4-10 - Forma clásica de incluir los enlaces

<a href="/frontend_dev.php/contenido/actualizar?nombre=anonimo">
  Nunca digo mi nombre
</a>

Para evitar este inconveniente, es necesario siempre utilizar el helper link_to() para crear enlaces a las acciones de la aplicación. Si lo único que quieres es obtener la URL del enlace, entonces debes utilizar el helper url_for().

Un helper es una función PHP definida por Symfony y que está pensada para ser utilizada en las plantillas. Los helpers generan código HTML y normalmente resultan más eficientes que escribir a mano ese mismo código HTML. El Listado 4-11 muestra el uso de los helpers para enlaces.

Listado 4-11 - Los helpers link_to() y url_for()

<p>¡Hola, Mundo!</p>
<?php if ($hora >= 18): ?>
<p>Quizás debería decir buenas tardes. Ya son las <?php echo $hora ?>.</p>
<?php endif; ?>
<form method="post" action="<?php echo url_for('contenido/actualizar') ?>">
  <label for="nombre">¿Cómo te llamas?</label>
  <input type="text" name="nombre" id="nombre" value="" />
  <input type="submit" value="Ok" />
  <?php echo link_to('Nunca digo mi nombre','contenido/actualizar?nombre=anonymous') ?>
</form>

El código HTML resultante es el mismo que el anterior, pero en este caso, si se modifican las reglas de enrutamiento, todas las plantillas siguen funcionando correctamente ya que se actualizan las URL de forma automática.

Los formularios merecen un capítulo completo para ellos, ya que Symfony provee muchas herramientas, sobre todo helpers, para facilitar tu trabajo. En el capítulo 10 aprenderás todo sobre estos helpers.

El helper link_to(), al igual que muchos otros, acepta un argumento para opciones especiales y atributos de etiqueta adicionales. El Listado 4-12 muestra un ejemplo de un argumento option y su código HTML resultante. El argumento option puede ser tanto un array asociativo como una simple cadena de texto mostrando pares de clave=valor separados por espacios.

Listado 4-12 - La mayoría de los helpers aceptan un argumento option

// Argumento "option" como un array asociativo
<?php echo link_to('Nunca digo mi nombre', 'contenido/actualizar?nombre=anonimo',
  array(
    'class'    => 'enlace_especial',
    'confirm'  => '¿Estás seguro?',
    'absolute' => true
)) ?>
 
// Argumento "option" como una cadena de texto
<?php echo link_to('Nunca digo mi nombre', 'contenido/actualizar?nombre=anonimo',
  'class=enlace_especial confirm=¿Estás seguro? absolute=true') ?>
 
// Las dos funciones generan el mismo resultado
 => <a class="enlace_especial" onclick="return confirm('¿Estás seguro?');"
    href="http://localhost/frontend_dev.php/contenido/actualizar/nombre/anonimo">
    Nunca digo mi nombre</a>

Siempre que se utiliza un helper de Symfony que devuelve una etiqueta HTML, es posible insertar atributos de etiqueta adicionales (como el atributo class en el ejemplo del Listado 4-12) en el argumento option. Incluso es posible escribir estos atributos a la vieja usanza que utiliza HTML 4.0 (sin comillas dobles), y Symfony se encargará de mostrarlos correctamente formateados en XHTML. Esta es otra razón por la que los helpers son más rápidos de escribir que el HTML puro.

Nota Dado que requiere un procesado y transformación adicional, la sintaxis de cadena de texto es un poco más lenta que la sintaxis en forma de array.

Al igual que el resto de helpers de Symfony, los helpers de enlaces son muy numerosos y tienen muchas opciones. En el capítulo 9 se explican todos estos helpers con más detalle.