No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de API REST con Laravel

Curso de API REST con Laravel

Profesor Italo Morales F

Profesor Italo Morales F

Versión 1: colección

9/18
Recursos

Aportes 22

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Algo que hacía en node para mantener un estándar en las respuestas es utilizar constantes para los status code, y además informar si la acción fue realizada correctamente.

Encontré esto para poder aplicar lo mismo en laravel:
https://medium.com/@naumancs/how-to-use-http-status-codes-properly-in-laravel-3f66eebf0e66

public function destroy(Post $post)
    {
        $post->delete();
        return response()->json([
            'message' => 'Post Deleted'
        ], Response::HTTP_ACCEPTED);
    }

Algo interesante es que cuando eliminas un recurso, es una buena práctica hacer un “soft delete”, para eso únicamente hay que usar el trait SoftDeletes. Básicamente un SoftDelete es una forma de “eliminar los datos” sin que tengas que borrarlos realmente de la base de datos (digamos que en la base de datos hay un campo que dice si el elemento es visible o no) 😄
.
En cuanto al reto, en Laravel puedes retornar un mensaje junto a un código de respuesta:

$post->delete();
return response("", 204);

Recuerden agregar la opción destroy, al array de only dentro de las rutas de api 😄

Comparto mi código utilizado para eliminar el recurso:

    public function destroy(Post $post)
    {
        $post->delete();
        return response()->json(null, 204);
    }

Más info: https://laravel.com/docs/8.x/responses#json-responses

public function destroy(Post $post)
{
    $post->delete();
    return response()->json(null, Response::HTTP_NO_CONTENT);
}

Para el reto, agregué el campo ‘deleted_at’ a la tabla de posts con una migracion, ya que no es recomendable borrar definitivamente un registro en la bd:

php artisan make:migration add_deleted_at_posts_table

.
Luego agregué el trait SoftDeletes como se describe en la documentación de Laravel.
.
Después corrí la migración para agregar el campo:

php artisan migrate

.
Por último, en el metodo ‘destroy’ del PostController:

$post->delete();
return response()->json([], Response::HTTP_NO_CONTENT);

.
api.php

Route::apiResource("v1/posts", \App\Http\Controllers\Api\V1\PostController::class)->only(["index", "show", "destroy"]);

Versión 1: colección

le vamos a decir que queremos muestre los siguientes recursos para consuar en la api:

<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::apiResource('v1/posts', App\Http\Controllers\Api\V1\PostController::class)
    ->only(['index', 'show']);

en PostController

public function index()
    {
        return  PostResource::collection(Post::latest()->paginate());
    }

consultamos con postman y ya debería traer todos los posts:

http://127.0.0.1:8000/api/v1/posts

Mi solucion al reto gracias a la comunidad por sus aportes

public function destroy(Post $post)
    {
        if ($post->delete()) {
            return response()->json([
                'data' => [
                    'message' => 'Post Deleted'
                ]
            ], Response::HTTP_NO_CONTENT);
        }
        return response()->json([
            'data' => [
                'message' => 'Error deleting Post'
            ],
            Response::HTTP_INTERNAL_SERVER_ERROR
        ]);
    }

Para hacer el endpoint de delete, a tener en cuenta, habría que habilitar en api.php, el resource de destroy.

Route::apiResource(‘v1/posts’, \App\Http\Controllers\Api\V1\PostController::class)
->only([‘show’, ‘index’, ‘destroy’]);

`php \*delete*(); \# *Retornamos la respuesta json asi mismo* \# *Una copia del registro eliminado para mas claridad* *return* *response*()->*json*(\[ 'data' => $post, 'message' => 'Registro eliminado exitosamente' ],200); } } `
`php \delete(); \# Retornamos la respuesta json return response()->json(\[ 'message' => 'Registro eliminado exitosamente' ],204); } } `` ` ``
```js ```
![](blob:https://carbon.now.sh/31c429a3-fd1a-4256-8d75-ce6fb1105d4c)
```js public function destroy($id) { // Encuentra recurso por su id $post = Post::find($id); // Verifica si el recurso existe if (!$post) { return response()->json(['message' => 'Recurso no encontrado'],404); } //Elimina el recurso $post->delete(); //Devuelve una respuesta exitosa return response()->json(['message' => 'Recurso eliminado correctamente'],200); } ```

Sus rutas API pueden hacerlo así para tener un poco más de orden

Route::prefix('v1')->group(function () {
  Route::apiResource('posts', PostController::class)
    ->except(['update', 'store']);
});
    public function destroy(Post $post)
    {
        $eliminado=$post->delete();
        if ($eliminado){
            $data= [
                'Elemento eliminado' => $eliminado,
                'Id' => $post->id,
            ];
            return response()->json(['message'=>$data],204);
                }
        else {
            return response()->json(['error' => 'No encontrado'], 404);
        };
    }

Compartó mi respuesta

  public function destroy(Post $post)
    {
        $post->delete();
        return response()->json(null,204);
    }
$post->delete();
return (new PostResource($post))
->additional([
“msg”=>“Post eliminado”
])
->response()
->setStatusCode(204);

Por qué en el caso de index no se usa new antes de PostResource?

    $message = Post::findOrFail($post->id) ? "this ID:{$post->id} has been deleted" : "This ID:{$post->id} doesn't exists";
    $post->delete();
    return response()->json(["message"=>$message],204);
Un recurso solo se usa para Api? o se puede usar para pasarle al blade?

Me gsutan estos conceptos, son muy prácticos.
Creo que si decidimo realizar un sistema multi plataforma y como BackEnd tenemos a Php en Laravel, este concepto de API y la forma en la que nos enseña el profesor son las que necesitaremos para conectar el sistema a nuestra lógica en Back, ya sea para leer, procesar, almacenar y modificar datos.

Os dejo el ejemplo de como lo he realizado 😃

public function destroy(Post $post)
{
    $post->delete();
    return response()->noContent();
}