Chapters
Scroll down to the script below, click on any sentence (including terminal blocks) to jump to that spot in the video!
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.php
que 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 directoriovendor/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!
25 Comments
Hey Jakov,
Thank you for your feedback! This really means a lot to us and pushes us to create more content ❤️
Cheers!
database connection.
hey is there a resource to connect the whole project into a database or even a video.
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
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
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 :)
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!
Hey! I accidentally found out about symfonycasts.com when doing other, paid Symfony 6 course. And then I couldn't stop listening Ryan instead 😅 Those videos are golden! Very useful, interesting, prepared with attention to details. I'll jump to other courses for sure!
Once you start listening to Ryan you can't stop!
I got your hive five!
Hello, Turbo might be usefull but just one moment has not lighted in lesson. If you run some thing on page - JS loop counter, audio, video or WS/WSS connection - it would not be cancel whenever you go to another turboued page. As I understand the mechanism of stopping all the stuff might need to make manualy. Insted unexpectable side effects wil be usual.
Hey @PimiTree
Yes, that sounds about right. If you're using Stimulus, you can implement your controller's disconnect()
function and cancel/disable all the things you need. If you're not using Stimulus you'll need to find the right Turbo event to do that https://turbo.hotwired.dev/reference/events
Cheers!
I ran into a problem with turbo, where it made Ajax Calls for stuff in the profiler-bar as well. Every time i hover over an icon in the profiler bar, the ajax call-counter increments and another entry is made. A quick research didn't bring any solutions. Any idea how i can exclude specific URLs from turbo or where i possibly need to update a config file or something?
Hello @Michael-B
Sorry for the late reply, interesting according to this link https://github.com/symfony/ux/issues/1520 it should be already fixed, however it will be good to know what versions of Symfony, Turbo are installed at your project
Cheers!
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.
Hey Juergen,
Thanks for your kind words. I'm so glad to hear that you find our courses useful.
Cheers!
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?
Hey team,
Maybe add an r to "you"? "Supercharge your App"?
Hey Vafilor!
Ah, yes, good catch! Thank you for reporting it, I fixed in https://github.com/SymfonyCasts/symfony6/commit/d0cd5bc0175c2ff4fc644c3e66520bd80cbd2e67
Cheers!
please add a video to learn how to add components to symfony point releases
Hey Marco,
Your idea sounds interesting, but I don't fully get it. Could you elaborate a bit more, please?
i have a project with symfony 3.8 and i want to add components to it
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!
"Houston: no signs of life"
Start the conversation!
What PHP libraries does this tutorial use?
// composer.json
{
"require": {
"php": ">=8.1",
"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.4.5
"symfony/framework-bundle": "6.0.*", // v6.0.4
"symfony/monolog-bundle": "^3.0", // v3.7.1
"symfony/runtime": "6.4.3", // v6.4.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
}
}
Your tutorials are by far the best I've seen for any programming topic.