WEBVTT

00:00:01.086 --> 00:00:04.706 align:middle
Si quieres crear una API, puedes
hacerlo absolutamente con Symfony.

00:00:05.216 --> 00:00:10.386 align:middle
De hecho, es una opción fantástica, en
parte gracias a API Platform. Se trata de

00:00:10.896 --> 00:00:14.266 align:middle
un marco para crear APIs
construido sobre Symfony

00:00:14.416 --> 00:00:16.796 align:middle
que agiliza la construcción de tu API

00:00:16.976 --> 00:00:20.766 align:middle
y crea una API más robusta
de lo que puedas imaginar.

00:00:21.196 --> 00:00:24.196 align:middle
Pero también es bastante sencillo
devolver JSON desde un controlador.

00:00:24.636 --> 00:00:27.426 align:middle
Veamos si podemos devolver
algunos datos del barco como JSON.

00:00:28.096 --> 00:00:29.956 align:middle
Esta será nuestra segunda página.

00:00:30.126 --> 00:00:34.596 align:middle
Bueno, en realidad es un "punto final", pero será
nuestra segunda combinación de ruta y controlador.

00:00:35.226 --> 00:00:38.536 align:middle
En MainController, podríamos
añadir otro método aquí.

00:00:38.966 --> 00:00:43.016 align:middle
Pero para organizarnos, vamos a crear una
clase de controlador totalmente nueva.

00:00:43.706 --> 00:00:47.986 align:middle
Iré a Nuevo -> Clase PHP y la
llamaré StarshipApiController.

00:00:48.826 --> 00:00:53.596 align:middle
Como he ido a Nuevo -> Clase PHP, me ha
creado la clase y el espacio de nombres.

00:00:53.926 --> 00:00:54.706 align:middle
¡Súper bien!

00:00:55.246 --> 00:00:58.466 align:middle
Además, en adelante, cada
vez que cree un controlador,

00:00:58.646 --> 00:01:01.296 align:middle
extenderé inmediatamente AbstractController...

00:01:01.826 --> 00:01:05.066 align:middle
porque esos atajos son agradables
y no hay inconveniente. Añade

00:01:05.756 --> 00:01:07.626 align:middle
un public function getCollection() porque

00:01:07.736 --> 00:01:11.036 align:middle
esto devolverá información sobre
una colección de naves estelares.

00:01:11.586 --> 00:01:15.406 align:middle
Y, como siempre, puedes añadir el
tipo de retorno Response u omitirlo.

00:01:15.986 --> 00:01:18.796 align:middle
Encima de esto, añade la ruta con #[Route()].

00:01:19.286 --> 00:01:21.566 align:middle
Selecciona la de Attribute y pulsa tabulador.

00:01:22.286 --> 00:01:25.036 align:middle
Así que acabo de utilizar el autocompletado
para añadir las declaraciones use

00:01:25.036 --> 00:01:28.386 align:middle
para AbstractController, Route, y Response.

00:01:28.596 --> 00:01:30.406 align:middle
Asegúrate de que las tienes todas.

00:01:30.936 --> 00:01:34.226 align:middle
Para la URL, ¿qué tal /api/starships.

00:01:35.056 --> 00:01:39.076 align:middle
Dentro, pegaré una variable $starships
que se establecerá en una matriz

00:01:39.246 --> 00:01:42.346 align:middle
de tres matrices asociativas
de datos de naves estelares.

00:01:43.196 --> 00:01:45.816 align:middle
Probablemente puedas imaginar
cómo se verá esto como JSON.

00:01:46.396 --> 00:01:48.136 align:middle
¿Cómo lo convertimos en JSON?

00:01:48.596 --> 00:01:54.536 align:middle
Bueno, puede ser así de sencillo: return
new Response con json_encode($starships).

00:01:55.146 --> 00:01:56.896 align:middle
¡Pero podemos hacerlo mejor!

00:01:57.226 --> 00:02:00.736 align:middle
En lugar de eso, devuelve
$this->json($starships).

00:02:01.446 --> 00:02:02.376 align:middle
¡Vamos a probarlo!

00:02:02.766 --> 00:02:06.376 align:middle
Busca tu navegador y
dirígete a /api/starships.

00:02:06.956 --> 00:02:08.496 align:middle
Vaya, ha sido fácil.

00:02:09.026 --> 00:02:13.216 align:middle
Si te preguntas por qué el JSON está estilizado
y tiene un aspecto chulo, no es cosa de Symfony.

00:02:13.216 --> 00:02:16.406 align:middle
Tengo instalada una extensión
de Chrome llamada JSONVue.

