Cómo funciona el conversor de parámetros de Symfony

Cada vez que conozco más del framework Symfony, más me gusta :).

Esto que te voy a mostrar a continuación me pareció un acto de magia cuando me lo crucé por primera vez: el conversor de parámetros.

En la mayoría de los Controllers (especialmente cuando se trata de CRUDs), se recibirá algún parámetro que será la clave para encontrar el objeto sobre el que se quiere realizar la operación, por ejemplo:

public function showAction(Request $request)
{
  $client = $this->getDoctrine()->getRepository('AppBundle:Client')->find($request->getParameter('id');

  if ( $client ) {
    ...
  } else {
    // 404
  }
}

Es muy común ver código de este tipo. De hecho, si lo miramos desde un poco lejos notaremos que hay una estructura en común en estas operaciones:

  1. Buscar el objeto
  2. Si se encontró, procesar normalmente
  3. Si no se encontró generar un error 404

La idea del conversor de parámetros es simplificar este proceso recurriendo a un uso muy interesante de las annotations:

/**
 * @Route("/client/{id}")
 * @ParamConverter("client", class="AppBundle:Client")
 */

La magia se produce en la combinación de las annotations @Route y @ParamConverter.

La primera define el patrón que debe seguir una URI para ser mapeada a esta acción, la segunda define cómo deben interpretarse los parámetros de modo de generar obejtos.

En definitiva el código quedaría algo así como:

/**
 * @Route("/client/{id}")
 * @ParamConverter("client", class="AppBundle:Client")
 */
public function showAction(Client $client)
{
    ...
}

Notá cómo se simplificó el método (Toda la parte de la búsqueda la realiza directamente el framework y el método sólo es llamado cuando efectivamente se obtuvo el objeto buscado).

Pero además de ahorrar código (y dolores de cabeza varios), esta metodología tiene un efecto colateral más que interesante: hace mucho más simple el testing automatizado. ¿Por qué? Porque fuerza a armar métodos basados en al inyección de dependencias.

Más allá del framework de testing que uses, podés imaginar que es muy simple hacer algo como:

$controller = new ClientController();

$controller->showAction( new Client() );

Obviamente el new Client() puede ser reemplazado por un objeto creado a tu conveniencia, sin tener que entrar en enroscados tests con bases de datos espurias.

Todo lo que leíste hasta acá es en realidad un caso particular de conversor de parámetros (El de Doctrine), pero existen más (¡Incluso podés definir los tuyos propios!).

No es que vayas a pasarte el día inventando tus propios conversores de parámetros, pero es importante saber cómo funcionan las herramientas que uno usa para poder sacarles el máximo jugo posible.

Si te interesa aprender más sobre este gran framework el curso Introducción a Symfony puede ayudarte.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.