Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Turbo: Supercarga tu aplicación

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.

Bienvenido al último capítulo de nuestro tutorial de introducción a Symfony 6. Si estás viendo esto, ¡lo estás petando! Y es hora de celebrarlo instalando un paquete más de Symfony. Pero antes de hacerlo, como sabes, me gusta confirmar todo primero... por si el nuevo paquete instala una receta interesante:

git add .
git commit -m "Never gonna let you go..."

Instalando symfony/ux-turbo

Bien, vamos a instalar el nuevo paquete:

composer require symfony/ux-turbo

¿Ves ese "ux" en el nombre del paquete? Symfony UX es un conjunto de bibliotecas que añaden funcionalidad JavaScript a tu aplicación... a menudo con algo de código PHP para ayudar. Por ejemplo, hay una biblioteca para renderizar gráficos... y otra para usar un Cropper de imágenes con el sistema de formularios.

Recetas UX de Symfony

Así que, como puedes ver, esto instaló una receta. OoOOo. Ejecuta

git status

para que podamos ver lo que ha hecho. La mayor parte es normal, como config/bundles.phpque significa que habilitó el nuevo bundle. Los dos cambios interesantes sonassets/controllers.json y package.json. Comprobemos primero package.json.

Cuando instalas un paquete UX, lo que suele significar es que te estás integrando con una biblioteca JavaScript de terceros. Y así, la receta de ese paquete añade esa biblioteca a tu código. En este caso, la biblioteca JavaScript con la que nos estamos integrando se llama @hotwired/turbo. Además, el propio paquete PHP symfony/ux-turbo viene con algo de JavaScript adicional. Esta línea especial dice

¡Hey Node! Quiero incluir un paquete llamado @symfony/ux-turbo... pero en lugar de de descargarlo, puedes encontrar su código en el directorio directorio vendor/symfony/ux-turbo/Resources/assets.

Puedes buscar literalmente en esa ruta vendor/symfony/ux-turbo/Resources/assets para encontrar un mini paquete JavaScript. Ahora, debido a que esto actualizó nuestro archivo package.json, tenemos que volver a instalar nuestras dependencias para descargarlo y tenerlo todo listo.

De hecho, busca tu terminal que está ejecutando yarn watch. Tenemos un error! Dice que no se puede encontrar el archivo @symfony/ux-turbo/package.json, intenta ejecutaryarn install --force.

¡Vamos a hacerlo! Pulsa control+C para detener esto... y luego ejecuta

yarn install --force

o npm install --force. Luego, reinicia Encore con:

yarn watch

El otro archivo que la receta modificó fue assets/controllers.json. Vamos a echarle un vistazo: assets/controllers.json. Esta es otra cosa que es exclusiva de Symfony UX. Normalmente, si queremos añadir un controlador Stimulus, lo ponemos en el directoriocontrollers/. Pero a veces, puede que instalemos un paquete PHP y que queramos añadir su propio controlador Stimulus en nuestra aplicación. Esta sintaxis dice básicamente

¡Hey Stimulus! Ve a cargar este controlador Stimulus desde ese nuevo @symfony/ux-turbo paquete.

Ahora bien, este controlador Stimulus en particular es un poco raro. No es uno que vayamos a utilizar directamente dentro de la función stimulus_controller() Twig. Es una especie de controlador falso. ¿Qué hace? Sólo con que se cargue, va a activar la biblioteca Turbo.

¡Hola Turbo! Por la actualización de la página completa

Sigo hablando de Turbo. ¿Qué es Turbo? Bueno, al ejecutar ese comando composer require... y luego reinstalar yarn, el JavaScript de Turbo está ahora activo y funcionando en nuestro sitio. ¿Qué hace? Es sencillo: convierte cada clic en un enlace y cada envío de un formulario de nuestro sitio en una llamada Ajax. Y eso hace que nuestro sitio sea rápido como un rayo.

Compruébalo. Haz una última actualización completa. Y luego observa... si hago clic en Examinar, ¡no hay actualización completa de la página! Si hago clic en estos iconos, ¡no hay actualización! Turbo intercepta esos clics, hace una llamada Ajax a la URL, y luego pone ese HTML en nuestro sitio. Esto es enorme porque, de repente, nuestra aplicación se ve y se siente como una aplicación de una sola página... ¡sin que nosotros hagamos nada!

La barra de herramientas de depuración web y el perfilador de peticiones Ajax

Ahora, otra cosa interesante que notarás es que, aunque las recargas de páginas completas han desaparecido, estas llamadas Ajax aparecen en la barra de herramientas de depuración web. Y puedes hacer clic para ir a ver el perfil de esa llamada Ajax muy fácilmente. Esta parte de la barra de herramientas de depuración web es aún más útil con las llamadas Ajax para una ruta de la API. Si pulsamos el icono de reproducción... ese 7 acaba de subir a 8... ¡y aquí está el perfilador de esa petición de la API! Abriré ese enlace en una nueva ventana. Esa es una forma súper fácil de llegar al perfilador de cualquier petición Ajax.

