Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Actualizando a Symfony 6.0

Keep on Learning!

If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.

Start your All-Access Pass
Buy just this tutorial for $10.00

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

¡Por fin ha llegado el momento de actualizar a Symfony 6! ¡Woo!

Rector se actualiza a 6.0

Pero antes, por si acaso, vamos a ejecutar Rector una vez más. Vuelve al repositorio de Rector, haz clic en el enlace de Symfony, y... roba el mismo código que teníamos antes. Pégalo en nuestro archivo rector.php. Luego, al igual que hicimos para Symfony 5.4, cambia SymfonySetList por SymfonyLevelSetList, y esta vez, diUP_TO_SYMFONY_60.

28 lines rector.php
... lines 1 - 14
return static function (ContainerConfigurator $containerConfigurator): void {
... lines 16 - 23
$containerConfigurator->import(SymfonyLevelSetList::UP_TO_SYMFONY_60);
$containerConfigurator->import(SymfonySetList::SYMFONY_CODE_QUALITY);
$containerConfigurator->import(SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION);
};

En teoría, no debería haber ninguna diferencia de código entre Symfony 5.4 y 6.0... aunque a veces hay pequeñas limpiezas que puedes hacer una vez que hayas actualizado.

Ejecutemos esto y veamos qué ocurre. Digamos:

vendor/bin/rector process src/

Y... vale. Ha hecho un cambio. Se trata de nuestro suscriptor de eventos: ha añadido un tipo de retorno array. Esto se hizo porque, en el futuro, esta interfaz puede añadir un tipo de retornoarray. Así que ahora nuestro código es compatible con el futuro.

... lines 1 - 9
class CheckVerifiedUserSubscriber implements EventSubscriberInterface
{
... lines 12 - 24
public static function getSubscribedEvents(): array
{
... lines 27 - 29
}
}

Actualización a través de Composer

Una vez hecho esto, ¡vamos a actualizar! En composer.json, tenemos que encontrar las bibliotecas principales de Symfony y cambiar su versión de 5.4.* a 6.0.*. Tomemos el camino más perezoso y hagámoslo con un "Find & Replace".

111 lines composer.json
{
... lines 2 - 5
"require": {
... lines 7 - 21
"symfony/asset": "6.0.*",
"symfony/console": "6.0.*",
"symfony/dotenv": "6.0.*",
... line 25
"symfony/form": "6.0.*",
"symfony/framework-bundle": "6.0.*",
... line 28
"symfony/property-access": "6.0.*",
"symfony/property-info": "6.0.*",
"symfony/proxy-manager-bridge": "6.0.*",
"symfony/routing": "6.0.*",
"symfony/runtime": "6.0.*",
"symfony/security-bundle": "6.0.*",
"symfony/serializer": "6.0.*",
"symfony/stopwatch": "6.0.*",
"symfony/twig-bundle": "6.0.*",
... line 38
"symfony/validator": "6.0.*",
... line 40
"symfony/yaml": "6.0.*",
... lines 42 - 45
},
"require-dev": {
... lines 48 - 50
"symfony/debug-bundle": "6.0.*",
... line 52
"symfony/var-dumper": "6.0.*",
"symfony/web-profiler-bundle": "6.0.*",
... line 55
},
... lines 57 - 103
"extra": {
"symfony": {
... line 106
"require": "6.0.*"
}
}
}

¡Genial! Como antes, no vamos a tocar ninguna biblioteca de Symfony que no forme parte del paquete principal y que siga su propio esquema de versiones. Ah, y en el fondo, esto también cambió extra.symfony.require a 6.0.*.

Así que, ¡estamos listos! Como antes, podríamos decir:

composer up 'symfony/*'

Pero... No me voy a molestar en eso. Actualicemos todo con sólo:

composer up

Y... ¡fracasa! Hmm. Una de las librerías que estoy usando esbabdev/pagerfanta-bundle... y aparentemente requiere PHP 7.2... pero nosotros estamos usando PHP 8. Si miras más allá, hay algunos errores sobrepagerfanta-bundle[v2.8.0] que requieren symfony/config ^3.4 || ^4.4 || ^5.1, pero no Symfony 6. Entonces, ¿qué está pasando aquí? Resulta que pagerfanta-bundle[v2.8.0]no es compatible con Symfony 6. ¡Ja!

Ejecuta

composer outdated

para ver una lista de paquetes obsoletos. Oooh! babdev/pagerfanta-bundle tiene una nueva versión 3.6.1. Entra en composer.json y búscalo... ¡aquí está! Cambia su versión a ^3.6.

111 lines composer.json
{
... lines 2 - 5
"require": {
... lines 7 - 9
"babdev/pagerfanta-bundle": "^3.6",
... lines 11 - 45
},
... lines 47 - 109
}

Se trata de una actualización de versión mayor. Así que puede contener algunas interrupciones de compatibilidad con versiones anteriores. Lo comprobaremos en un momento. Prueba:

composer up

de nuevo y... ¡lo hace! ¡Todo se ha actualizado a Symfony 6!

Arreglando PasswordUpgraderInterface::upgradePassword()

Y luego... para celebrarlo... inmediatamente explotó mientras se limpiaba la caché. Uh oh... Creo que nos hemos perdido una deprecación:

En UserRepository, upgradePassword([...]): void debe ser compatible con PasswordUpgraderInterface.

Si quieres ver esto en color, puedes refrescar la página de inicio para ver lo mismo.

Por cierto, en Symfony 5.4, ahora podemos hacer clic en este icono para copiar la ruta del archivo a nuestro portapapeles. Ahora, si vuelvo a mi editor, pulso "shift" + "shift" y pego, salto directamente al archivo -e incluso a la línea- donde está el problema.