00:02:17.176 --> 00:02:21.606 align:middle
Ahora, en el mundo real, cuando empecemos a
consultar la base de datos, vamos a trabajar

00:02:21.606 --> 00:02:24.666 align:middle
con objetos, no con matrices asociativas.

00:02:25.306 --> 00:02:29.256 align:middle
No añadiremos una base de datos en este
tutorial, pero podemos empezar a utilizar objetos

00:02:29.256 --> 00:02:31.516 align:middle
para nuestros datos para hacer
las cosas más realistas.

00:02:32.076 --> 00:02:35.696 align:middle
En el directorio src/, crea un
nuevo subdirectorio llamado Model.

00:02:36.536 --> 00:02:41.506 align:middle
Vale, algo importante: lo que vamos a hacer no
tiene absolutamente nada que ver con Symfony.

00:02:41.886 --> 00:02:45.006 align:middle
Simplemente estoy mirando este
array y pensando: ¿Sabes qué?

00:02:45.296 --> 00:02:50.936 align:middle
En lugar de pasar por este array asociativo
con claves name, class, captain, y status,

00:02:51.216 --> 00:02:54.926 align:middle
prefiero tener una clase
Starship y pasar por objetos.

00:02:55.356 --> 00:03:01.296 align:middle
Así que por mi cuenta, independientemente de
Symfony, he decidido crear un directorio Model -

00:03:01.616 --> 00:03:05.636 align:middle
que podría llamarse cualquier cosa - y
dentro una nueva clase llamada Starship.

00:03:06.486 --> 00:03:12.446 align:middle
Y como esta clase es sólo para ayudarnos,
podemos darle el aspecto que queramos,

00:03:12.876 --> 00:03:15.216 align:middle
y no necesita extender ninguna clase base.

00:03:15.866 --> 00:03:21.556 align:middle
Crea un public function __construct() con
cinco propiedades: una private int $id,

00:03:22.036 --> 00:03:26.066 align:middle
luego cuatro propiedades más para cada una
de las cuatro claves que tenemos en la matriz:

00:03:26.876 --> 00:03:29.716 align:middle
private string $name, private string $class,

00:03:30.336 --> 00:03:33.796 align:middle
private string $captain
y private string $status.

00:03:35.026 --> 00:03:39.466 align:middle
Ah, y mi editor está resaltando este
archivo porque hemos instalado PHP-CS-Fixer

00:03:39.646 --> 00:03:42.196 align:middle
y ha encontrado una violación
del estilo del código.

00:03:42.666 --> 00:03:47.696 align:middle
Puedo hacer clic en esto para arreglarlo o ir aquí
y pulsar Alt+Enter para hacer el arreglo allí.

00:03:47.966 --> 00:03:49.196 align:middle
¡Súper bonito! De

00:03:49.826 --> 00:03:54.026 align:middle
todos modos, si no estás familiarizado con la
sintaxis de este constructor, esto crea un constructor

00:03:54.026 --> 00:03:59.536 align:middle
con cinco argumentos y, al mismo tiempo,
crea cinco propiedades que se establecerán

00:03:59.536 --> 00:04:01.986 align:middle
a lo que pasemos a estos argumentos.

00:04:02.626 --> 00:04:05.306 align:middle
Pero, como he decidido que
estas propiedades sean privadas,

00:04:05.656 --> 00:04:08.726 align:middle
si instanciáramos un nuevo objeto Starship...

00:04:08.996 --> 00:04:11.586 align:middle
¡no podríamos leer ninguno de los datos!

00:04:12.336 --> 00:04:14.926 align:middle
Para permitirlo, podemos crear métodos getter.

00:04:15.396 --> 00:04:16.796 align:middle
Pero, no voy a hacer esto a mano.

00:04:17.146 --> 00:04:21.636 align:middle
En su lugar, ve a la opción de menú
Código -> Generar -o Cmd + N en Mac-,

00:04:21.936 --> 00:04:25.366 align:middle
selecciona getters y genera
un getter para cada propiedad.

00:04:26.246 --> 00:04:29.846 align:middle
¡Qué bien! Cinco nuevos y
brillantes métodos getter públicos.

00:04:30.656 --> 00:04:36.466 align:middle
Vale, de vuelta en nuestro controlador, convirtamos estas
matrices en objetos: new Starship() - pulsa tabulador,

00:04:36.466 --> 00:04:40.646 align:middle
para que añada la declaración use
- luego dale un id de, qué tal, 1...

00:04:41.176 --> 00:04:49.256 align:middle
y transfiere los otros valores para name,
class, captain, y finalmente status.

00:04:50.316 --> 00:04:53.066 align:middle
Y así de fácil, ¡ya
tenemos nuestro primer objeto!

