Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Actualización a Symfony 5.4

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

El primer paso para actualizar nuestra aplicación a Symfony 6 es actualizar todas las librerías de Symfony a la 5.4. Y... eso es bastante fácil: es sólo una cosa del compositor.

Ajustando la Restricciones de versiones de Composer

En composer.json, tenemos bastantes librerías que empiezan por symfony/. La mayoría de ellas forman parte del proyecto "principal" de Symfony y siguen el conocido versionado de Symfony, con versiones como 5.0, 5.1, hasta 5.4 y luego 6.0. Esos son los paquetes en los que nos vamos a centrar para actualizarlos.

Pero algunos de ellos, como symfony/maker-bundle, siguen su propio esquema de versiones. ¡Qué diva! No vamos a preocuparnos de actualizarlos ahora, pero nos aseguraremos de que, al final, lo hayamos actualizado todo.

Bien, lo que tenemos que hacer es cambiar todos estos 5.0.* por 5.4.*. Voy a hacer un "Buscar y reemplazar" para sustituir 5.0.* por 5.4.*. Pulsa "Reemplazar todo".

108 lines composer.json
{
... lines 2 - 5
"require": {
... lines 7 - 21
"symfony/asset": "5.4.*",
"symfony/console": "5.4.*",
"symfony/dotenv": "5.4.*",
... line 25
"symfony/form": "5.4.*",
"symfony/framework-bundle": "5.4.*",
... line 28
"symfony/property-access": "5.4.*",
"symfony/property-info": "5.4.*",
"symfony/proxy-manager-bridge": "5.4.*",
"symfony/routing": "5.4.*",
"symfony/security-bundle": "5.4.*",
"symfony/serializer": "5.4.*",
"symfony/stopwatch": "5.4.*",
"symfony/twig-bundle": "5.4.*",
... line 37
"symfony/validator": "5.4.*",
... lines 39 - 44
},
"require-dev": {
... line 47
"symfony/debug-bundle": "5.4.*",
... lines 49 - 51
"symfony/web-profiler-bundle": "5.4.*",
... line 53
},
... lines 55 - 100
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.4.*"
}
}
}

¡Muy bien! Y fíjate que, además de los paquetes en sí, también hemos tenido que cambiar la clave extra.symfony.require. Se trata de una optimización del rendimiento de Flex: básicamente se asegura de que Flex sólo tenga en cuenta los paquetes de Symfony que coincidan con esta versión. Sólo tienes que asegurarte de no olvidarte de actualizarla.

Bien... veamos. Esto actualizó un montón de bibliotecas. Para asegurarnos de que no nos hemos perdido nada, busca symfony/... y desplázate un poco hacia abajo. El monolog-bundle tiene su propio versionado, así que está bien. Pero, ooh... me he perdido una: symfony/routing. Por alguna razón, ésta ya estaba en Symfony 5.1. Así que vamos a cambiarlo también a 5.4.*.

Y... todo lo demás parece estar bien: cada uno se cambia a 5.4.* o tiene su propia estrategia de versionado... y no vamos a preocuparnos por ello ahora.

Actualizando las Dependencias

Para actualizarlas realmente, en tu terminal, podríamos intentar actualizar sólo los paquetes de Symfony con:

composer up 'symfony/*'

Es muy probable que eso falle... porque para actualizar todos los paquetes de Symfony, habrá que actualizar algún otro paquete, comosymfony/proxy-manager-bridge. Si quisieras, podrías añadir eso al comandocomposer up... o añadir la bandera -W, que indica a Composer que actualice todas las bibliotecas de symfony/ y sus dependencias.

Pero... Yo voy a actualizar todo con:

composer up

Mira: en nuestro archivo composer.json, las restricciones de versión de todos los paquetes (Symfony y otras bibliotecas) son realmente buenas Permiten actualizaciones de versiones menores, como de la 4.0 a la 4.1, pero no permiten actualizaciones de versiones mayores. Así que si hubiera una nueva versión 5 de esta biblioteca, al ejecutar composer up no se actualizaría a esa nueva versión mayor.

En otras palabras, la actualización sólo debería actualizar las versiones menores... y éstas, en teoría, no contendrán ninguna ruptura. Así que hagamos esto:

composer up

Y... ¡hola actualizaciones! ¡Vaya! ¡Mira qué lista tan grande! Muchas cosas de Symfony... pero también muchas otras librerías.

