Un mes de Symfony. Mayo 2019 y novedades de Symfony 4.3

Principales novedades de la versión 4.3 de Symfony

Image for post
Image for post

Con el verano a la vuelta de la esquina y mayo ya en el retrovisor os traigo un resumen de todo lo que nos ha dejado Symfony durante este último mes de cara a que no nos perdamos nada. Esta vez hay menos novedades que en abril pero a cambio tenemos el lanzamiento de la versión 4.3 de Symfony la cual incorpora funcionalidad y nuevos componentes muy interesantes. ¡Vamos a verlos!

Novedades de Symfony 4.3

El día 30 de mayo fue liberada la versión 4.3 de Symfony, la cual trae un conjunto de novedades bastante interesante sobre todo en lo que a componentes se refiere.

Recordad que todas las actualizaciones menores tienen compatibilidad hacia atrás, de modo que tras actualizar a la nueva versión vuestro código seguirá funcionando igual que antes (salvo que deberéis revisar las nuevas funciones o clases deprecadas para actualizarlo en consecuencia).

Si bien aquí podéis encontrar una lista detallada de las novedades principales que trae esta versión, aquí os dejo una lista de aquellas que más me han llamado la atención:

  • Aparición del componente Mailer para ayudarnos a simplificar la forma en que enviamos emails
  • Validación de entidades en formularios a partir del mapping de Doctrine.
  • Nuevas aserciones para nuestros tests
  • Adición del UrlHelper para generar de forma más sencilla rutas absolutas
  • Adición de un nuevo PasswordEncoder compatible con libsodium
  • Validador de contraseñas comprometidas
  • Configuración de servicios mediante setters inmutables
  • Deprecación de las plantillas PHP
  • Añadidas nuevas Number Constraints

Y otras 5 novedades que detallo a continuación y que han sido liberadas a lo largo de este último mes.

Añadido un "failure transport” al componente Messenger

Para aquellos que no lo conozcáis, el componente Messenger de Symfony nos permite enviar y recibir mensajes desde otras aplicaciones permitiéndonos una integración bastante sencilla con servicios como Rabbit:

Con esta nueva versión ahora podremos agrupar en un único sitio todos aquellos mensajes que hayan fallado de modo que posteriormente podamos reintentar su envío o visualizar las causas que provocaron dicho fallo.

Fuente: https://symfony.com/blog/new-in-symfony-4-3-messenger-failure-transport

Nuevo componente MIME

En palabras de su propio desarrollador, este nuevo componente que está disponible a partir de la versión 4.3 de Symfony comenzó como una evolución del SwiftMailer si bien finalmente ha terminado por ser algo distinto.

Su objetivo es ayudarnos a crear y manipular los mensajes MIME que usamos para enviar emails así como nos provee de ciertas utilidades para manipular Mime Types .

Puesto que el objetivo del estándar MIME es definir funcionalidades extra para los emails, este componente abstrae toda esa complejidad para proveernos de dos nuevas formas de crear emails.

La primera es con la API de alto nivel Symfony\Component\Mime\Email :

use Symfony\Component\Mime\Email;$email = (new Email())
->from('fabien@symfony.com')
->to('foo@example.com')
->subject('Important Notification')
->text('Lorem ipsum...')
->html('<h1>Lorem ipsum</h1> <p>...</p>')
;

y la segunda mediante una API de bajo nivel:

use Symfony\Component\Mime\Header\Headers;
use Symfony\Component\Mime\Message;
use Symfony\Component\Mime\Part\Multipart\AlternativePart;
use Symfony\Component\Mime\Part\TextPart;
$headers = (new Headers())
->addMailboxListHeader('From', ['fabien@symfony.com'])
->addMailboxListHeader('To', ['foo@example.com'])
->addTextHeader('Subject', 'Important Notification')
;
$textContent = new TextPart('Lorem ipsum...');
$htmlContent = new TextPart('<h1>Lorem ipsum</h1> <p>...</p>', 'html');
$body = new AlternativePart($textContent, $htmlContent);
$email = new Message($headers, $body);

