[0:00] Hey coders el día de hoy Les traigo un [0:01] video práctico en donde vamos a aprender [0:03] Cómo crear una red Api desde php [0:05] utilizando el framework larabel est es [0:07] un video bastante práctico en el que [0:09] ustedes van a ir creando desde cero un [0:11] ipi y al final van a ir probándolo a [0:13] través de un programa llamado Thunder [0:14] cline que es en realidad una extensión [0:16] de visel Studio code la r Api que vamos [0:17] a estar creando es muy sencilla lo que [0:19] nos va a permitir es hacer lo siguiente [0:20] yo puedo hacer una petición post a mi [0:22] Api students en donde yo puedo guardar [0:24] un nombre por ejemplo de un estudiante [0:26] voy a guardar un nombre que se llama [0:27] Ryan Rey el estudiante voy a colocarle [0:29] un cor coro por ejemplo Ryan @gmail o [0:31] Ryan @m envío y esto crea un registro Y [0:34] si hago una petición get y envío a [0:36] estudiantes también puedo obtener una [0:38] lista de estudiantes que están [0:39] almacenados en la base de datos también [0:41] puedo obtener un único estudiante o [0:43] también puedo eliminar un estudiante con [0:44] delete puedo eliminar de todos el [0:46] estudiante uno estudiante eliminado Y si [0:48] hay una petición que es de todos los [0:50] estudiantes pues ya no está el [0:51] estudiante que acabo de eliminar o [0:52] también puedo actualizar con un put [0:54] puedo decirle Okay del estudiante número [0:56] dos Quiero actualizar este Ryan rey por [0:59] Ryan por ejemplo mcmillan y envío y el [1:01] dato debería actualizarse sin embargo [1:03] este correo yo lo tengo que cambiar por [1:04] ejemplo aquí le digo Debería ser Ryan [1:06] @gmail envío y con esto se actualiza el [1:09] dato o si no quiero actualizar todo [1:10] también puedo enviar un Patch y le digo [1:11] de estudiantes dos tan solo Quiero [1:13] actualizar el correo no quiero [1:14] Actualizar más datos aparte del correo [1:15] entonces aquí puedo decirle Ryan [1:17] @outlook y envío y ya estaría entonces [1:19] lo que estoy creando aquí no es más que [1:20] un crud de una red sapi pero todo esto [1:22] lo vamos a crear desde cero creando [1:24] comandos del arabel alterando nuestro [1:26] código y luego al final les voy a [1:28] enseñar Cómo desplegarlo también en voy [1:30] a enseñar todo el proceso de crear un [1:31] crw en una red sapi y luego van a poder [1:33] extenderlo si ustedes continúan [1:34] estudiando este framework Así que si les [1:36] interesa pues vamos a empezar lo primero [1:38] que voy a hacer es crear un proyecto del [1:40] arabel desde cero Así que voy a abrir [1:42] una terminal y el primer Comando que voy [1:43] a ejecutar es el comando C desktop para [1:45] ubicarme en mi escritorio y voy a estar [1:47] utilizando El Comando de composer para [1:48] crear un proyecto si ustedes no lo [1:50] tienen instalado aún pueden utilizar el [1:51] video que le dejo en la descripción para [1:53] aprender cómo instalarlo El Comando es [1:54] el siguiente es composer ge create [1:56] project larabel sl larabel Y en este [1:59] caso el lo vamos a llamar larabel crot o [2:01] gu crud gu Api y vamos a dar un enter [2:04] esto lo que va a hacer es ya crear aquí [2:05] en mi escritorio todo un proyecto de [2:07] larabel entonces a partir de Aquí vamos [2:08] a simplemente arrastrarlo dentro de [2:10] nuestro editor de código y vamos a [2:12] empezar esperando a que termine de [2:13] instalarse todas estas dependencias en [2:15] la terminal aquí Ya terminó de [2:16] instalarse los paquetes Así que [2:17] simplemente puedo cerrar la terminal y [2:19] ahora sí yo puedo venir en visual Studio [2:21] code y El Comando que voy a estar [2:22] ejecutando inicialmente para ejecutar el [2:23] proyecto sería php artisan serf y con [2:26] esto si doy un enter lo que va a hacer [2:28] es ejecutar un servidor en el puerto [2:29] 8000 esto quiere decir que si abro un [2:31] navegador y escribo el local Host 8000 y [2:33] doy un enter vamos a dar una bienvenida [2:35] típica del arabel Okay esta es la página [2:36] del arabel que nos permite entender que [2:38] ya el proyecto está funcionando ahora [2:39] para empezar a editarlo esto ya genera [2:41] un servidor en vivo lo que significa que [2:43] si nosotros hacemos alguna edición esto [2:44] se va a reiniciar automáticamente pero [2:46] en nuestro caso no vamos a estar [2:47] utilizando larel para crear algún [2:49] proyecto que tenga interfaces sino [2:51] simplemente voy a estar utilizándolo [2:52] para crear un ipi entonces para poder [2:54] hacer eso primero voy a venir aquí en la [2:55] consola voy a cancelarlo con control c y [2:57] el primer Comando que voy a ejecutar es [2:59] el comando php p artisan install do. Api [3:02] si doy un enter esto lo que va a hacer [3:04] en nuestro proyecto es aquí aparte de la [3:06] carpeta routes en donde están nuestros [3:08] archivos de console y web va a aparecer [3:10] un nuevo archivo que se va a llamar Api [3:12] y también va a configurar aquí en [3:13] bootstrap el archivo que va a arrancar [3:15] la ipi es decir va a poder configurar [3:17] tanto unas rutas dedicadas a una red Api [3:20] y en App nosotros vamos a ver que ya lo [3:22] altera también para que lea ese archivo [3:23] simplemente para darles un recordatorio [3:25] en larabel las carpeta r nos sirve para [3:27] poder crear rutas o Ur les que el [3:30] navegador puede visitar De hecho aquí en [3:31] Api ya tenemos una que se llama user [3:33] pero en mi caso voy a reemplazarla para [3:35] darles una pequeña idea si nosotros [3:36] queremos hacer una petición sencilla yo [3:38] voy a cambiar esto y voy a colocarle [3:40] rout do pun get y aquí le voy a colocar [3:42] entre comillas simples y un Slash [3:44] students por ejemplo entonces supongamos [3:46] que estoy creando una ipi de estudiantes [3:47] voy a llamar students y aquí voy a crear [3:49] una función sencilla y esta función lo [3:51] que va a hacer es retornar un texto por [3:52] ejemplo quiero que retorne student list [3:54] Ahí está entonces coloco un punto y coma [3:56] aquí al final también un punto y coma y [3:57] con esto ya tengo una ruta ahora este [3:59] router no sé que Así sio es un Route y [4:00] con esto ya estaría en este caso no [4:02] estoy utilizando el módulo request vamos [4:04] a ejecutar esto simplemente Recuerden [4:06] que aquí en la terminal primero tengo [4:07] que ejecutar algo y por ejemplo aquí lo [4:09] primero que me pide es que cuando yo [4:10] ejecute El Comando install Api algo que [4:12] se me quedó pendiente es Okay una nueva [4:14] base de datos o una nueva migración de [4:16] base de datos va a ser ejecutada quieres [4:17] hacerlo vamos a escribir Yes enter y [4:19] listo con esto lo que va a hacer es que [4:21] ahora ha alterado nuestro modelo de base [4:22] de datos Por cierto cuando composer Crea [4:25] una base de datos es lo que hace Es que [4:26] aquí en database Crea una base de datos [4:28] de sqlite por lo que no necesitan [4:30] configurar nada de momento Entonces [4:31] vamos a ejecutar esto php artis and serf [4:33] Y si doy un enter vamos a venir en [4:35] nuestro navegador en el local Host 8000 [4:37] sl students Y si doy un enter esto [4:39] debería llevarme una ruta pero recuerden [4:41] que como estoy creando una Api esto debe [4:42] empezar con sl Api sl students y allí [4:44] veo un texto que dice student list [4:46] entonces con esto ya estamos [4:47] respondiendo una petición get o estamos [4:48] respondiendo algo al cliente cuando [4:50] visite esa página o en este caso esa URL [4:53] ahora si nosotros queremos crear un crud [4:54] vamos a cambiarlo por ejemplo porque no [4:56] tan Solamente voy a querer obtener [4:57] estudiantes sino también crearlos [4:59] actualiz darlo Y eliminarlos entonces lo [5:01] que yo puedo hacer es copiar esta ruta [5:02] vamos a pegarlo aquí debajo y ya no va a [5:04] ser get sino post post a students y Aquí [5:06] vamos a colocarle un texto que se diga [5:08] creating students o creando estudiantes [5:10] luego también voy a copiarlo otra vez [5:12] voy a pegarlo y también puedo tener un [5:13] método put o Patch depende de lo que [5:15] ustedes utilicen put o Patch son [5:18] similares el put permite actualizar todo [5:20] un objeto mientras que Patch permite [5:21] actualizar parcialmente en mi caso voy a [5:23] escoger put y vamos a colocar students y [5:24] Aquí vamos a colocar un texto que diga [5:26] actualizando estudiante Ahora aquí no [5:29] voy a actualizar todos los estudiantes [5:31] sin no tan solamente uno de ellos así [5:32] que una ruta en arabel es colocar un [5:34] Slash y para indicar que después va a [5:36] venir un ID voy a colocar entre llaves [5:37] un ID de esta forma pues indica que aquí [5:39] voy a tener que colocar un número o [5:42] algún texto después de students y de [5:43] hecho esto de aquí lo voy a copiar y lo [5:45] voy a pegar otra vez porque es lo mismo [5:46] para el delete y aquí voy a colocarle [5:48] eliminando estudiante listo con esto [5:50] Ahora ya tengo el crud completo e [5:52] incluso así como puedo obtener una lista [5:53] de estudiantes también puedo obtener uno [5:55] solo así que voy a copiar esto de aquí [5:56] voy a pegarlo debajo y también va a [5:57] funcionar con get Solo que esta ruta va [5:59] a decir de todo todos los estudiantes [6:00] quizás tan solo quiero uno de esos [6:01] estudiantes por ID entonces Aquí voy a [6:03] colocar obteniendo un estudiante vamos a [6:06] colocarle y aquí voy a colocarle [6:08] obteniendo lista de estudiantes listo [6:10] Entonces con eso ya tengo un crud vamos [6:12] a probarlo para poder hacerlo yo Les [6:13] recomiendo que instalen una extensión [6:14] que se llama Thunder Cent o también [6:16] pueden hacerlo a través de otro programa [6:18] o cliente res depende de cuál usen en mi [6:20] caso voy a buscar Thunder Cent aquí en [6:22] mis extensiones Okay se escriben de esta [6:24] forma simplemente vienen aquí y le dan [6:26] en instalar en mi caso yo ya lo tengo [6:27] instalado y cuando lo instale van a ver [6:28] un icono como este un icono de un [6:30] círculo con un rayo de hecho voy a [6:32] limpiar aquí mi historial ustedes van a [6:33] ver algo como esto Vamos a darle un New [6:34] request y por ejemplo yo puedo hacer una [6:36] petición get http 2 localhost 8000 slapi [6:41] students y doy un get y me dice [6:43] obteniendo la lista de estudiantes puedo [6:44] colocar de students quiero tan solo uno [6:46] y me dice obteniendo un estudiante si [6:48] hago una petición post a students y [6:50] envío me dice creando estudiantes si [6:51] hago una petición put vamos a ver Bueno [6:53] ahí me da un error porque student lleva [6:54] un ID un uno por ejemplo y ahora sí me [6:56] hice actualizando estudiante Y si doy un [6:58] delete con lo mismo ipi si algún número [7:00] me hice eliminando estudiante Okay ya [7:01] tengo el crud completo Entonces lo único [7:03] que me falta ahora es ya no tan [7:04] solamente Mostrar un texto sino que [7:05] quiero realmente consultar una base de [7:07] datos de verdad y quiero buscar o [7:09] alterar una base de datos Y enviar una [7:11] respuesta de vuelta entonces lo primero [7:12] que vamos a hacer es que vamos a crear [7:14] una migración para poder hacerlo vamos a [7:15] venir en la terminal de visual Studio [7:17] code voy a cancelarlo vamos a limpiar y [7:19] el primer Comando que voy a ejecutar es [7:20] el comando php artisan y aquí voy a [7:23] ejecutar El Comando make migration y [7:25] luego voy a colocar el nombre a una [7:26] tabla por ejemplo en este caso voy a [7:27] colocar create student table como el [7:30] nombre de la migración voy dar un enter [7:31] Y eso lo que va a hacer es que dentro de [7:32] nuestro proyecto en la ruta por ejemplo [7:34] llamada database migrations ha creado un [7:36] nuevo archivo Aquí está entonces vamos a [7:38] buscarlo digo database migrations y va a [7:40] ser el último archivo de hecho el último [7:42] que lo ha creado en esta fecha doy un [7:44] click Y esto es lo que ha creado él ha [7:45] creado una tabla llamada student y aquí [7:47] por ejemplo pueden ver que he colocado [7:48] un ID y un timestamp ahora dónde sacó el [7:50] nombre Bueno cuando yo creé la tabla le [7:52] coloqué create y le coloqué el nombre de [7:54] la tabla student Table Okay entonces de [7:56] esta forma es como yo al final voy a [7:58] poder decirle Okay este es el nombre de [8:00] la tabla Pero bueno vamos a alterar un [8:01] poco porque yo no quiero tan solamente [8:02] un ID y fecha sino que también quiero [8:04] colocar un nombre un correo y demás [8:06] Entonces por ejemplo yo puedo copiar [8:07] esta línea y le digo también así como [8:09] voy a recibir un table ID voy a recibir [8:10] un table stram y aquí yo espero que la [8:12] columna de la tabla se llama name luego [8:14] puedo copiar esto también le digo quiero [8:15] esperar un email vamos a copiarlo otra [8:17] vez voy a esperar un font vamos a [8:19] copiarlo otra vez quiero esperar un [8:20] Language un lenguaje del estudiante Por [8:22] ejemplo si está aprendiendo algún [8:23] lenguaje de programación por ejemplo y [8:25] ya estaría Entonces esta es la tabla al [8:26] final que yo quiero que se cree ya sea [8:28] en una tabla s sql como puede ser mysql [8:31] o mysql o sql server o sqlite en este [8:34] caso como estamos en sqlite se va a [8:36] crear en esa base de datos si ustedes [8:38] quieren ver qué es lo que tiene la base [8:39] de datos de sqlite yo Les recomiendo que [8:41] instalen una extensión de visual Studio [8:42] code que se llama sqlite vier de hecho [8:45] pueden buscarlo como sqlite y van a [8:46] llegar en esta extensión de aquí sqlite [8:48] vier y simplemente lo instalan y una vez [8:50] instalado lo que va a hacer o lo que le [8:51] va a permitir visual Studio c es ahora [8:53] verlo aquí mismo dentro de una pestaña [8:55] es decir pueden ir a la base de datos de [8:57] database sqlite dan un clic derecho y le [8:58] dan open en Wi y aquí colocan sqlite [9:01] Beer da un click y pueden ver que aquí [9:02] ahora tenemos las tablas que están [9:03] dentro de sqlite es decir hay una tabla [9:05] uses hay una tabla sessions y demás es [9:08] decir las tablas que crea eh larbel [9:09] cuando se crea un proyecto nuevo pero [9:11] bueno en nuestro caso como podemos ver [9:13] no vemos la tabla student porque tenemos [9:15] que migrar la es decir tenemos que [9:16] transformar este código de aquí en una [9:18] tabla por suerte no se hace manualmente [9:19] sino que vamos a abrir la terminal y el [9:21] siguiente Comando que voy a ejecutar es [9:22] el comando php artisan migrate y lo que [9:25] va a hacer es que va a leer el código y [9:27] ahora si nuevamente abro mi base de [9:28] datos clic derecho Open with vamos a [9:30] colocarle esq vier vamos a ver que ahora [9:33] Aquí está mi tabla student Y si yo abro [9:34] Aquí está el ID el name el email el font [9:36] el Language la fecha de creación y [9:37] actualización que es justamente ese Time [9:39] stamp que venía en el propio modelo [9:41] cuando lo abrimos es decir este de aquí [9:43] ahora con esto hemos creado una tabla [9:44] Pero así como tenemos una tabla tenemos [9:46] que crear código en nuestra aplicación [9:48] para poder interactuar con esa tabla [9:50] porque de momento lo único modelo que [9:51] tengo aquí es el modelo de usuario que [9:53] es una forma de poder Consultar los [9:55] datos de un usuario pero ahora como [9:56] tengo una tabla también de estudiantes [9:58] Quiero crear un modelo de estudiantes [9:59] entonces también se hace con un comando [10:01] de terminal Así que puedo venir en la [10:02] terminal y puedo decir php artisan y ya [10:05] no migration sino model y Aquí vamos a [10:07] llamarle a este modelo student con una s [10:09] mayúscula porque los modelos Por lo [10:11] general empiezan de esa forma user [10:12] student con con la primera letra [10:14] mayúscula doy un enter ya se lo que va a [10:15] crear es un nuevo archivo llamado studen [10:17] php como pueden ver y aquí es donde [10:18] vamos a alterarlo por defecto él crea [10:20] Aquí una especie de template nosotros lo [10:22] que vamos a hacer es extender ese [10:23] template entonces debajo de H Factory [10:25] voy a colocarle protected y aquí voy a [10:27] colocarle el nombre de una variable que [10:29] es Table y el nombre va a ser igual a [10:31] student por ejemplo este es el nombre de [10:33] la tabla o bueno en este caso es el [10:34] nombre del modelo que va a estar [10:36] relacionado con esta tabla lo siguiente [10:37] que voy a decir es protected nuevamente [10:38] y voy a colocarle un fillable que es [10:40] básicamente para decirle qué Campos van [10:42] a poder ser alterados y aquí voy a [10:44] nombrar los campos de name email address [10:47] y font de hecho si ustedes verifican [10:49] estos datos de aquí y vienen en la [10:51] migración es decir en database [10:53] migrations en el último archivo name [10:55] email font y lenguage es lo que necesito [10:57] Así que aquí sería lo mismo name email y [10:59] Language y aquí un punto y coma al final [11:01] del arreglo para simplemente decirle que [11:04] esos son los únicos Campos una vez tengo [11:05] el modelo lo siguiente es crear un [11:07] controlador Entonces vamos a abrir la [11:08] terminal nuevamente y el siguiente [11:09] Comando que voy a hacer es ejecutar php [11:11] artisan May controller y luego un nombre [11:14] para nuestro controlador en este caso [11:15] voy a llamarle student controller y doy [11:18] un enter esto lo que hace de hecho es [11:19] que si nosotros entramos en App en http [11:21] vamos a ver que ahora hay un student [11:22] controller De hecho si ustedes no les [11:24] gusta que esté aquí o quieren ordenarlo [11:26] un poco mejor lo pueden eliminar y [11:27] pueden volver a ejecutar El Comando pero [11:28] le pueden colocar un Slash al inicio [11:30] pueden decirle que vaya por inicio en [11:32] una carpeta Api Slash student controller [11:34] y da un enter y lo vo a volver a crear [11:36] Pero dentro de una carpeta Api entonces [11:37] este student controller lo que va a [11:39] tener justamente los métodos o las [11:41] funciones que se van a ejecutar cuando [11:43] se visite alguna URL por ejemplo aquí yo [11:45] puedo crear en esta clase de student [11:47] controller una función nueva que va a [11:49] ser pública es decir va a poder ser [11:50] accedida vamos a colocarle Index y [11:52] debajo voy a decirle que va a retornar [11:54] un texto que diga obteniendo lista de [11:55] estudiantes Este es un método que al [11:57] final cualquier otro parte del código [11:59] puede llamarlo si vengo nuevamente en la [12:01] carpeta routes en Api y aquí por ejemplo [12:04] yo tengo mi ruta que se llama students [12:05] en lugar de tenerlo aquí que dice [12:06] obteniendo lista de estudiantes vamos a [12:08] quitar esa función y voy a llamarlo [12:10] desde el controller Pero primero tengo [12:11] que importarlo le digo vas a utilizar [12:12] desde app y aquí empezamos a nombrar [12:15] cada uno de esos de hecho es de use app [12:17] y bueno desde aquí vamos a colocarle una [12:19] contrabarra le coloco http controll Api [12:21] studion controller punto y coma y aquí [12:23] le digo desde aquí voy a llamar la [12:25] función vamos a colocarle un un arril y [12:27] aquí voy a llamarle student controller [12:29] dos puntos dos puntos y vamos a [12:31] colocarle una clase y aquí le colocamos [12:33] el nombre del método en este caso se va [12:34] a llamar Index porque así le llamé yo De [12:36] hecho si ustedes Ven aquí dice [12:37] obteniendo lista de estudiantes vamos a [12:39] colocarle desde el controller entonces [12:41] si yo guardo esto y vengo a la terminal [12:42] Y nuevamente escribo php artisan serf y [12:46] si vengo aquí en el navegador y refresco [12:47] pueden ver que di obteniendo lista de [12:49] estudiantes desde el controller ahora [12:50] por supuesto nosotros no vamos a querer [12:52] tan solo ver un texto sino que vamos a [12:54] querer consultar una base de datos Así [12:55] que lo que vamos a hacer es que en lugar [12:57] de tan solamente retornar un texto esto [12:59] vamos a consultar trayendo el modelo de [13:01] datos entonces Aquí voy a decirle [13:03] también voy a utilizar desde app y aquí [13:05] llamamos models student punto y coma y [13:08] aquí le voy a colocar Okay voy a llamar [13:09] el modelo estudiantes este tiene un [13:11] método llamado all voy a colocar en [13:13] punto y coma y esto lo que me va a [13:14] retornar es una lista voy a decir un [13:16] arreglo de datos Aquí voy a guardar una [13:17] variable llamada students y este [13:19] students lo que voy a hacer es que [13:20] primero voy a confirmar si no está vacío [13:22] Porque si este arreglo está vacío lo que [13:24] va a hacer es que no voy a poder [13:25] retornar nada de hecho incluso yo puedo [13:27] retornarlo directamente puedo decir en [13:28] lugar de ese ret un texto le puedo decir [13:30] voy a retornar un response vamos a [13:32] colocar la función y le digo voy a [13:34] retornar un método Jason y aquí adentro [13:36] le coloco el arreglo la variable [13:38] students con un método 200 que significa [13:40] que todo fue bien si yo guardo esto y [13:42] vengo aquí en la aplicación y refresco [13:43] pueden ver que me Der rotor un arreglo [13:45] vacío pero bueno quizás ustedes no [13:46] quieren retornar Esto entonces lo que [13:47] podemos hacer es que antes yo le puedo [13:49] colocar una condicional y le digo si [13:51] estudiantes está vacío si is empty [13:53] entonces voy a retornar un mensaje o un [13:55] texto aquí que diga no hay estudiantes [13:57] registrados de hecho si ustedes quieren [13:59] eh ordenarlo Incluso un poco mejor lo [14:01] que pueden hacer aquí es crear una [14:02] variable que se llame Data y aquí pueden [14:04] colocarle que primero van a esperar un [14:06] mensaje y luego un estatus por ejemplo [14:08] vamos a colocarle aquí un estatus que [14:10] sea 404 si coloco un punto y coma y [14:13] luego le pueden recién decir voy a [14:14] retornar aquí el mensaje que va a ser un [14:15] response con los datos Entonces esto es [14:17] bl un poco más ordenado entonces si yo [14:19] guardo y como no hay datos si yo [14:20] refresco aquí me dice no se encontraron [14:22] estudiantes estatus 404 en realidad no [14:24] Debería ser un 404 Debería ser un 200 [14:26] nada más porque la respuesta Sí fue [14:28] correcta Solo que aquí no no hubieron [14:30] nada o decir No se encontró nada [14:31] estudiantes Okay el enfoque de retornar [14:33] el arreglo tampoco es incorrecto Así que [14:35] también lo pueden utilizar solamente es [14:36] para mostrarles otro eh otra forma de [14:38] responder De hecho si ustedes quieren [14:40] retornar esto de aquí también pueden [14:42] hacer lo mismo Pueden decir voy a [14:43] retornar un arreglo Data va a estar [14:45] conformado tanto por students vamos a [14:46] colocarle students que va a ser el [14:48] arreglo de estudiantes y luego un [14:49] estatus 200 como mensaje entonces Esto [14:51] va va a convertirse en un Jon Entonces [14:53] le digo voy a retornar aquí un Data y [14:54] aquí un punto y coma y si guardo y vengo [14:56] en la aplicación y refresco me retorna [14:58] studens vacíos un estatus 200 ahora [15:00] nosotros no tan Solamente vamos a querer [15:01] listar sino que vamos a querer crear [15:03] también entonces vamos a crear otra [15:05] función aquí debajo esta función vamos a [15:07] Bueno Este es un método de hecho vamos a [15:09] llamarle un public function y este se va [15:12] a llamar Store por ejemplo de almacenar [15:15] y lo que va a esperar es un dato que [15:16] viene desde el frontend esto lo recibe a [15:17] través de un objeto request que y lo va [15:19] a guardar una variable request adentro [15:21] lo primero que vamos a hacer es que [15:22] cuando recibamos un dato vamos a [15:23] validarlo es decir cuando yo voy a [15:25] enviar un dato aquí en el Store primero [15:27] voy a recibir algo desde el cliente y [15:29] tengo que esperar que ese dato sea [15:30] correcto por suerte para validar larbel [15:33] ya incluye un paquete para poder hacer [15:34] eso entonces puedo venir aquí y le puedo [15:35] decir use y vamos a colocarle aquí un [15:37] paquete que se llama illuminate super [15:40] fake Case y validator y aquí nosotros ya [15:42] podemos llamarlo en el Store por ejemplo [15:43] voy a decir de validator vamos a [15:45] colocarle eh dos puntos make y aquí voy [15:47] a colocar una variable que se llama [15:49] request all lo voy a ejecutar y luego [15:51] vamos a colocar el arreglo de datos que [15:53] voy a esperar validar Por ejemplo yo voy [15:54] a esperar me pasen por ejemplo un name [15:56] un email un font y un Language pero los [15:59] datos que yo voy a validar aquí son que [16:00] todos son requeridos y el ime la parte [16:02] de requerido aquí le colocan un Pipe es [16:04] decir como un un palito aquí y en este [16:06] caso se le coloqué también un correo Es [16:08] decir debe aparentar un Stream que sea [16:09] un correo un punto y como al final y el [16:11] validator lo que me va a retornar al [16:13] final es justamente un una respuesta [16:16] vamos a colocarle aquí validator en una [16:17] variable en minúscula y de hecho aquí me [16:19] da un error el validator porque aquí lo [16:21] he escrito mal aquí Debería ser con u [16:23] illuminate Ahora sí y listo ahora con [16:25] este objeto validator nosotros podemos [16:27] ejecutar una función un un método que [16:29] diga si el validator y aquí le llamamos [16:31] si su método fails es decir si esto [16:33] falla de hecho Aquí vamos a colocarle un [16:35] guión si esto falla es decir si al final [16:37] hay un error en la validación pues vamos [16:39] a colocarle una respuesta vamos a crear [16:41] una variable Data y le digo que voy a [16:42] retornar un mensaje que diga error en la [16:44] validación de datos voy a mostrar los [16:46] errores y un estatus 400 que significa [16:47] que todo fue incorrecto el dato que me [16:49] envió y luego le voy a retornar esto al [16:51] cliente un response con un json Data con [16:53] un estatus 400 ahora si en todo caso los [16:56] datos que me envió son correctos es [16:57] decir no hubo ningún error entonces lo [16:59] que voy a hacer es crear una variable [17:00] llamada student voy a guardar aquí y voy [17:02] a decirle que del modelo student voy a [17:04] estar creando algo de hecho aquí no es [17:06] created sino create Aquí voy a ejecutar [17:09] esta función y adentro voy a colocarle [17:11] un arreglo con los datos que le voy a [17:12] pasar que en este caso sería el name el [17:14] email font y el Language por supuesto [17:16] todo estos vienen de request que es [17:17] justamente el dato que envía el cliente [17:19] la aplicación cliente Aquí voy a colocar [17:21] un punto y coma y finalmente con esto le [17:23] digo si no hay un estudiante Al momento [17:24] de guardar si no pudiste crear un [17:26] estudiante entonces voy a retornar un [17:28] Data con un mensaje que diga r crear al [17:30] estudiante un estatus 500 y retorno [17:31] estro al cliente pero si en todo caso sí [17:33] pudo crearlo entonces lo que voy a hacer [17:35] es retornar otro arreglo Data Aquí voy a [17:38] decirle que voy a retornar un estudiante [17:40] nuevo estatus 201 y voy a retornar esto [17:42] return response Jason Data 201 si yo [17:45] guardo esto intento crearlo entonces lo [17:47] que voy a hacer Es que voy a abrir un [17:49] Thunder client y por ejemplo voy a venir [17:51] en la petición y aquí voy a decirle voy [17:52] a enviar una petición post a Api [17:54] students y vamos a escoger aquí en esta [17:56] sección donde dice Body el dato que [17:58] queremos enviarle Aquí voy a colocar un [17:59] objeto Jason y voy a colocarle algo [18:01] sencillo por ejemplo vamos a colocarle [18:03] un dato vacío y envío y Bueno aquí me [18:05] está dando el dato creando estudiantes [18:07] Porque si bien he creado el controlador [18:08] no lo estoy usando vamos a venir en en [18:10] el archivo De Api y aquí donde tenemos [18:12] que crear en el post vamos a quitar esta [18:14] función y es el proceso similar al que [18:16] tenemos arriba es decir llamo el studing [18:18] controller de su Class el método Store [18:20] guardo y ahora sí esto reinicia el [18:22] código y si vengo aquí nuevamente y [18:24] envío vamos a ver que me retor un [18:25] mensaje de error y me dice error en la [18:27] validación de los datos el nombre el [18:28] campo del nombre es requerido el email [18:30] es requerido el fone es requerido y el [18:31] Language también okay Este es el [18:32] validator vamos a colocar los datos [18:34] correctos me dice el name es requerido [18:35] vamos a colocarle un name vamos a [18:37] colocarle cualquier cosa el email es [18:39] requerido vamos a colocarle cualquier [18:41] cosa y lo mismo vamos a copiar un esto [18:43] un par de veces y vamos a pegarlo y [18:45] vamos a colocarle también espero un font [18:46] y un Language de hecho solamente uno más [18:48] voy a quitar uno de aquí y sería un font [18:50] y un Language en el font voy a enviar [18:52] todo esto Vamos a darle enviar Y de [18:53] nuevo me están diciendo el dato que es [18:54] requerido bueno por aquí colocado una [18:56] coma vamos a enviarlo y ahora sí ha [18:58] validado nuevamente y solo me dice que [18:59] el email debería lucir como una [19:00] dirección de email entonces aquí le digo [19:02] okay esto es test @test comom y Si yo [19:05] envío pues ahora ya pedo crear un dato [19:06] dentro de la base de datos de hecho sé [19:08] que ha creado un dato porque aquí me ha [19:09] retornado también un ID y también una [19:11] fecha de creación y actualización [19:12] Entonces estos tres datos se generan en [19:13] la base de datos estos son los que yo le [19:14] envié ahora si ustedes quieren colocarle [19:16] algun unas validaciones un poco más [19:18] digamos producidas o extensas pues [19:20] pueden colocar el nombre es requerido y [19:22] Máximo pueden colocarle que es de 255 [19:25] esto debe ser un email y debe ser único [19:27] también esto significa que si a crear un [19:29] estudiante con ese email pues ya no se [19:30] va a poder repetir el font también [19:32] pueden colocarle que esto espera un [19:34] dígito pueden colocarle un or y pueden [19:36] decirle que espera un dígito de 10 y [19:38] aquí abajo le puedo decir requerido e [19:39] lenguaje tan solo pueden enviarme por [19:41] ejemplo vamos a colocar lenguaje de [19:42] algunos idiomas Yo solo eso que me pase [19:44] un texto que sea english spanish y [19:46] también francés Entonces si no me pasa [19:48] ninguno de estos streams va a dar error [19:49] guardo envío me da un error me dice el [19:51] email ya está tomado Okay entonces tengo [19:53] que crear otro email test 2 El font [19:55] Debería ser 10 dígitos Okay el teléfono [19:57] 1 2 3 4 5 se envío el lenguaje es [20:00] inválido el lenguaje Debería ser alguno [20:02] de los lenguajes spanish por ejemplo [20:04] envío y ahora sí lo ha creado Ahora sí [20:06] está validando la creación de datos Y [20:08] como ya habíamos hecho el get si yo hago [20:09] un get ipi students vamos a ver ahora un [20:11] arreglo con los dos usuarios que ya [20:13] había creado Esto es lo mismo desde el [20:14] navegador si yo refresco pueden ver que [20:15] í están los dos estudiantes creados [20:17] listo lo que vamos a hacer ahora es [20:18] entonces crear una función que nos va a [20:20] permitir poder obtener un estudiante es [20:22] decir aquí yo estoy listando todos los [20:24] estudiantes aquí estoy creando también [20:25] voy a crear otra función para obtener un [20:26] solo estudiante entonces voy a decir [20:28] public function o se llamale show esta [20:30] función va a esperar un parámetro un ID [20:32] para buscar y aquí le voy a decir voy a [20:34] buscar un estudiante y este estudiante [20:36] va a buscarse el modelo con el método [20:38] find y aquí nosotros hacemos una [20:39] validación le digo si no encontraste un [20:41] estudiante vas a retornar retornar [20:43] estudiante no encontrado estatus 400 y [20:45] es lo que vas a retornar al cliente este [20:46] Jason caso contrario Aquí voy a decirle [20:49] vas a crear una variable llamada Data [20:51] vas a retornar al estudiante con código [20:52] 200 y esto es lo que al final vas a [20:54] retornarle al cliente y para que eso [20:56] funcione también lo tenemos que Añadir [20:57] en Api entonces vengo aquí aquí en Api y [20:59] así como tengo este students ID voy a [21:01] quitar todo esto y voy a decirle que [21:03] aquí voy a colocar un arreglo que diga [21:05] student control Class show Entonces [21:07] ahora sí si yo vengo en Thunder client y [21:09] digo voy a hacer una petición get de [21:10] estudiantes y quiero tan solo el [21:12] estudiante uno o el estudiante dos [21:13] simplemente coloco Slash un y me da el [21:15] estudiante uno esto también es igual en [21:16] el navegador porque el navegador permite [21:18] hacer peticiones get en la URL entonces [21:20] digo estudiantes dos ahí está el [21:21] estudiante 2s el estudiante uno ahí está [21:23] el estudiante uno okay con todos sus [21:25] datos listo entonces esa es la forma de [21:26] pedir un solo estudiante Ahora hay otra [21:28] función que también es muy similar que [21:30] al obtener un dato y es la función de [21:32] eliminar porque el eliminar también no [21:34] solo permite Buscar un usuario es decir [21:36] No solo permite buscarlo sino que va a [21:38] buscar y luego eliminar Entonces vamos a [21:40] hacerlo también vamos a empezar con [21:42] eliminar les digo voy a crear otra [21:43] función un public function se va a [21:44] llamar destroyed por ejemplo no puede [21:46] puede colocarle Cualquier nombre vamos a [21:48] colocarle que también espera un ID y [21:49] aquí le voy a decir vo a crear una [21:51] variable student que va a ser igual [21:52] student pun find y este student pun F va [21:54] a buscar el ID Aquí vamos a colocar lo [21:56] mismo si no hay un estudiante De hecho [21:58] voy a ir por partes para que no se les [22:00] haga tan complicado aquí primero Busco [22:02] el estudiante con el modelo de datos y [22:03] le digo si no hay un estudiante pues [22:05] vamos a colocarle que responde un Data [22:07] con un arreglo que diga message 404 pero [22:10] si sí hay un estudiante simplemente [22:11] vamos a ejecutar el método llamado [22:13] student delete que es lo que realmente [22:15] quita el registro de la base de datos y [22:17] ya luego después creo una variable Data [22:19] que va a responder algo al cliente le [22:20] digo el mensaje estudiante eliminado y [22:22] finalmente retorno un mensaje al cliente [22:24] guardo todo esto y ya con esta petición [22:27] tan sencilla si vengo en Api students en [22:29] delete delete Api student un envío me [22:32] dice eliminando estudiante y Bueno aquí [22:34] me dice esto y no está ejecutando la [22:35] lógica porque en Api también me faltó [22:37] venir aquí en delete y quitar esta [22:39] función y cambiarlo por studen [22:41] controller Class destroy Ahora sí vamos [22:43] a venir aquí en en Api delete Api [22:45] student 1 envío y mis estudiante [22:47] eliminado si yo lo vuelvo a buscar mis [22:49] estudiante no he encontrado De hecho si [22:50] yo vengo aquí en students en la lista de [22:52] estudiantes pueden ver que solo está el [22:54] estudiante dos no está el estudiante uno [22:56] okay Entonces ya está eliminando ahora [22:57] para actualizar eh De hecho es una [22:59] combinación en el que vamos a recibir un [23:01] ID y también vamos a recibir un request [23:03] Porque con el ID yo voy a buscar un dato [23:04] y con request yo voy a colocarle los [23:06] nuevos datos entonces para poder hacer [23:07] eso voy a venir aquí en public voy a [23:09] colocarle function vamos a colocarle [23:11] update voy a colocarle Aquí request [23:13] request voy a colocar un dó ID y aquí lo [23:16] primero que voy a hacer es buscar al [23:17] estudiante me digo vas a buscar un [23:19] estudiante con el modelo de student vas [23:21] a buscar por ID vamos a colocar el ID [23:23] con un punto y coma y luego vamos a [23:25] colocar lo mismo si no encontraste un [23:26] estudiante retorno 404 Y responde algo [23:29] al cliente con el mensaje 404 estudiante [23:31] no ha encontrado luego en todo caso si [23:33] sí encontró al estudiante vamos a [23:34] validar el request es decir los datos [23:36] del request ent vamos a colocarle aquí [23:38] debajo le digo de validator nuevamente [23:40] con los mismos datos de hecho name email [23:42] font y Language y aquí le voy a decir [23:44] vamos a validar estos datos vamos a [23:46] colocarle validator al objeto y debajo [23:48] lo mismo que cuando creamos le digo si [23:49] el validator falla si validator fails [23:52] entonces voy a colocar error en la [23:54] validación y allí el cliente va a poder [23:55] recibir los errores que está cometiendo [23:57] mal pero si él lo hace bien envía los [23:59] datos correctos pues lo siguiente es [24:00] actualizarlo Entonces le digo del [24:02] estudiante que has encontrado en su [24:03] propiedad name vas a colocar el request [24:05] name el email con el request email y así [24:08] con cada dato que me he enviado para [24:09] actualizar finalmente luego lo guardo le [24:11] digo de todas esas modificaciones voy a [24:12] guardar esos datos y finalmente voy a [24:14] crear una variable Data que es lo que va [24:15] va a retornar el cliente es decir el [24:17] estudiante actualizado con el estatus [24:19] 200 e incluso también puedo colocarle un [24:21] message aquí que dígalo como estudiante [24:23] actualizado y finalmente retorno esto al [24:25] cliente guardo esto y si quiero ver este [24:28] código o la ejecución de este código [24:29] Pues voy a venir en Thunder Cent y le [24:31] voy a decir voy a hacer otra petición [24:32] pero recuerden que aquí he creado el [24:33] controller tengo que venir en Api Y [24:35] actualizarlo entonces aquí este put voy [24:37] a colocar aquí un student controller [24:38] update Y si guardo ya tengo mi crud [24:40] hecho de esta Api Entonces ya puedo [24:42] empezar a probar aquí en Api studens le [24:44] digo voy a hacer una petición put del [24:46] estudiante dos sería en todo caso porque [24:48] es el único que tengo si yo busco el uno [24:49] y envío me dice estudiante no he [24:51] encontrado pero si envío un un número [24:52] dos y los datos nuevos por ejemplo voy a [24:54] colocarle el nombre de este estudiante [24:55] voy a colocarle Ryan rey por ejemplo en [24:58] emil voy a colocarle rayan @m.com en [25:02] font vamos a dejar el número í y [25:03] Language enviar y ahora me responde el [25:05] dato actualizado si yo refresco Aquí [25:07] también me responde el dato que el id2 [25:09] ha sido actualizado con todos estos [25:10] Campos listo Entonces es también es el [25:12] put ahora lo que pasa aquí es que el put [25:14] si yo no le coloco un dato por ejemplo [25:16] Supongo que yo no quiero actualizar [25:17] Language y envío Esto me dice que falta [25:19] el Language es decir porque el put trata [25:21] de actualizar todo el objeto y es [25:22] correcto entonces lo que voy a hacer es [25:24] también Añadir una ruta Patch entonces [25:26] voy a cerrar aquí y le digo Okay voy a [25:27] crear una ruta ruta más que es una ruta [25:29] Patch students ID también pero va a [25:31] funcionar en lugar de put con Patch y el [25:33] controller vamos a colocarle update [25:35] partial es decir vamos a crear un un [25:37] método del controlador que se llama [25:38] update partial que es igual que el resto [25:40] solamente que se llama de esta forma [25:41] entonces guardo y ahora vengo en student [25:43] controller y vamos a crear otro más voy [25:44] a minimizar esta función voy a venir [25:46] aquí debajo le voy a decir public voy [25:47] cre otra función llamada update partial [25:49] y lo mismo voy a esperar un request una [25:51] variable request de tipo request voy a [25:53] colocar un ID voy a colocarle aquí [25:55] buscando un estudiante un student voy a [25:58] Buscar del modelo estudiante si no [25:59] existe un mensaje y un return okay Ahí [26:03] va y luego si si se encontró estudiante [26:05] voy a colocarle un validator y la [26:07] diferencia Aquí está en el validator [26:08] porque el validator lo que va a hacer es [26:10] que ya no espera un requerido es decir [26:11] pues esto pueden venir cualquiera uno [26:13] solo y pueden ver que ya no está el [26:14] require solo que ahora Él espera que el [26:16] nombre sea bueno igual que el anterior [26:17] un máximo 255 de caracteres un email que [26:21] sea único los dígito de 10 pero lo único [26:23] que le ha quitado es el require es decir [26:24] cualquiera puede venir y No [26:26] necesariamente tiene que venir el resto [26:27] y ya luego lo mismo si validator fails [26:30] retorna un mensaje que diga el error con [26:31] la lista de errores y si no pues aquí [26:33] viene lo nuevo porque si estoy [26:35] recibiendo un campo name solo voy a [26:36] querer actualizar ese si Scion email y [26:39] demás pues tan solo voy a querer [26:40] actualizar un campo individualmente [26:41] entonces lo que vamos a hacer es colocar [26:43] aquí debajo vamos a colocarle aquí una [26:45] especie de condicional le digo si [26:47] request el objeto request que me está [26:48] enviando el cliente tiene la propiedad [26:50] name entonces voy a actualizar es [26:51] estudiante que encontrado en su propi [26:53] name Lo mismo para el resto si [26:54] estudiante tiene el email si estudiante [26:56] tiene el font si estudiante tiene tiene [26:58] el Language entonces sol lo voy a [26:59] actualizar cada uno de esos y finalmente [27:01] voy a guardarlo cuando ya modifique cada [27:03] uno de esos Campos individualmente [27:04] finalmente voy a retornar una variable [27:06] que se llame Data con un mensaje que [27:07] diga estudiante actualizado y finalmente [27:09] retorno esto al cliente Si guardo esto y [27:11] vengo Ahora sí en Thunder client [27:13] nuevamente y le digo voy a hacer ya no [27:14] un put sino un Patch vamos a colocarle a [27:16] ipi student 2 y dig no quiero actualizar [27:18] todos los datos sino que Quiero [27:20] actualizar el nombre nada más pues aquí [27:21] le digo vamos a colocar Jo mcmillan y [27:24] envío y este es el único campo que se ha [27:25] actualizado en estudiante 2s y yo vengo [27:27] aquí en en cliente y refresco debería [27:29] actualizarse pero lo que pasa es que [27:31] quizás no está utilizando el controller [27:33] vamos a verlo en Api tengo el Patch [27:35] student ID update partial vamos a ver si [27:37] se llama así update partial De hecho [27:39] aquí no se ha ejecutado correctamente [27:41] vamos a volver a enviarlo Y al parecer [27:42] me está enviando el mismo dato que estoy [27:44] recibiendo vamos a ver por qué Ah bueno [27:46] aquí me está enviando Data y Data no [27:48] luce de esta forma voy a venir [27:49] nuevamente en Api en rout Patch students [27:52] ID voy a cancelar aquí el servidor y voy [27:54] a volver a ejecutarlo quizás ha fallado [27:56] eso Okay vamos a volver a hacer el [27:58] update voy a cambiarlo a un students un [28:00] a ver si cambia el valor estudiantes dos [28:02] envío y tan solo está actualizando eso [28:04] pero en realidad no lo está cambiando De [28:06] hecho aquí la razón de que me esté [28:07] devolviendo esto por aquí tengo un [28:08] return que se añadió con el copilot [28:10] Bueno vamos a quitarlo en el validator [28:12] antes no tenemos que hacer nada Solo [28:13] validar eso vamos a enviar nuevamente y [28:15] ahora sí ya lo está actualizando como [28:16] pueden ver son los mismos datos [28:18] solamente que ha cambiado el name Luego [28:19] si ustedes quieren actualizar otros [28:20] datos pues colocan aquí un email y le [28:23] dice también Quiero actualizar el email [28:24] no va a ser Ryan sino Joe envían y esto [28:26] falla porque el email Debería ser un [28:28] email válido entonces voy a colocarle y [28:31] @b.clean [28:38] a querer utilizar mysql entonces una [28:41] forma de modificar esto es si ustedes [28:42] tienen mysql instalado en mi caso yo [28:44] tengo aquí un programa que se llama Sam [28:45] es un programa bastante utilizado desde [28:47] hace mucho tiempo entonces voy a usar [28:49] este de aquí pero ustedes de nuevo [28:50] pueden utilizar una instalación [28:52] individual de may sql o docker o lo que [28:54] prefieran vamos a iniciar esto tengo May [28:56] sql y bueno lo único que voy a hacer es [28:57] que si si quiero crearlo en May sql voy [28:59] a venir en en este caso en la base de [29:01] datos de may sql esto abr una pestaña [29:03] nueva Ahí está inicializando y Bueno voy [29:05] a crear una base de datos nueva por [29:06] ejemplo voy a crear aquí una base de [29:08] datos que se llame larabel Api db crear [29:11] y nada más no necesito nada más entonces [29:13] si yo vengo ahora en el código y quiero [29:15] cambiar la base de datos es tan fácil [29:16] como venir env y aquí en la sección de [29:19] db connection vamos a alterarlo por [29:21] ejemplo en db connection ya no va a ser [29:22] sqlite sino va a ser May sql en db Host [29:25] vamos a dejarle 12701 330 para el puerto [29:28] en db database el nombre que que [29:30] acabamos de crear lel Api db en usuario [29:33] root y en el password voy a dejarlo [29:34] vacío si yo guardo esto y vengo aquí en [29:36] la consola voy a cancelarlo y para [29:38] ejecutar esto simplemente le digo php [29:40] artisan migrate Y si doy un enter esto [29:42] lo que va a hacer es crear la tabla [29:44] entonces si yo vengo ahora en en arab [29:46] lap db vamos a ver que aquí están todas [29:48] las tablas creadas para May sql entonces [29:50] aquí también yo puedo ver el student [29:52] pero que también puedan ver la lista de [29:53] datos que puedo guardar aquí de hecho si [29:55] yo ejecuto esto nuevamente como php [29:56] artisan serve Y hago las mismas [29:58] peticiones vengo aquí en tunder cin [30:00] intento hacer un post e intento enviar [30:02] los datos le digo the student tengo que [30:03] enviar un name De hecho voy a copiar [30:05] aquí los datos name email font y [30:06] Language vamos a copiar esto en lugar de [30:08] esto voy a quitarle y intento enviarlo [30:09] esto Ah bueno Esto Debería ser de [30:11] students post ahí se crea entonces si yo [30:13] vengo ahora en en sql y refresco van a [30:15] ver que aquí está bueno por aquí debería [30:17] estar okay Aquí está el dato Okay que [30:19] acabo de ingresar uno Jo mcmillan IBM [30:21] etcétera de esta forma Pues también [30:23] todos los datos que estoy consultando [30:24] ahora están desde May sql y bueno para [30:26] desplegarlo he creado un video Adal para [30:28] los miembros del canal en donde voy a [30:29] enseñarles cómo desplegar esta misma ipi [30:31] en raway Pero si ustedes no Son miembros [30:33] también hay un video adicional en el [30:34] canal donde pueden aprender cómo [30:36] desplegar una aplicación de larabel en [30:38] railway Aunque no es de este Api [30:40] obviamente es de otro proyecto o es un [30:42] proyecto desde cero Pero bueno para los [30:44] que están ayudando en el canal pues les [30:45] estoy dando un video adicional en este [30:47] caso y bueno eso ha sido todo por el [30:48] ejemplo del día de hoy si tienen alguna [30:49] duda pueden dejar los comentarios y nos [30:51] vemos en un siguiente ejemplo eso ha [30:53] sido todo por el video del día de hoy si [30:55] tienes dudas puedes dejarla en los [30:56] comentarios o en la descripción de dej [30:58] un enlace para que te puedas unir a la [30:59] comunidad de discord en donde [31:01] encontrarás a otros desarrolladores o si [31:03] en caso el enlace está caído puedes ir a [31:05] fastd discord para acceder más [31:07] rápidamente dejo mi Twitter donde [31:08] típicamente comparto algunos recursos [31:10] interesantes de desarrollo y [31:11] programación en general mi Instagram [31:13] donde comparto algunas noticias cortas [31:14] todos los días el tiktok donde comparto [31:16] videos cortos e informativos y mi canal [31:18] principal en donde comparto opiniones y [31:19] noticias de tendencias nuevas además [31:21] también dejo mi web en donde puedes [31:23] reservar asesorías personalizadas [31:25] Gracias por ver y nos vemos en un [31:26] próximo video