WEBVTT

00:00:00.036 --> 00:00:03.266 align:middle
En realidad, Symfony tiene dos partes...

00:00:03.486 --> 00:00:05.316 align:middle
y acabamos de aprender una de ellas.

00:00:05.316 --> 00:00:08.686 align:middle
La primera parte es el sistema
ruta-controlador.

00:00:09.196 --> 00:00:12.096 align:middle
Y espero que te sientas muy cómodo:
crea una ruta,

00:00:12.376 --> 00:00:15.816 align:middle
la ruta ejecuta una función del controlador,
regresamos una respuesta.

00:00:16.316 --> 00:00:21.916 align:middle
La segunda mitad de Symfony es todo sobre
los múltiples "objetos útiles"

00:00:22.016 --> 00:00:24.596 align:middle
que flotan alrededor de Symfony.

00:00:24.596 --> 00:00:31.106 align:middle
Por ejemplo, cuando hacemos un render de un template,
lo que en realidad hacemos es aprovecharnos

00:00:31.176 --> 00:00:34.876 align:middle
del objeto twig y decirle que haga el render.

00:00:35.376 --> 00:00:39.156 align:middle
El método render() es solo un atajo para
utilizar ese objeto.

00:00:39.746 --> 00:00:46.326 align:middle
También existe un objeto logger, el objeto del caché y muchos
otros, como el objeto de la conexión con la base de datos

00:00:46.486 --> 00:00:51.186 align:middle
y un objeto que ayuda a hacer llamados
HTTP a otras APIs.

00:00:51.826 --> 00:00:52.706 align:middle
Básicamente...

00:00:52.926 --> 00:00:57.096 align:middle
cada cosa que Symfony
realiza - o nosotros -

00:00:57.396 --> 00:01:01.516 align:middle
realmente es hecha por uno de estos objetos útiles.

00:01:01.876 --> 00:01:07.756 align:middle
Demonios, incluso el rúter es un objeto que
busca cuál ruta se empareja con el request actual.

00:01:08.306 --> 00:01:13.206 align:middle
En el mundo de Symfony - bueno, en realidad, en
el mundo de programación orientada a objetos -

00:01:13.516 --> 00:01:18.296 align:middle
estos "objetos que hacen algún trabajo" se
les otorga un nombre especial: servicios.

00:01:18.686 --> 00:01:24.356 align:middle
Pero no permitas que te confunda: cuando
escuches "servicio", solo piensa: ¡Hey!

00:01:24.706 --> 00:01:29.316 align:middle
Es un objeto que hace algún
trabajo - como el objeto logger

00:01:29.316 --> 00:01:31.786 align:middle
o el objeto que hace consultas a la base de datos.

00:01:32.946 --> 00:01:36.026 align:middle
Dentro del CommentController, vamos a
registrar un log.

00:01:36.556 --> 00:01:40.306 align:middle
Para hacerlo, necesitamos el servicio "logger".

00:01:40.706 --> 00:01:41.576 align:middle
¿Cómo lo podemos obtener?

00:01:41.576 --> 00:01:49.506 align:middle
Encuentra tu terminal y corre: php bin/console
debug:autowiring Saluda a uno

00:01:49.506 --> 00:01:52.416 align:middle
de los comandos más importantes de bin/console.

00:01:52.776 --> 00:01:56.766 align:middle
Esto nos muestra una lista de todos los
objetos servicio en nuestra app.

00:01:57.176 --> 00:02:01.686 align:middle
Bueno, está bien, estos no son todos:
pero es una lista que contiene

00:02:01.686 --> 00:02:04.616 align:middle
todos los servicios que probablemente necesites.

00:02:05.206 --> 00:02:07.916 align:middle
Incluso en nuestra pequeña app, hay
muchas cosas aquí:

00:02:08.316 --> 00:02:12.326 align:middle
hay algo llamado
Psr\Log\LoggerInterface,

00:02:12.716 --> 00:02:14.906 align:middle
hay cosas para el caché y mucho más.

00:02:15.476 --> 00:02:19.086 align:middle
Conforme instalamos más bundles, esta lista
va a crecer.

00:02:19.646 --> 00:02:22.456 align:middle
Más servicios significa más herramientas.

00:02:22.456 --> 00:02:26.996 align:middle
Para encontrar qué servicio nos permite
crear "logs", corre:

00:02:26.996 --> 00:02:32.786 align:middle
php bin/console debug:autowiring log
Esto retorna un montón de cosas...

00:02:33.116 --> 00:02:37.616 align:middle
pero ignora todos los de aquí abajo por
ahora y enfocate en la línea de arriba.

00:02:38.116 --> 00:02:41.726 align:middle
Esto nos dice que hay un
objeto servicio logger

00:02:41.726 --> 00:02:47.686 align:middle
y su clase implementa
una Psr\Log\LoggerInterface.

