Con una API y autenticación listas, el siguiente paso es controlar qué expones en tu respuesta. Con la capa de transformación de Laravel, basada en API Resource, conviertes modelos de Eloquent en JSON preciso y seguro, mostrando solo los atributos necesarios y con nombres consistentes.
¿Cómo transformar respuestas JSON con api resource en Laravel?
Los API Resource permiten dar forma a los datos antes de enviarlos al cliente. Así evitas exponer todos los atributos del modelo y puedes tipar valores para mantener consistencia.
Crea un recurso con la terminal.
Define el método to array con los campos permitidos.
Usa el recurso en el controlador para el método show.
¿Cómo crear un recurso con php artisan?
Comando en la terminal:
php artisan make resource ProductResource
Estructura del recurso con tipado y claves en español:
Para un solo modelo: instancia el recurso y pásale el modelo.
Respuesta: obtienes los datos transformados en JSON.
// Ejemplo en ProductController@showreturnnewProductResource($product);
Ventaja: puedes cambiar etiquetas (por ejemplo, a español) sin afectar la lógica del modelo.
¿Cómo manejar colecciones y metadata con resource collection?
Cuando trabajas con listas, como en el método index, necesitas transformar colecciones de productos. Tienes dos opciones: usar el método estático collection del recurso o crear una colección propia para personalizar la metadata.
¿Cómo usar collection directamente?
Transforma una colección sin crear otra clase.
// En ProductController@indexreturnProductResource::collection($products);
Respuesta: obtienes un arreglo data con cada recurso transformado.
¿Cuándo crear un recurso tipo collection?
Cuando requieres metadata personalizada junto a los datos.
php artisan make resource ProductCollection
classProductCollectionextendsResourceCollection{publicfunctiontoArray($request){return['data'=>$this->collection,// 'meta' => [ ... ] // aquí puedes agregar metadata personalizada.];}public$collect=ProductResource::class;// aplica transformación a cada elemento.}
Uso en el controlador:
// En ProductController@indexreturnnewProductCollection($products);
Si no indicas la propiedad pública collect, verás los modelos sin la transformación individual.
Con collect apuntando a ProductResource, cada elemento se transforma con el mismo recurso.
¿Qué pasa con los tests al envolver en data?
Al cambiar la estructura a un arreglo data, los tests pueden fallar.
Ajuste sugerido: en el método de prueba, contar elementos dentro de la clave data (por ejemplo, usando la aserción que cuente esa clave).
¿Cómo validar y autorizar con form request en endpoints?
Para separar responsabilidades, mueve validaciones y autorizaciones a Form Request. Esto limpia el controlador y centraliza reglas.
¿Cómo crear e integrar form request?
Comandos en la terminal:
php artisan make request StoreProductRequest
php artisan make request UpdateProductRequest
Úsalos en el controlador en store y update.
Reglas de validación mínimas:
// En StoreProductRequest y UpdateProductRequestpublicfunctionrules(){return['nombre'=>'required','precio'=>'required',];}
¿Por qué aparece un 403 y cómo autorizar?
Si ves “la acción no está autorizada”, revisa authorize en el request.
Ventaja del Form Request: decidir quién puede ejecutar la petición.
publicfunctionauthorize(){returnout()->check();// permite a usuarios logueados.}
Tras autorizar y validar, los tests vuelven a pasar correctamente.
¿Tienes dudas sobre cómo aplicar estos API Resource y Form Request a tu entidad categoría o a otro modelo? Cuéntame tu caso en los comentarios y lo resolvemos juntos.
Para solicitar los datos en mi caso utilizo Postman y lo primero es pedir un token en la ruta /api/sanctum/token para despues utilizarlo en el request a /api/products/1 en el apartado de Authorization como Bearer Token.
En Laravel 8 no es necesario establecer la propiedad $collects (minuto 5:43) para establecer la clase ProductResource que transforma los datos ya que al empezar con el mismo prefijo Product, estas estarán enlazadas automáticamente, solo será necesario establecer dicha propiedad si los prefijos son diferentes.
Que tal amigo, en caso de que no quiera que ProductCollection tome a ProductResource transforme automaticamente,(es lo que me esta pasando), que puedo hacer? ya intente poner la propiedad public $colects = null pero me la sigue transformando y no quiero que lo haga
Adicional mente agrego el:
public function __construct()
{
$this->middleware('auth:sanctum')->except(['index', 'show']);
}
Dentro del ProductController. De esta manera se sigue utilizando el middleware para todas las rutas recursivas del ProductController a excepción de la funcion index y show.
Si yase es que no se porque en todos los projectos react o laravel
SE ME BLOQUEAN TODOS LOS ARCHIVOS
hasta hago sudo para guardar porque el ctrl+s no me funciona dice que no tengo permisos
Amigo no veo necesario hacer 2 formRequest si lo vas a usar para lo mismo, sencillo haces una regla de validacion en el formRequest y lo usas en ambos métodos, tanto store como update.
Excelente leccion! el metodo assertJsonCount() del response nos ahorra tiempo en hacer un recorrido del objeto o convertirlo en array para poder contar items, muy buena leccion, si tambien quieren tester el contenido de la respuesta JSON en el metodo show dejo un codigo:
La idea es la misma el metodo json() nos retorna el JSON de la respuesta y ya solo accedemos a la llave name, en este caso uso el metodo assertEquals para comparar el nombre del modelo creado con el factory y el valor que devuelve la llave name del JSON que retorna el request.
acabo de aprender para que sirve el authorize de los request ajja cuando aprendi de esa funcionalidad hace tiempo siempre me dijeron coloca true alli y listo
tengo este error
Illuminate\Contracts\Container\BindingResolutionException
Target class [App\Http\EnsureFrontendRequestsAreStateful] does not exist.
alguna ayuda?
por favor
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
Seguramente en al archivo Kernel.php
Para Trabajar la entidad categoria
--php artisan make:model Category--api --all
--configurar Model category
--configurar MigrationCategory--configurar una ruta resource
--configurar el controller de category
--configurar el seederdatabase , el categorySeeder y el factory de category
--sudo php artisan make:test CategoryControllerTest y configurarlo
--sudo php artisan make:resource CategoryResource--sudo php artisan make:resource CategoryCollection--configurar el CategoryController para usar los resources
--sudo php artisan make:request StoreCategoryRequest--sudo php artisan make:request UpdateCategoryRequest--configurar CategoryController para usar los archivos request de validacion
Si están usando Laravel 9 pueden checar la autenticación con lo siguiente
publicfunctionlogin(Request $request){ $this->validateLogin($request);if(Auth::attempt($request->only(["email","password"]))){returnresponse()->json(["token"=> $request->user()->createToken($request->name)->plainTextToken,"message"=>"Success",]);}returnresponse()->json(["message"=>"Unauthorized"]);//retutn no login}publicfunctionvalidateLogin(Request $request){return $request->validate(["email"=>"required|email","password"=>"required","name"=>"required",]);}