que nos permite acceder por completo a cada parte del mensaje.

Además, empleando este componente también seremos capaces de embeber imágenes en textos, adjuntar archivos o definir de distintas formas las direcciones a las que se tiene que enviar el email.

Fuente: https://symfony.com/blog/new-in-symfony-4-3-mime-component

Mejoras en los formularios

Symfony 4.3 nos trae también varias mejoras en los formularios que nos harán la vida un poco más sencilla en lo que a personalización se refiere.

En concreto las novedades más destacadas son:

  • El orden que establezcamos para las preferred_choices de los ChoiceType se mantiene (sí, hasta ahora si declarábamos preferred_choices => ['c', 'b', 'a'] Symfony lo ordenaba de manera alfabética).
  • Ahora podemos añadir atributos a las form_row sin tener que sobreescribir por completo el contenido del bloque form_row gracias a la opción row_attr .
  • Y también podemos añadir mensajes de error personalizados cuando los DataMapper que definamos tengan un fallo a la hora de realizar la transformación.

Fuente: https://symfony.com/blog/new-in-symfony-4-3-more-form-improvements

Componente HTTP Client

Para mí, una de las principales novedades de este mes ya que este componente nos proporciona una alternativa a la librería Guzzle muy interesante.

Para aquellos a los que no os suene el nombre de Guzzle deciros que se trata de una librería que permite realizar llamadas a API’s de terceros y que a partir de Symfony 4.3 encontrará un serio compotidor en este nuevo componente por dos motivos:

  • en mi opinión trabajar con él es algo más sencillo si bien no tiene toda la potencia (de momento) de Guzzle
  • es un componente de marca, lo cual se traduce en que mantenemos mismos estándares y convenciones

Su uso básico es el siguiente:

use Symfony\Component\HttpClient\HttpClient;$httpClient = HttpClient::create();
$response = $httpClient->request('GET', 'https://someapi.com');

y entre sus principales características es que no bloquea la ejecución (lo cual dicho de paso provoca que no esté implementando la PSR-18), es decir, cuando invocamos el método request la ejecución del código continúa hasta topar con la invocación del método $response->getStatusCode() (que espera a las llegadas de las cabeceras de la respuesta) el método $response->getContent() (que espera a la llegada del contenido).

De este modo, es posible iniciar varias llamadas en paralelo sin tener que esperar a que concluya la primera para comenzar la siguiente.

Además, otra de sus características más llamativas es que si el código de la respuesta no es un 2xx lanzará una excepción en el caso de que no estemos nosotros controlando el error, algo realmente cómodo y que nos ayudará a controlar el flujo de las llamadas.

Por supuesto también soporta autenticación mediante HTTP Bearer, streaming de las respuestas o subida de archivos, por lo que probablemente os interese echar un ojo a este componente para considerarlo como alternativa a Guzzle. Si queréis podéis profundizar más en la documentación de HTTP Client:

Fuente: https://symfony.com/blog/new-in-symfony-4-3-httpclient-component

Codificación de contraseñas

Con la llegada de la librería libsodium y su integración con Symfony mediante un nuevo Password Encoder obtuvimos una nueva forma de encriptar nuestras contraseñas.

Puesto que ir actualizando el algoritmo que emplearemos conforme aparezcan soluciones más seguras puede llegar a ser tedioso, el equipo de Symfony nos proporciona una nueva opción para el atributo algorithm dentro de la configuración del componente Security: auto . De este modo, Symfony se encargá de escoger el sistema de encriptado más robusto de entre los que tengamos instalados.

# config/packages/security.yaml
security:
# ...
encoders:
App\Entity\User:
- algorithm: 'bcrypt'
- algorithm: 'argon2i'
- algorithm: 'sodium'
+ algorithm: 'auto'

Fuente: https://symfony.com/blog/new-in-symfony-4-3-native-password-encoder

Written by

Entre paseo y paseo con Simba desarrollo en Symfony y React

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store