Un mes de Symfony. Mayo 2019 y novedades de Symfony 4.3
Principales novedades de la versión 4.3 de Symfony

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 conlibsodium
- 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 losChoiceType
se mantiene (sí, hasta ahora si declarábamospreferred_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 bloqueform_row
gracias a la opciónrow_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