WEBVTT

00:00:01.246 --> 00:00:03.576 align:middle
Tengo que decir que echo de menos los años 90.

00:00:04.076 --> 00:00:06.556 align:middle
Bueno, no los beanie babies y...

00:00:06.556 --> 00:00:09.286 align:middle
definitivamente no la forma
de vestir de entonces, pero...

00:00:09.566 --> 00:00:10.876 align:middle
las cintas de mezclas.

00:00:11.536 --> 00:00:15.746 align:middle
Si no eras un niño en los 80 o los
90, quizá no sepas lo difícil que era

00:00:15.746 --> 00:00:18.786 align:middle
compartir tus canciones
favoritas con tus amigos.

00:00:19.386 --> 00:00:24.846 align:middle
Oh sí, estoy hablando de un mashup de
Michael Jackson, Phil Collins y Paula Abdul.

00:00:25.056 --> 00:00:25.886 align:middle
La perfección.

00:00:26.816 --> 00:00:31.406 align:middle
Para aprovechar esa nostalgia,
pero con un toque hipster, vamos a

00:00:31.976 --> 00:00:35.306 align:middle
crear una nueva aplicación llamada Mixed Vinyl

00:00:35.726 --> 00:00:40.416 align:middle
una tienda en la que los usuarios pueden
crear cintas de mezcla, con Boyz || Men,

00:00:40.556 --> 00:00:42.856 align:middle
Mariah Carey y Smashing Pumpkins...

00:00:43.136 --> 00:00:45.846 align:middle
sólo que prensadas en un disco de vinilo.

00:00:46.496 --> 00:00:49.646 align:middle
Hmm, puede que tenga que poner
un tocadiscos en mi coche.

00:00:50.666 --> 00:00:55.756 align:middle
La página que estamos viendo, que es súper
bonita y cambia de color cuando refrescamos...

00:00:56.156 --> 00:00:57.946 align:middle
no es una página real.

00:00:58.186 --> 00:01:02.916 align:middle
Es sólo una forma de que Symfony nos diga
"hola" y nos enlace a la documentación.

00:01:03.406 --> 00:01:06.986 align:middle
Y por cierto, la documentación
de Symfony es estupenda,

00:01:07.096 --> 00:01:09.666 align:middle
así que no dudes en
consultarla mientras aprendes.

00:01:10.996 --> 00:01:17.996 align:middle
Vale: todo framework web en cualquier lenguaje
tiene el mismo trabajo: ayudarnos a crear páginas,

00:01:18.356 --> 00:01:24.076 align:middle
ya sean páginas HTML,
respuestas API JSON o arte ASCII.

00:01:24.596 --> 00:01:30.936 align:middle
Y casi todos los marcos lo hacen de la misma manera:
mediante un sistema de rutas y controladores.

00:01:31.666 --> 00:01:35.586 align:middle
La ruta define la URL de la
página y apunta a un controlador.

00:01:36.236 --> 00:01:40.216 align:middle
El controlador es una función
PHP que construye esa página.

00:01:40.766 --> 00:01:43.736 align:middle
Así que ruta + controlador = página.

00:01:44.106 --> 00:01:45.206 align:middle
Son matemáticas, gente.

00:01:46.146 --> 00:01:48.016 align:middle
Vamos a construir estas dos cosas...

00:01:48.186 --> 00:01:50.036 align:middle
más o menos a la inversa.

00:01:50.396 --> 00:01:53.336 align:middle
Así que primero, vamos a crear
la función del controlador.

00:01:54.156 --> 00:01:59.986 align:middle
En Symfony, la función del controlador es
siempre un método dentro de una clase PHP.

00:02:00.736 --> 00:02:07.266 align:middle
Te lo mostraré: en el directorio
src/Controller/, crea una nueva clase PHP.

00:02:07.326 --> 00:02:11.206 align:middle
Vamos a llamarla VinylController, pero
el nombre puede ser cualquier cosa.

00:02:12.256 --> 00:02:13.956 align:middle
Y, ¡felicidades!

00:02:14.126 --> 00:02:16.066 align:middle
¡Es nuestra primera clase PHP!

00:02:16.476 --> 00:02:18.276 align:middle
¿Y adivina dónde vive?

00:02:18.616 --> 00:02:23.686 align:middle
En el directorio src/, donde
vivirán todas las clases PHP.

00:02:23.686 --> 00:02:28.876 align:middle
Y, en general, no importa cómo
organices las cosas dentro de src/:

00:02:29.266 --> 00:02:32.796 align:middle
normalmente puedes poner las
cosas en el directorio que quieras

00:02:32.796 --> 00:02:34.896 align:middle
y nombrar las clases como quieras.

00:02:35.106 --> 00:02:37.056 align:middle
Así que da rienda suelta a tu creatividad.

00:02:37.566 --> 00:02:39.766 align:middle
Pero hay dos reglas importantes.

00:02:39.766 --> 00:02:46.716 align:middle
En primer lugar, fíjate en el espacio de nombres que
PhpStorm ha añadido sobre la clase: App\Controller.