00:04:53.696 --> 00:04:57.356 align:middle
Resaltaré las otras dos matrices y pegaré
los dos objetos para ahorrar tiempo.

00:04:58.156 --> 00:05:01.306 align:middle
Ahora tenemos una matriz
de 3 objetos Starship...

00:05:01.306 --> 00:05:02.636 align:middle
que queda más bonito.

00:05:03.006 --> 00:05:05.596 align:middle
Y se los pasamos a $this->json().

00:05:06.086 --> 00:05:07.836 align:middle
¿Seguirá funcionando?

00:05:08.216 --> 00:05:09.466 align:middle
¡Totalmente no!

00:05:09.856 --> 00:05:12.426 align:middle
¡Obtenemos una matriz de tres objetos vacíos!

00:05:12.816 --> 00:05:19.026 align:middle
Eso es porque, internamente, $this->json()
utiliza la función PHP json_encode()...

00:05:19.286 --> 00:05:22.186 align:middle
y esa función no puede
manejar propiedades privadas.

00:05:22.726 --> 00:05:26.276 align:middle
Lo que necesitamos es algo más
inteligente: algo que pueda reconocer que,

00:05:26.486 --> 00:05:30.506 align:middle
aunque la propiedad name es privada, tenemos
un método público getName() al que se

00:05:30.506 --> 00:05:33.016 align:middle
puede llamar para leer el
valor de esa propiedad.

00:05:33.666 --> 00:05:35.566 align:middle
¿Existe alguna herramienta que haga eso?

00:05:36.036 --> 00:05:40.326 align:middle
Bueno, ¿recuerdas que Symfony es un enorme conjunto
de componentes que resuelven problemas individuales?

00:05:40.826 --> 00:05:45.186 align:middle
Un componente se llama serializador,
y todo su trabajo consiste en tomar

00:05:45.186 --> 00:05:47.936 align:middle
objetos y serializarlos a JSON...

00:05:48.286 --> 00:05:52.536 align:middle
o tomar JSON y deserializarlo
de nuevo en objetos.

00:05:52.936 --> 00:05:54.966 align:middle
Y puede manejar totalmente situaciones

00:05:54.966 --> 00:05:58.266 align:middle
en las que tienes propiedades privadas
con métodos getter públicos.

00:05:58.656 --> 00:06:00.506 align:middle
Así que ¡a instalarlo!

00:06:00.856 --> 00:06:07.986 align:middle
composer require serializer Y una vez
más amigos, sí, esto es un alias...

00:06:08.066 --> 00:06:10.096 align:middle
y es un alias de un paquete.

00:06:10.526 --> 00:06:15.536 align:middle
Este paquete instala el paquete
symfony/serializer, así como algunos otros

00:06:15.536 --> 00:06:18.086 align:middle
que lo hacen funcionar de
forma realmente robusta.

00:06:18.846 --> 00:06:24.296 align:middle
Ahora, sin hacer nada más, vuelve
atrás, actualiza, ¿y funciona?

00:06:24.516 --> 00:06:29.096 align:middle
¿Cómo? Resulta que el método
$this->json() es inteligente.

00:06:29.556 --> 00:06:36.006 align:middle
Para verlo, mantén pulsado Comando en un Mac o Ctrl en otras
máquinas y haz clic en el nombre del método para saltar

00:06:36.006 --> 00:06:38.566 align:middle
al archivo principal de
Symfony donde se encuentra.

00:06:39.436 --> 00:06:42.876 align:middle
¡Ah! El código aquí aún
no tiene todo el sentido,

00:06:43.166 --> 00:06:46.746 align:middle
pero detecta si el sistema
serializador está disponible....

00:06:46.996 --> 00:06:51.286 align:middle
y si lo está, lo utiliza para
transformar el objeto a JSON.

00:06:51.916 --> 00:06:55.096 align:middle
Pero, ¿qué quiero decir exactamente
con "sistema serializador"?

00:06:55.416 --> 00:06:57.796 align:middle
¿Y cuál es la clave serializer...

00:06:58.076 --> 00:07:00.126 align:middle
dentro de esta cosa contenedora?

00:07:00.686 --> 00:07:04.966 align:middle
O, ¿y si necesitáramos transformar un objeto a JSON
en algún lugar distinto de nuestro controlador...

00:07:05.086 --> 00:07:07.946 align:middle
donde no tenemos acceso al
acceso directo ->json()?

00:07:08.446 --> 00:07:11.366 align:middle
¿Cómo podríamos acceder al
sistema serializador desde allí?

00:07:12.046 --> 00:07:17.136 align:middle
Amigos, es hora de conocer el concepto
más importante de Symfony: los servicios.
