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!

5
Login or Register to join the conversation
Steve-D Avatar

Hi

When I run compose rup on my main machine (iMac) I get the following message.

The "symfony/flex" plugin (installed globally) was skipped because it requires a Plugin API version ("^1.0") that does not match your Composer installation ("2.2.0"). You may need to run composer update with the "--no-plugins" option.

When first getting in to using flex I must have somehow installed it globally. (I can see /usr/bin/flex and /usr/bin/flex++) not sure if these are the files though

Is there a way to remove flex globally and thus the error?

Thank you

Steve

Reply

Hey Steve D.!

Yup - I agree with your assessment! You should be able to remove it by running composer global remove symfony/flex.

Let me know if that does the trick :).

Cheers!

Reply
Kevin-C Avatar

Hi,
Great videos, Ryan.
During a composer recipes:update and getting back the following list:

[0 ] liip/imagine-bundle
[1 ] stof/doctrine-extensions-bundle
[2 ] symfony/apache-pack
[3 ] symfony/flex
[4 ] symfony/monolog-bundle
[5 ] symfony/phpunit-bridge
[6 ] symfony/routing
[7 ] symfony/security-bundle
[8 ] symfony/swiftmailer-bundle
[9 ] symfony/translation
[10] symfony/validator
[11] symfony/web-profiler-bundle
[12] symfony/webpack-encore-bundle

I typed 1 to update stof/doctrine-extensions-bundle
and I get the following error:

PHP Fatal error: Uncaught TypeError: Argument 1 passed to Symfony\Flex\Command\UpdateRecipesCommand::getRecipe() must be an instance of Composer\Package\Package, instance of Composer\Package\CompleteAliasPackage given, called in /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php on line 128 and defined in /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php:265
Stack trace:
#0 /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php(128): Symfony\Flex\Command\UpdateRecipesCommand->getRecipe(Object(Composer\Package\CompleteAliasPackage), '6c1ceb662f89970...', '1.2')
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Command/Command.php(245): Symfony\Flex\Command\UpdateRecipesCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php(835): Symfony\Component\Console\Command\ in /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php on line 265

Fatal error: Uncaught TypeError: Argument 1 passed to Symfony\Flex\Command\UpdateRecipesCommand::getRecipe() must be an instance of Composer\Package\Package, instance of Composer\Package\CompleteAliasPackage given, called in /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php on line 128 and defined in /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php:265
Stack trace:
#0 /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php(128): Symfony\Flex\Command\UpdateRecipesCommand->getRecipe(Object(Composer\Package\CompleteAliasPackage), '6c1ceb662f89970...', '1.2')
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Command/Command.php(245): Symfony\Flex\Command\UpdateRecipesCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php(835): Symfony\Component\Console\Command\ in /private/var/www/www.site.com/vendor/symfony/flex/src/Command/UpdateRecipesCommand.php on line 265

composer.json (partial)

"require": {
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"behat/transliterator": "~1.2",
"doctrine/cache": "~1.6",
"doctrine/collections": "~1.4",
"doctrine/common": "^3.0",
"doctrine/data-fixtures": "~1.3",
"doctrine/dbal": "^2.6",
"doctrine/doctrine-bundle": "^2.4",
"doctrine/doctrine-migrations-bundle": "^3.0",
"doctrine/inflector": "^1.2",
"doctrine/migrations": "^3.0",
"doctrine/orm": "^2.9",
"fig/link-util": "^1.1",
"gedmo/doctrine-extensions": "^3.1",
"guzzlehttp/guzzle": "^7.3",
"incenteev/composer-parameter-handler": "~2.1.1",
"jms/metadata": "^2.4.0",
"jms/serializer": "^3.14",
"jms/serializer-bundle": "^3.10",
"knplabs/knp-components": "2.4.0",
"knplabs/knp-paginator-bundle": "dev-master",
"liip/imagine-bundle": "2.x-dev",
"monolog/monolog": "^1.22",
"phpcollection/phpcollection": "0.4.0",
"ramsey/uuid": "3.8.0",
"sensio/framework-extra-bundle": "~5.2",
"stfalcon/tinymce-bundle": "^3.0.0",
"stof/doctrine-extensions-bundle": "^1.7",
"symfony/apache-pack": "^1.0",
"symfony/asset": "5.4.*",
"symfony/cache": "5.4.*",
"symfony/config": "5.4.*",
"symfony/console": "5.4.*",
"symfony/dependency-injection": "5.4.*",
"symfony/doctrine-bridge": "5.4.*",
"symfony/dotenv": "5.4.*",
"symfony/event-dispatcher": "5.4.*",
"symfony/expression-language": "5.4.*",
"symfony/flex": "^1.2",
"symfony/form": "5.4.*",
"symfony/framework-bundle": "5.4.*",
"symfony/http-foundation": "5.4.*",
"symfony/http-kernel": "5.4.*",
"symfony/lock": "5.4.*",
"symfony/mime": "5.4.*",
"symfony/monolog-bridge": "5.4.*",
"symfony/monolog-bundle": "^3.3",
"symfony/options-resolver": "5.4.*",
"symfony/property-access": "5.4.*",
"symfony/property-info": "5.4.*",
"symfony/rate-limiter": "5.4.*",
"symfony/routing": "5.4.*",
"symfony/runtime": "5.4.x-dev",
"symfony/security-bundle": "5.4.*",
"symfony/security-core": "5.4.*",
"symfony/security-csrf": "5.4.*",
"symfony/security-guard": "5.4.*",
"symfony/security-http": "5.4.*",
"symfony/serializer": "5.4.*",
"symfony/string": "5.4.*",
"symfony/swiftmailer-bundle": "^3.2",
"symfony/translation": "*",
"symfony/twig-bridge": "5.4.*",
"symfony/twig-bundle": "5.4.*",
"symfony/validator": "5.4.*",
"symfony/web-link": "4.4.*",
"symfony/web-profiler-bundle": "5.4.*",
"symfony/webpack-encore-bundle": "^1.1",
"symfony/yaml": "*",
"tattali/mobile-detect-bundle": "2.2.0",
"twig/twig": "^3.0",
"vich/uploader-bundle": "^1.18",
"vwo/vwo-php-sdk": "dev-master"
},

It's not just this package, it's also monolog-bundle

Would love your input/suggestions on how to tackle this one.
Thanks,
Kevin

Reply

The rector.php file generated is completely different from the one in the tutorial, and also the rector github docs. I guess they updated rector in the meantime?

Reply
Cat in space

"Houston: no signs of life"
Start the conversation!

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
    }
}