Paúl Terán
Juan David Meza Gonzalez
Esto es lo mejor. Y mucho más organizado. Incluso, da la flexibilidad de manejar las versiones programáticamente.
Mariano Gastón Paduani
Voy a probar de esta manera, gracias!
Cuando trabajas con APIs versionadas, cada versión puede requerir campos distintos, nombres diferentes y relaciones específicas. Comprender cómo configurar un recurso (resource) para una nueva versión te permite atender las necesidades de distintos clientes o aplicaciones sin romper la compatibilidad con versiones anteriores.
¿Cómo se configura un recurso para la versión dos del API?
El punto de partida es el controlador de la versión dos, donde ya se cuenta con las rutas y el controlador creados previamente. Desde el método show del controlador se retorna una nueva instancia del recurso de post, siguiendo el mismo esquema usado en la versión uno [01:02].
La diferencia clave está en el archivo del recurso ubicado en app/Http/Resources/V2. Aquí se define un array con los campos que el cliente de esta versión necesita:
post_name, aunque internamente sigue siendo el título del post.Esta flexibilidad es precisamente lo que hace valioso el versionado de APIs: cada versión puede exponer los datos con la estructura que su consumidor requiere.
¿Por qué se separan los campos de la izquierda y la derecha?
Una forma práctica de entender la responsabilidad en un API es pensar en dos lados [02:30]. Los campos de la izquierda son los nombres que el desarrollador frontend o la aplicación consumidora solicita. Los campos de la derecha son los valores reales que tú, como programador del API, mapeas desde la base de datos o el modelo. Tú controlas qué dato se entrega; el consumidor define cómo quiere recibirlo.
¿Cómo se configura la relación belongs to para el autor?
Al intentar acceder a this->user sin configurar la relación en el modelo, Laravel lanza un error indicando que user no existe [03:15]. La solución es definir en el modelo Post que un post pertenece a un usuario mediante el método belongsTo:
php public function user() { return $this->belongsTo(User::class); }
Con esta relación establecida, dentro del recurso se puede acceder a $this->user->name y $this->user->email para construir el objeto autor que se retorna en la respuesta JSON.
¿Cómo se verifica el funcionamiento de ambas versiones?
Desde Postman se pueden probar ambas versiones para confirmar que cada una responde con su estructura propia [03:50].
/api/v1/posts/1): retorna título, slug, extracto y contenido. Simula una aplicación antigua conectada a los recursos originales./api/v2/posts/1): retorna el mismo registro pero con campos diferentes: id, post_name, un objeto author con nombre y email, y la fecha de creación formateada.Ambas versiones coexisten sin conflicto. Esto significa que las aplicaciones existentes siguen funcionando con la versión uno, mientras que nuevos dispositivos o software se conectan a la versión dos con la estructura actualizada.
El concepto de recurso en Laravel (API Resource) actúa como una capa de transformación entre el modelo y la respuesta JSON. Cada versión del recurso define su propio array de salida, lo que permite renombrar campos, incluir relaciones y agregar campos virtuales sin modificar el modelo ni la base de datos.
Si estás implementando versionado en tu propio proyecto, experimenta creando una tercera versión con campos completamente distintos y comparte cómo organizas tus recursos.
Nuevamente vuelvo a recomendar el Curso de Postman 👀 . Relamente alguien que desarrolla el frontend no te va a estar hablando para preguntarte cuáles son los campos que vas a mandar, etc. Si no que tú como el desarrolador de API debes generar una documentación que te diga cuáles son los endpoints y qué retorna, por ejemplo, esta sería la documentación de Conekta (una pasarela de pagos): . Documentación del API Conekta . Aquí se alcanza a ver cómo del lado izquierdo se encuentra la descripción y del lado derecho el código para hacer el request en diversos lenguajes, eso es lo que tú tienes que generar. . Ahora, por eso recomiendo el curso de Postman, porque Postman, a medida que vas haciendo tus tests y pruebas, va registrando cada respuesta que te devuelve tu API, y al final del día él va a guardar todo eso y con un simple click te va a generar una página de documentación muy similar a la de Conekta en varios lenguajes de programación :D
Paúl Terán
Juan David Meza Gonzalez
Esto es lo mejor. Y mucho más organizado. Incluso, da la flexibilidad de manejar las versiones programáticamente.
Mariano Gastón Paduani
Voy a probar de esta manera, gracias!
Jimmy Buriticá Londoño
Les comparto el código del archivo App/Http/Resources/V2/PostResource.php
public function toArray($request) { return [ 'id' => $this->id, 'post_name' => $this->title, 'slug' => $this->slug, 'content' => $this->content, 'author' => [ 'name' => $this->user->name, 'email' => $this->user->email, ], 'created_at' => $this->published_at ]; }
Mariano Gastón Paduani
Gracias!
Camilo José Mezú Mina
Alternativa a postman
Les recomiento tambien el uso de https://insomnia.rest/ ya que postman tiene demasiadas funciones por lo que aveces puede consumir 500 Mb, y ser algo agobiante. Tambien se actualizaciones frecuentemente.
Marvin Rafael Magaña González
Same
Manuel Entrena Jimenez
Yo recomiendo el plugin ThunderClient
Harold German Granados Guerrero
Lista los post, muestra el post segun el id, elimina post, falto creo que falto crear post desde del Postman
Juan Guillermo Perez Cardozo
se debe documentar como hacer request y que response devuelve cada endPoint, pero tanto los tester como frontEnd deben poder hacer algo como consultar por medio de postman con el estandar rest(verbos) y pues con el response saben como codificar el front
Mariano Gastón Paduani
Coincido!
bruno guerra solano
alguien me puede decir cuando se hablo de configurar las funciones que estan en los modelos o si vienen de otro curso
public funtion getExecerptAttribute()
por ejemplo
Cristian Zeña Mas
Genial el curso
Nuevamente YO jaja! Un tip para que no tengan sus endpoints de v1 y v2 en el mismo archivo es que separen los mismo por un archivo y los registren en el app>>Providers>>RouteServiceProvider.php.
De la siguiente manera:
$this->routes(function () { Route::prefix('api/v1') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api/v1.php')); Route::prefix('api/v2') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api/v2.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); });