Nuevo en Symfony 5.1: Convertir servicios públicos en privados

Una de las principales razones por las que a los programadores/as les encanta Symfony es cómo se declaran obsoletas las funcionalidades. Gracias a la retrocompatibilidad asegurada puedes actualizar tu aplicación entre versiones menores de Symfony con la garantía de que todo seguirá funcionando.

En Symfony 5.1 hemos añadido una nueva funcionalidad para convertir servicios públicos en privados mientras se mantiene esa retrocompatibilidad. En la práctica lo que debes hacer es añadir una etiqueta llamada container.private a tu servicio y un par de atributos que expliquen en qué versión se ha declarado obsoleto el servicio público:

services:
    foo:
        # ...
        public: true
        tags:
            - { name: 'container.private', package: 'foo/bar', 'version': '1.2' }

Si tu aplicación intenta acceder al servicio directamente a través del contenedor ($container->get('foo')) verás el siguiente error:

Since foo/bar 1.2: Accessing the "foo" service directly from the container
is deprecated, use dependency injection instead.

Técnicamente esta funcionalidad usa una compiler pass para crear un "alias" público y obsoleto de ese servicio, que ahora es privado. Esto solo se hace si el código accede directamente al servicio (no cuando se usa autowiring) para evitar mostrar mensajes innecesarios.

Ya estamos usando esta funcionalidad en el propio código de Symfony (por ejemplo para convertir en privado el servicio twig en el pull request #36739) por lo que ya puedes utilizarlo tu también en tus propios bundles públicos y tus aplicaciones privadas.

Esta funcionalidad fue contribuida por Thomas Calvet en el pull request #36470.


Fuente: New in Symfony 5.1: Deprecate public services into private services

Comentarios

Publicada el

11 de mayo de 2020

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.