00:02:48.146 --> 00:02:50.096 align:middle
¿Por qué es esto importante?

00:02:50.546 --> 00:02:57.366 align:middle
Porque para pedir el servicio logger,
lo haces utilizando este type-hint.

00:02:57.366 --> 00:02:59.526 align:middle
Se le llama "autowiring".

00:02:59.976 --> 00:03:02.626 align:middle
Así es como obtienes un servicio
desde un controlador.

00:03:03.156 --> 00:03:07.386 align:middle
Agrega un tercer argumento a tu método -
aunque el orden de los argumentos no importa.

00:03:07.916 --> 00:03:15.496 align:middle
Escribe LoggerInterface - autocompleta el
del  Psr\Log\LoggerInterface - y $logger.

00:03:16.936 --> 00:03:21.556 align:middle
Esto agregó el import arriba de la
clase para Psr\Log\LoggerInterface,

00:03:21.816 --> 00:03:27.106 align:middle
el cual es él mismo type-hint que el
debug:autowiring nos dijo que usáramos.

00:03:27.206 --> 00:03:31.246 align:middle
Gracias a este type-hint, cuando
Symfony hace un render de nuestro controlador,

00:03:31.586 --> 00:03:36.906 align:middle
sabrá que queremos que nos pase
el servicio del logger a este argumento.

00:03:37.486 --> 00:03:43.336 align:middle
Entonces... si: ahora existen dos tipos de argumentos
que puedes agregar a tus métodos del controlador.

00:03:43.436 --> 00:03:48.996 align:middle
Primero, puedes tener un argumento que
se empareja con un comodín de tu ruta.

00:03:49.466 --> 00:03:54.586 align:middle
Y segundo, puedes tener un argumento cuyo
type-hint sea el mismo a una de las clases

00:03:54.586 --> 00:03:57.836 align:middle
o interfaces listadas en debug:autowiring.

00:03:58.476 --> 00:04:02.646 align:middle
CacheInterface es otro type-hint que
podemos usar para tener el servicio de caché.

00:04:02.726 --> 00:04:05.956 align:middle
Así que... ¡Vamos a usar este objeto!

00:04:06.486 --> 00:04:08.816 align:middle
¿Qué métodos nos permite llamar?

00:04:08.816 --> 00:04:09.756 align:middle
¡No tengo idea!

00:04:10.146 --> 00:04:14.946 align:middle
Pero como escribimos el type-hint
apropiado, podemos decir $logger-&gt;

00:04:14.946 --> 00:04:19.496 align:middle
y PhpStorm nos dice exactamente
cuales métodos tiene.

00:04:20.076 --> 00:04:23.536 align:middle
Utilicemos $logger-&gt;info() para decir "Voting up!".

00:04:24.116 --> 00:04:26.636 align:middle
Cópialo y di "Voting down!"

00:04:26.636 --> 00:04:27.326 align:middle
en el else.

00:04:28.646 --> 00:04:29.546 align:middle
¡Es hora de probarlo!

00:04:30.256 --> 00:04:31.766 align:middle
Refresca la página y...

00:04:32.156 --> 00:04:34.116 align:middle
Hagamos click en arriba, abajo, arriba.

00:04:35.506 --> 00:04:38.226 align:middle
Esto... por lo menos no parece que esté roto.

00:04:39.106 --> 00:04:42.356 align:middle
Mueve el mouse sobre la parte del AJAX
de la herramienta web debug

00:04:42.636 --> 00:04:45.676 align:middle
y abre el profiler para uno de estos llamados.

00:04:46.236 --> 00:04:50.666 align:middle
El profiler tiene una sección de "Logs",
la cual ofrece una forma fácil

00:04:50.666 --> 00:04:53.386 align:middle
de ver los logs para un solo Request.

00:04:54.076 --> 00:04:54.796 align:middle
¡Ahí está!

00:04:55.086 --> 00:04:56.006 align:middle
"Voting up!".

00:04:56.686 --> 00:05:00.286 align:middle
También puedes encontrar esto en
el archivo var/log/dev.log.

00:05:00.876 --> 00:05:06.876 align:middle
El punto es: Symfony tiene muchos, muchos
objetos útiles, digo "servicios".

00:05:07.416 --> 00:05:11.706 align:middle
Y poco a poco, vamos a empezar
a utilizar más de ellos...

00:05:12.176 --> 00:05:16.956 align:middle
Cada vez agregando un type-hint para
decirle a Symfony cual servicio queremos.

00:05:18.006 --> 00:05:19.666 align:middle
Veamos otro ejemplo.

00:05:20.206 --> 00:05:24.716 align:middle
El primer servicio que usamos en
nuestro código es el servicio de Twig.

00:05:25.416 --> 00:05:26.036 align:middle
Lo usamos...