Y... ¡uf! PhpStorm no está contento. Eso es porque el método upgradePassword() pasó de requerir un UserInterface a requerir unPasswordAuthenticatedUserInterface. Así que sólo tenemos que cambiarlo y... ¡listo!

... lines 1 - 8
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
... lines 10 - 18
class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface
{
... lines 21 - 28
public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void
{
... lines 31 - 37
}
}

De vuelta a nuestro terminal, si ejecutamos

php bin/console cache:clear

Ahora está contento. Todavía tenemos algunas desaprobaciones aquí abajo de una biblioteca diferente... pero voy a ignorarlas. Vienen de un paquete obsoleto que... Realmente necesito eliminar por completo de este proyecto.

Actualizando PagerFanta

Vamos a asegurarnos de que la página de inicio funciona. ¿No funciona? Obtenemos

Se ha intentado cargar la clase QueryAdapter del espacio de nombres "Pagerfanta\Doctrine\ORM.

Esto no debería ser una sorpresa... ya que actualizamos pagerfanta-bundle de 2.8 a 3.6.

Esta es una situación en la que tienes que encontrar la página de GitHub de la biblioteca y esperar que tengan un documento de actualización. Este sí lo tiene. Si lo lees con atención, descubrirás que un montón de clases que antes formaban parte de Pagerfanta ahora se han dividido en bibliotecas independientes. Así que si queremos utilizar este QueryAdapter, tenemos que instalar un paquete independiente. Hazlo con:

composer require pagerfanta/doctrine-orm-adapter

Genial... y si refrescamos ahora... ¿otro error? Este es aún mejor:

Función desconocida pagerfanta. ¿Te has olvidado de ejecutar composer require pagerfanta/twig en question/homepage.html.twig?.

La integración de Twig también se trasladó a su propio paquete... así que también tenemos que ejecutar ese comando:

composer require pagerfanta/twig

Y... después de hacerlo... ¡está vivo! ¡Tenemos un proyecto Symfony 6! ¡Woohoo! Si hacemos clic, las cosas parecen funcionar bien. ¡Lo hemos conseguido!

Comprobación de paquetes desactualizados

En nuestra línea de comandos, ejecuta

composer outdated

para ver todos los paquetes obsoletos que nos quedan. La lista es ahora muy corta. Un paquete es knplabs/knp-markdown-bundle, que está totalmente actualizado... pero ha sido abandonado. Si lo tienes en un proyecto real, refactorízalo para utilizartwig/markdown-extra. No me voy a molestar, pero por eso está en esta lista.

Lo más importante aquí es que doctrine/dbal tiene una nueva versión mayor, así que ¡eh! Ya que estamos aquí actualizando cosas, ¡actualicémoslo también! Eso a continuación, junto con algunas limpiezas finales.

Leave a comment!

10
Login or Register to join the conversation
Nicolas-S Avatar
Nicolas-S Avatar Nicolas-S | posted hace 4 meses | edited

Have you encountered this error when upgrading from 5.4 to 6.0 ?

Neither the property "authenticatorManagerEnabled" nor one of the methods "authenticatorManagerEnabled()", "getauthenticatorManagerEnabled()"/"isauthenticatorManagerEnabled()"/"hasauthenticatorManagerEnabled()" or "__call()" exist and have public access in class "Symfony\Bundle\SecurityBundle\DataCollector\SecurityDataCollector".

I understand the code enabling the new authenticator manager has been dropped in symfony 6, since it is now the only authentication system. But I have checked, I don't call that anywhere in my code.

Reply

Hey Nicolas,

Since the new authenticator system is enabled by default, you'll have to disable it or upgrade your security system

Cheers!

Reply
Nicolas-S Avatar

Thank you Mollokhan.

The thing is... I am using the new security system ! I followed the steps in this tutorial.

I will double check to see if some old code ( linked to fosuser maybe ) isn't causing this.

Reply
Nicolas-S Avatar

Turns out it was a freak cache issue.

I had cleared the cache with bin/console cache:clear many times, but only after doing rm -r var/cache/*did my web debug toolbar come back.

Reply

Ha! That's totally unexpected, but for some reason, Symfony's cache gets "stuck" from time to time. So, is a good idea to clear the cache manually when something does not make any sense.

Cheers!

Reply
Dan_M Avatar

Hey guys!

Oddly, after upgrading to Symfony 6, my web debug toolbar is not working. Instead of the toolbar, I get the symfony logo and the message "An error occurred while loading the web debug toolbar." How do I chase down that error?

Thanks!

Reply
Dan_M Avatar

Never mind! The symfony serve error log pointed out the problem. Somehow, I lost the enable_authenticator_manager: true line in my security.yaml file. When I put that back, the web debug toolbar worked.

Thanks for the great tutorial (as always!)

1 Reply
Nicolas-S Avatar

You can try to chase down a web debug toolbar breakdown by looking at the network tab in the navigator dev tools. You should see a xhr request (filter for xhr) for the debug toolbar and if you click on it, you should find its response and more convenient the preview of that response, which shows the error message.

Reply

Next chapter (17) is not allowed.

I see a message:
"This website symfonycasts.com/screencast... is currently offline. Cloudflare's Always Online™ shows a snapshot of this web page from the Internet Archive's Wayback Machine. To check for the live version, click Refresh."

Update:
All right now

Reply

Hey dzianisr

Sorry for this, we had an internal issue and it took some time to fix it.

Thanks for staying with us! Cheers and have a nice day!

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