00:02:47.326 --> 00:02:50.786 align:middle
Sea como sea que decidas
organizar tu directorio src/,

00:02:51.036 --> 00:02:55.346 align:middle
el espacio de nombres de una clase debe
coincidir con la estructura del directorio...

00:02:55.536 --> 00:02:56.776 align:middle
empezando por App.

00:02:57.556 --> 00:03:01.316 align:middle
Puedes imaginar que el espacio de
nombres App\ apunta al directorio src/.

00:03:02.376 --> 00:03:06.046 align:middle
Entonces, si pones un archivo
en un subdirectorio Controller/,

00:03:06.266 --> 00:03:09.326 align:middle
necesita una parte Controller
en su espacio de nombres.

00:03:09.966 --> 00:03:13.386 align:middle
Si alguna vez metes la pata, por
ejemplo, si escribes algo mal

00:03:13.416 --> 00:03:16.156 align:middle
o te olvidas de esto, lo vas a pasar mal.

00:03:16.296 --> 00:03:22.286 align:middle
PHP no podrá encontrar la clase: obtendrás
un error de "clase no encontrada".

00:03:23.156 --> 00:03:26.016 align:middle
Ah, y la otra regla es que el nombre de

00:03:26.016 --> 00:03:31.516 align:middle
un archivo debe coincidir con el nombre
de la clase dentro de él, más .php.

00:03:31.516 --> 00:03:34.886 align:middle
Por lo tanto, VinylController.php.

00:03:34.886 --> 00:03:39.016 align:middle
Seguiremos esas dos reglas para todos
los archivos que creemos en src/.

00:03:39.706 --> 00:03:42.296 align:middle
Volvamos a nuestra tarea de crear
una función de controlador.

00:03:43.356 --> 00:03:46.596 align:middle
Dentro, añade un nuevo método
público llamado homepage().

00:03:47.316 --> 00:03:50.676 align:middle
Y no, el nombre de este
método tampoco importa:

00:03:51.256 --> 00:03:54.026 align:middle
prueba a ponerle el nombre
de tu gato: ¡funcionará!

00:03:54.106 --> 00:03:57.936 align:middle
Por ahora, sólo voy a poner una
declaración die() con un mensaje.

00:04:01.006 --> 00:04:01.876 align:middle
¡Buen comienzo!

00:04:02.646 --> 00:04:08.146 align:middle
Ahora que tenemos una función de controlador,
vamos a crear una ruta, que define la URL

00:04:08.146 --> 00:04:11.306 align:middle
de nuestra nueva página y
apunta a este controlador.

00:04:12.146 --> 00:04:18.836 align:middle
Hay varias formas de crear rutas en Symfony,
pero casi todo el mundo utiliza atributos.

00:04:18.906 --> 00:04:19.956 align:middle
Así es como funciona.

00:04:20.556 --> 00:04:22.126 align:middle
Justo encima de este método, decimos #[].

00:04:22.126 --> 00:04:32.386 align:middle
Esta es la sintaxis de atributos de PHP 8, que es
una forma de añadir configuración a tu código.

00:04:32.386 --> 00:04:34.976 align:middle
Empieza a escribir Route.

00:04:35.286 --> 00:04:40.006 align:middle
Pero antes de que termines, observa
que PhpStorm lo autocompleta.

00:04:40.756 --> 00:04:42.886 align:middle
Pulsa el tabulador para dejar que termine.

00:04:43.636 --> 00:04:46.766 align:middle
Eso, muy bien, completó
la palabra Route para mí.

00:04:47.246 --> 00:04:52.066 align:middle
Pero lo más importante es que ha añadido
una declaración use en la parte superior.

00:04:52.846 --> 00:04:57.386 align:middle
Siempre que utilices un atributo, debes tener una
declaración use correspondiente en la parte superior

00:04:57.426 --> 00:04:58.916 align:middle
del archivo.

00:04:59.756 --> 00:05:04.496 align:middle
Dentro de Route, pasa /, que
será la URL de nuestra página.

00:05:05.076 --> 00:05:06.396 align:middle
Y... ¡listo!

00:05:06.896 --> 00:05:10.716 align:middle
Esta ruta define la URL y
apunta a este controlador...

00:05:11.086 --> 00:05:13.936 align:middle
simplemente porque está justo
encima de este controlador.

00:05:15.096 --> 00:05:16.156 align:middle
¡Vamos a probarlo!

00:05:17.036 --> 00:05:18.086 align:middle
Refresca y...

00:05:18.816 --> 00:05:20.346 align:middle
¡felicidades! ¡

00:05:20.586 --> 00:05:26.726 align:middle
Symfony miró la URL, vio que coincidía
con la ruta - / o sin barra es lo mismo

00:05:26.726 --> 00:05:31.176 align:middle
para la página de inicio - ejecutó nuestro
controlador y golpeó la declaración die !