Así que Turbo es increíble... y puede hacer más. Hay algunas cosas que debes saber sobre él antes de enviarlo a producción, y si te interesa, ¡sí! tenemos un tutorial completo sobre Turbo. Quería mencionarlo en este tutorial porque Turbo es más fácil si lo añades a tu aplicación desde el principio.

Muy bien, ¡felicidades! ¡El primer tutorial de Symfony 6 está en los libros! Date una palmadita en la espalda... o mejor, busca a un amigo y choca los cinco.

¡Y sigue adelante! Acompáñanos en el siguiente tutorial de esta serie, que te hará pasar de ser un desarrollador de Symfony en ciernes a alguien que realmente entiende lo que está pasando. Cómo funcionan los servicios, el sentido de todos estos archivos de configuración, los entornos Symfony, las variables de entorno y mucho más. Básicamente todo lo que necesitarás para hacer lo que quieras con Symfony.

Y si tienes alguna pregunta o idea, estamos aquí para ti en la sección de comentarios debajo del vídeo.

Muy bien amigos, ¡hasta la próxima!

Leave a comment!

16
Login or Register to join the conversation
Prim N. Avatar
Prim N. Avatar Prim N. | posted hace 1 año

database connection.

hey is there a resource to connect the whole project into a database or even a video.

2 Reply

I've been going along this 'tutorial' on the documentation, which has helped me a lot for anyone else wondering

https://symfony.com/doc/current/doctrine.html#configuring-the-database

1 Reply

Hey there,

What do you mean by "connect the whole project into a database"? In many of our tutorials, we use a database to store information. If you're using Doctrine, that's a straightforward thing to do

Reply

Hey,

At the time of the comment I didn't spend much time looking for tutorials which was the reason I just agreed. I'm currently not in the financial position to buy courses but I found the documentation for doctrine which is also very helpful and enough for my purpose :)

Reply

It is good to know that Doctrine docs are helpful to you. By the way, we give for free the chapter script (including code blocks) below the video, so you can follow our tutorials at least in that way

Cheers!

Reply
Juergen-S Avatar
Juergen-S Avatar Juergen-S | posted hace 6 meses

Thank you for this great training (which was also free). As a developer with more than 20 years of experience, I only ever find training courses that are either far too detailed on minor details or that don't address practical topics (debugging, logging) at all. Only now do I understand Symfony 6 so that I know how best to start a new project.

Reply

Hey Juergen,

Thanks for your kind words. I'm so glad to hear that you find our courses useful.

Cheers!

Reply
Cameron Avatar

I get that turbo is used to make the page more SPA like, but how is that different from a full page refresh? There's no pre-loading, sure it keeps the console state etc, but it still takes time to load the page from the server and paint it right? To me that doesn't really seem like an advantage. So the advantage is that is just downloads everything in the background, paints it and then only switches over to the new page once it's all loaded?

What am I missing?

Reply
Vafilor Avatar

Hey team,

Maybe add an r to "you"? "Supercharge your App"?

Reply

Hey Vafilor!

Ah, yes, good catch! Thank you for reporting it, I fixed in https://github.com/SymfonyCasts/symfony6/commit/d0cd5bc0175c2ff4fc644c3e66520bd80cbd2e67

Cheers!

Reply
MarcoTohom Avatar
MarcoTohom Avatar MarcoTohom | posted hace 11 meses

please add a video to learn how to add components to symfony point releases

Reply

Hey Marco,

Your idea sounds interesting, but I don't fully get it. Could you elaborate a bit more, please?

Reply
MarcoTohom Avatar

i have a project with symfony 3.8 and i want to add components to it

Reply

In case a bundle is what you need, you can create your own bundles without much hassle. Here's a tutorial about it https://symfonycasts.com/screencast/symfony-bundle

But if what you really need is a component, well, a component is just like any other PHP library that may use (or not) other Symfony components and are meant to do a specific job. So, you can just create another PHP app, and publish it somewhere so you can require it via Composer

Cheers!

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": "*",
        "symfony/asset": "6.0.*", // v6.0.3
        "symfony/console": "6.0.*", // v6.0.3
        "symfony/dotenv": "6.0.*", // v6.0.3
        "symfony/flex": "^2", // v2.1.5
        "symfony/framework-bundle": "6.0.*", // v6.0.4
        "symfony/monolog-bundle": "^3.0", // v3.7.1
        "symfony/runtime": "6.0.*", // v6.0.3
        "symfony/twig-bundle": "6.0.*", // v6.0.3
        "symfony/ux-turbo": "^2.0", // v2.0.1
        "symfony/webpack-encore-bundle": "^1.13", // v1.13.2
        "symfony/yaml": "6.0.*", // v6.0.3
        "twig/extra-bundle": "^2.12|^3.0", // v3.3.8
        "twig/twig": "^2.12|^3.0" // v3.3.8
    },
    "require-dev": {
        "symfony/debug-bundle": "6.0.*", // v6.0.3
        "symfony/stopwatch": "6.0.*", // v6.0.3
        "symfony/web-profiler-bundle": "6.0.*" // v6.0.3
    }
}
userVoice