Un mes de Symfony. Abril 2019

Un mes de Symfony. Abril 2019

Últimamente los desarrolladores de Symfony han pisado el acelerador en lo que a actualizaciones y nuevas funcionalidades se refiere. Por tanto, he decidido recopilar mensualmente las novedades principales que van apareciendo de cara a tener una noción de qué cosas han cambiado y qué nuevos “trucos” podemos emplear.

La verdad es que este ritmo de novedades / actualizaciones que ha adquirido el proyecto es un síntoma de la buena salud de la que goza Symfony. Antiguamente las actualizaciones suponían cambios bastantes sustanciales en la forma de hacer las cosas (por ejemplo, los formularios sufrieron importantes modificaciones en cada iteración de la versión 2). Sin embargo, con la llegada de Symfony 4 se ha establecido una base sólida sobre la cual crecer y añadir nuevas funcionalidades por lo que creo que es justo reconocer el esfuerzo de todos aquellos que mantienen el proyecto.

Dicho esto, pasemos a repasar todo lo que nos ha dejado abril.

Symfony 4.3 depreca los templates en PHP

Teniendo en cuenta el número residual de gente que empleaba PHP para escribir sus templates en vez de Twig, lo más lógico es prescindir de este componente, que desaparecerá con la versión 5 de Symfony.

Nuevas constraints para los tipos numéricos

Symfony 4.3 trae nuevas constraints con el fin de ayudarnos a simplificar nustro código. Éstas son: Positive , PositiveOrZero , Negative , NegativeOrZero .

URL Helper

Cuando queríamos obtener la URL absoluta o relative de un path dentro de un servicio o controlador, debíamos recurrir a ciertos trucos que a partir de Symfony 4.3 ya no serán necesarios. A partir de ahora contaremos con una nueva clase llamada Symfony\Component\HttpFoundation\UrlHelper la cual nos provee de los métodos getAbsoluteUrl y getRelativePath para esta tarea.

Mejoras en el componente Intl

A partir de ahora, obtener determinada información localizada es mucho más fácil cuando empleamos el componente Intl ya que pasamos de:

use Symfony\Component\Intl\Intl;

\Locale::setDefault('en');

$languages = Intl::getLanguageBundle()->getLanguageNames();
// => ['ab' => 'Abkhazian', ...]

$language = Intl::getLanguageBundle()->getLanguageName('de');
// => 'German'

A esto:

use Symfony\Component\Intl\Currencies;
use Symfony\Component\Intl\Languages;
use Symfony\Component\Intl\Regions;

\Locale::setDefault('en');

$languages = Languages::getNames();
// => ['ab' => 'Abkhazian', ...]

$language = Languages::getName('de');
// => 'German'

$countries = Regions::getNames();
// => ['AF' => 'Afghanistan', ...]

Componente Inflector

El componente Inflector queda liberado a partir de la versión 4.3 de Symfony (han eliminado su etiqueta internal ) de modo que podremos emplear sus métodos singularize y pluralize para obtener el singular y el plural respectivamente de una palabra en inglés. Su aplicación más común es usarlo en conjunción con el componente PropertyAccess para obtener el nombre de los métodos que requieran el plural pero ahora ya queda en nuestras manos buscarle nuevas aplicaciones.

Validador de contraseñas comprometidas

Debido a las numerosas filtraciones de contraseñas que se han producido en distintos servicios, el equipo de Symfony nos trae el validador NotCompromisedPassword de cara que podamos validar por medio de la API del sitio haveibeenpwned.com si una contraseña ha sido comprometida y de este modo prevenir al usuario de su uso. Muy muy útil.

Nuevas assertions para tests

Symfony 4.3 incorpora un listado ampliado de assertions que podemos emplear en nuestros tests de cara a simplificar la escritura de los mismos. Por ejemplo:

// Before
$this->assertSame(200, $client->getResponse()->getStatusCode());
// After
$this->assertResponseIsSuccessful();

El listado completo podéis obtenerlo en el siguiente artículo:

Configuración de servicios con setters inmutables

Si estáis trabajando con servicios inmutables configurados mediante setters y Traits :

class MyService
{
use LoggerAwareTrait;

// ...
}

trait LoggerAwareTrait
{
private $logger;

public function withLogger(LoggerInterface $logger)
{
$new = clone $this;
$new->logger = $logger;

return $new;
}
}

$service = new MyService();
$service = $service->withLogger($logger);

Symfony 4.3 incorpora una forma más sencilla de lograr este mismo resultado. Basta con declarar una setter inyection con el tercer parámetro establecido comotrue :

# config/services.yaml
services:
MyService:
# ...
calls:
# the TRUE argument turns this into a wither method
- ['withLogger', ['@logger'], true]

De modo que obtendremos una copia inmutable de servicio MyService con el servicio Logger inyectado por medio del correspondiente setter .

Validación automática

Y finalmente, una de esas mejoras que nos harán la vida más fácil. Por si muchos no lo sabéis, declarar una propiedad de una entidad del siguiente modo:

/** @ORM\Column(length=5) */
public $zip;

no provoca que Doctrine valide el dato introducido en la propiedad antes de intentar persistirlo, tan sólo sirve para la creación del esquema de la base de datos.

Sin embargo, con Symfony 4.3 este tipo de anotaciones provocarán una validación ya que el componente Validator realizará la conversión de dichas anotaciones en anotaciones del tipo Assert . En este artículo tenéis la tabla donde se detalla la conversión entre el mapping de Doctrine y la assert generada.

Y hasta aquí todo lo que nos deja el mes de Abril en lo que a Symfony se refiere. Hasta dentro de un mes!