Vale, así que ha sido una gran actualización. ¿Sigue funcionando el sitio? No lo sé Dirígete, actualiza y... ¡funciona! ¡Symfony es increíble!

Revisando las Depreciaciones

Ahora que estamos en Symfony 5.4, podemos ver la lista completa de rutas de código obsoletas que encontramos al renderizar esta página. Tu número variará... y el número puede incluso cambiar cuando actualices la página... eso se debe a que algunas páginas utilizan la caché. Parece que tengo unas 71 depreciaciones.

Si haces clic en esto, genial. Podemos ver cuáles son todas ellas.

Así que en este punto, nuestro trabajo es sencillo... pero no necesariamente fácil. Tenemos que buscar cada una de estas desaprobaciones, averiguar qué código hay que cambiar, y luego hacer ese cambio. Algunas serán bastante obvias... y otras no.

Así que, antes de intentar buscarlas manualmente, vamos a hacer algo más automático. Somos programadores, ¿verdad? Utilicemos una herramienta llamada Rector para automatizar todos los cambios posibles en nuestro código. Eso es lo siguiente.

Leave a comment!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": "^8.0.2",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "babdev/pagerfanta-bundle": "^3.6", // v3.6.1
        "composer/package-versions-deprecated": "^1.11", // 1.11.99.5
        "doctrine/annotations": "^1.13", // 1.13.2
        "doctrine/dbal": "^3.3", // 3.3.5
        "doctrine/doctrine-bundle": "^2.0", // 2.6.2
        "doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.2
        "doctrine/orm": "^2.0", // 2.11.2
        "knplabs/knp-markdown-bundle": "^1.8", // 1.10.0
        "knplabs/knp-time-bundle": "^1.18", // v1.18.0
        "pagerfanta/doctrine-orm-adapter": "^3.6", // v3.6.1
        "pagerfanta/twig": "^3.6", // v3.6.1
        "sensio/framework-extra-bundle": "^6.0", // v6.2.6
        "sentry/sentry-symfony": "^4.0", // 4.2.8
        "stof/doctrine-extensions-bundle": "^1.5", // v1.7.0
        "symfony/asset": "6.0.*", // v6.0.7
        "symfony/console": "6.0.*", // v6.0.7
        "symfony/dotenv": "6.0.*", // v6.0.5
        "symfony/flex": "^2.1", // v2.1.7
        "symfony/form": "6.0.*", // v6.0.7
        "symfony/framework-bundle": "6.0.*", // v6.0.7
        "symfony/mailer": "6.0.*", // v6.0.5
        "symfony/monolog-bundle": "^3.0", // v3.7.1
        "symfony/property-access": "6.0.*", // v6.0.7
        "symfony/property-info": "6.0.*", // v6.0.7
        "symfony/proxy-manager-bridge": "6.0.*", // v6.0.6
        "symfony/routing": "6.0.*", // v6.0.5
        "symfony/runtime": "6.0.*", // v6.0.7
        "symfony/security-bundle": "6.0.*", // v6.0.5
        "symfony/serializer": "6.0.*", // v6.0.7
        "symfony/stopwatch": "6.0.*", // v6.0.5
        "symfony/twig-bundle": "6.0.*", // v6.0.3
        "symfony/ux-chartjs": "^2.0", // v2.1.0
        "symfony/validator": "6.0.*", // v6.0.7
        "symfony/webpack-encore-bundle": "^1.7", // v1.14.0
        "symfony/yaml": "6.0.*", // v6.0.3
        "symfonycasts/verify-email-bundle": "^1.7", // v1.10.0
        "twig/extra-bundle": "^2.12|^3.0", // v3.3.8
        "twig/string-extra": "^3.3", // v3.3.5
        "twig/twig": "^2.12|^3.0" // v3.3.10
    },
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.1
        "phpunit/phpunit": "^9.5", // 9.5.20
        "rector/rector": "^0.12.17", // 0.12.20
        "symfony/debug-bundle": "6.0.*", // v6.0.3
        "symfony/maker-bundle": "^1.15", // v1.38.0
        "symfony/var-dumper": "6.0.*", // v6.0.6
        "symfony/web-profiler-bundle": "6.0.*", // v6.0.6
        "zenstruck/foundry": "^1.16" // v1.18.0
    }
}