00:05:31.776 --> 00:05:35.206 align:middle
Ah, y por cierto, sigo diciendo
función del controlador.

00:05:35.556 --> 00:05:39.136 align:middle
Comúnmente se llama simplemente
"controlador" o "acción"...

00:05:39.366 --> 00:05:40.656 align:middle
sólo para confundir las cosas.

00:05:41.536 --> 00:05:47.706 align:middle
Vale, pues dentro del controlador -o acción-
podemos escribir el código que queramos

00:05:47.806 --> 00:05:54.396 align:middle
para construir la página, como hacer consultas a la base de
datos, llamadas a la API, renderizar una plantilla, lo que sea.

00:05:54.836 --> 00:05:57.386 align:middle
Todo eso lo vamos a hacer eventualmente.

00:05:58.076 --> 00:06:03.876 align:middle
Lo único que le importa a Symfony es que
tu controlador devuelva un objeto Response.

00:06:04.776 --> 00:06:10.376 align:middle
Compruébalo: escribe return y
luego empieza a escribir Response.

00:06:10.406 --> 00:06:15.616 align:middle
Woh: ya hay unas cuantas clases
Response en nuestro código...

00:06:15.866 --> 00:06:17.546 align:middle
¡y dos son de Symfony!

00:06:18.296 --> 00:06:20.886 align:middle
Queremos la de HTTP foundation.

00:06:21.566 --> 00:06:25.616 align:middle
HTTP foundation es una de
esas bibliotecas de Symfony...

00:06:25.696 --> 00:06:30.376 align:middle
y nos proporciona bonitas clases para cosas
como la Petición, la Respuesta y la Sesión.

00:06:31.206 --> 00:06:35.056 align:middle
Pulsa el tabulador para
autocompletar y termina eso.

00:06:35.056 --> 00:06:37.246 align:middle
Oh, debería haber dicho
devolver una nueva respuesta.

00:06:38.676 --> 00:06:39.406 align:middle
Así está mejor.

00:06:40.186 --> 00:06:41.246 align:middle
Ahora dale al tabulador.

00:06:42.326 --> 00:06:47.026 align:middle
Cuando dejé que Response autocompletara
la primera vez, muy importante,

00:06:47.086 --> 00:06:50.366 align:middle
PhpStorm añadió esta declaración
de uso en la parte superior.

00:06:51.236 --> 00:06:56.596 align:middle
Cada vez que hagamos referencia a una clase o
interfaz, tendremos que añadir una sentencia use al

00:06:56.596 --> 00:06:58.676 align:middle
principio del archivo en
el que estemos trabajando.

00:06:59.496 --> 00:07:04.626 align:middle
Al dejar que PhpStorm autocompletara eso por mí,
añadió la declaración use automáticamente.

00:07:05.196 --> 00:07:08.456 align:middle
Lo haré cada vez que haga
referencia a una clase.

00:07:09.156 --> 00:07:13.626 align:middle
Ah, y si todavía eres un poco nuevo en lo que respecta a los
espacios de nombres de PHP y las declaraciones use, echa un

00:07:13.886 --> 00:07:18.146 align:middle
vistazo a nuestro breve y gratuito
tutorial sobre espacios de nombres de PHP.

00:07:19.396 --> 00:07:27.436 align:middle
De todos modos, dentro de Response, podemos poner
lo que queramos devolver al usuario: HTML, JSON o,

00:07:27.646 --> 00:07:35.466 align:middle
por ahora, un simple mensaje, como el título del
vinilo mixto en el que estamos trabajando: PB y jams.

00:07:37.576 --> 00:07:39.806 align:middle
Bien, equipo, ¡vamos a ver qué pasa!

00:07:39.806 --> 00:07:42.056 align:middle
Actualiza y...

00:07:42.446 --> 00:07:43.836 align:middle
¡PB y mermeladas!

00:07:44.446 --> 00:07:50.636 align:middle
Puede que no parezca gran cosa, ¡pero acabamos de construir
nuestra primera página Symfony totalmente funcional!

00:07:51.006 --> 00:07:53.456 align:middle
¡Ruta + controlador = beneficio!

00:07:53.806 --> 00:07:57.836 align:middle
Y acabas de aprender la parte
más fundamental de Symfony...

00:07:58.176 --> 00:07:59.716 align:middle
y sólo estamos empezando.

00:08:00.226 --> 00:08:04.926 align:middle
Ah, y como nuestros controladores siempre
devuelven un objeto Response, es opcional,

00:08:05.236 --> 00:08:08.996 align:middle
pero puedes añadir un tipo de
retorno a esta función si lo deseas.

00:08:09.446 --> 00:08:13.096 align:middle
Pero eso no cambia nada: sólo es
una forma agradable de codificar.

00:08:14.266 --> 00:08:16.426 align:middle
A continuación me siento bastante seguro.

00:08:16.496 --> 00:08:23.126 align:middle
Así que vamos a crear otra página, pero con una ruta
mucho más elegante que coincide con un patrón comodín