00:05:26.236 --> 00:05:29.816 align:middle
de forma "indirecta" al llamar $this-&gt;render().

00:05:30.406 --> 00:05:35.986 align:middle
En realidad, ese método es un atajo para
utilizar el servicio Twig detrás de escenas.

00:05:36.596 --> 00:05:38.726 align:middle
Y eso no debería de sorprenderte.

00:05:39.186 --> 00:05:44.536 align:middle
Como dije antes, todo lo que se realiza en
Symfony es hecho en realidad por un servicio.

00:05:45.456 --> 00:05:49.936 align:middle
Como reto, vamos a suponer que la
función render() no existe.

00:05:50.406 --> 00:05:54.346 align:middle
Gasp! En el controlador del homepage()
comentariza la línea render().

00:05:54.346 --> 00:06:00.336 align:middle
Entonces... ¿Cómo podemos utilizar el servicio
de Twig directamente para hacer un render de un template?

00:06:00.726 --> 00:06:01.156 align:middle
¡No lo sé!

00:06:01.156 --> 00:06:04.416 align:middle
Definitivamente podemos encontrar
algo de documentación al respecto...

00:06:04.846 --> 00:06:09.266 align:middle
pero vamos a ver si podemos descubrirlo por
nosotros mismos con la ayuda

00:06:09.456 --> 00:06:15.936 align:middle
del comando debug:autowiring - php
bin/console debug:autowiring twig Y, ¡Voilà!

00:06:16.576 --> 00:06:21.396 align:middle
Aparentemente existe una clase llamada
Twig\Environment que podemos usar

00:06:21.396 --> 00:06:24.566 align:middle
como "type-hint" para obtener el servicio de Twig.

00:06:24.566 --> 00:06:29.906 align:middle
En nuestro controlador, escribe Environment y
presiona tab para agregar el import arriba.

00:06:30.336 --> 00:06:32.476 align:middle
Voy a nombrar al argumento $twigEnvironment.

00:06:33.546 --> 00:06:37.976 align:middle
Dentro, escribe $html = $twigEnvironment-&gt;.

00:06:38.506 --> 00:06:45.536 align:middle
De nuevo, sin leer nada de documentación, gracias al hecho
de que estamos escribiendo código responsablemente

00:06:45.536 --> 00:06:50.856 align:middle
y usamos type-hints, PhpStorm nos muestra
todos los métodos de esta clase.

00:06:51.416 --> 00:06:54.316 align:middle
¡Mira! ¡Este método render() parece que
es el que necesitamos!

00:06:54.786 --> 00:06:56.416 align:middle
Pasa el mismo nombre del template de antes.

00:06:58.806 --> 00:07:02.606 align:middle
Cuando usas twig directamente, en vez de
retornar un objeto tipo Response,

00:07:02.816 --> 00:07:05.276 align:middle
retorna un string con el HTML.

00:07:05.866 --> 00:07:14.016 align:middle
No hay problema: termina con return new Response()
- la de HttpFoundation - y pasa $html.

00:07:14.016 --> 00:07:18.656 align:middle
Esto ahora está haciendo exactamente
lo mismo que $this-&gt;render().

00:07:19.746 --> 00:07:21.566 align:middle
Para probarlo, haz click en la página de inicio.

00:07:23.206 --> 00:07:24.696 align:middle
Todavía funciona.

00:07:25.346 --> 00:07:30.566 align:middle
Ahora en realidad, más allá de ser un
"gran ejercicio" para entender los servicios,

00:07:30.946 --> 00:07:34.026 align:middle
no hay razón para tomar el camino más largo.

00:07:34.546 --> 00:07:38.226 align:middle
solo quiero que entiendas que los servicios
realmente son las

00:07:38.456 --> 00:07:40.676 align:middle
"cosas" que hacen el trabajo detrás de escenas.

00:07:41.026 --> 00:07:46.366 align:middle
Y si quisieras hacer algo - como un log o un render
de un template - lo que realmente necesitas es

00:07:46.366 --> 00:07:49.726 align:middle
encontrar que servicios hacen ese trabajo.

00:07:50.606 --> 00:07:55.226 align:middle
Confía en mi, esta es la clave para liberar
todo tu potencial de Symfony.

00:07:56.456 --> 00:08:00.536 align:middle
Pongamos de vuelta el código anterior más corto,
y comentariza el otro ejemplo.

00:08:05.636 --> 00:08:09.476 align:middle
Muy bien, ya casi has terminado el primer
tutorial de symfony.

00:08:09.886 --> 00:08:14.726 align:middle
¡Eres el mejor! Como premio, vamos a terminar
con algo divertido:

00:08:14.726 --> 00:08:20.396 align:middle
Una introducción al sistema llamado
Webpack Encore que te va a permitir

00:08:20.396 --> 00:08:23.636 align:middle
hacer cosas alocadas con tu CSS y JavaScript.
