logo cosasdedevs
Cómo crear las acciones de CRUD en un API con Laravel 8. Parte 2 Leer, actualizar y borrar

Cómo crear las acciones de CRUD en un API con Laravel 8. Parte 2 Leer, actualizar y borrar



My Profile
Mar 31, 2021

Bienvenid@s a esta segunda parte del tutorial para crear un CRUD en una API para Laravel 8. En esta segunda parte seguiremos trabajando en la funcionalidad del proyecto y esta vez añadiremos la posibilidad de leer todos los post, también podremos leer uno en concreto y además tendremos la opción de editar y borrar nuestros posts. Si aún no habéis visto la primera parte de este tutorial os dejo el enlace pinchando aquí.

Lectura

Para mostrar los datos, Laravel 8 nos provee de una clase intermediaria para poder modificar la respuesta, por ejemplo podríamos cambiar que datos queremos mostrar, ocultar los ids, etc. Para utilizar esta clase, primero debemos crearla y para ello usaremos el siguiente comando:

php artisan make:resource V1/PostResource

Este comando generará un archivo en la ruta app/Http/Resources/V1/PostResource.php. Por defecto tiene un método llamado toArray que recibe una request (que en este caso sería el post) y lo convierte en array, pero nosotros vamos a cambiar levemente el funcionamiento para modificar los datos que queremos mostrar y como mostrarlos. Abrimos el archivo y sustituimos el contenido del método toArray por el siguiente:

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'description' => $this->description,
            'photo' => url($this->image),
            'author' => [
                'name' => $this->user->name,
                'email' => $this->user->email,
            ],
            'created_at' => $this->created_at
        ];
    }

Cuando creemos un objeto de tipo PostResource, este podrá recibir un post o una colección de posts. Al llamar al campo toArray, recorrerá los posts y podremos acceder a sus campos gracias a $this. De esta forma hemos podido realizar las siguientes modificaciones:

- Ya no mostramos el campo updated_at.

- Hemos renombrado el campo image por photo, además añadimos la url y no solo donde está almacenada en el proyecto. Esto lo hacemos porque sin ello no podríamos ver la imagen.

- Hemos añadido el nombre de usuario y el email del autor del post.

Ahora que ya tenemos el Resource configurado es hora de utilizarlo, para ello abrimos el archivo PostController.php, añadimos la clase PostResource y modificamos los métodos index y show con el siguiente código:

<?php

...
use App\Http\Resources\V1\PostResource;

class PostController extends Controller
{
    ...
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return PostResource::collection(Post::latest()->paginate());
    }
    ...
    public function show(Post $post)
    {
        return new PostResource($post);
    }

El método index se encargará de retornar todos los posts disponibles. Al utilizar el método collection de PostResource y al devolver los posts páginados con el modelo Post, obtendremos un listado de los 15 últimos posts. Además nos mostrará los links a sucesivas páginas de posts y una clave meta con información como el número total de posts, posts por página, etc. Vamos que nos dará un montón de info sin hacer prácticamente nada.

Para obtener el listado de posts solo tendremos que lanzar una petición de tipo GET a la siguiente url:

http://localhost:8000/api/v1/posts

Este endpoint nos devolverá el siguiente json (cambiando mis posts por los vuestros):

{
    "data": [
        {
            "id": 3,
            "title": "Add third post",
            "description": "Add third description",
            "photo": "http://localhost:8000/images/post/605490a7a7028.jpg",
            "author": {
                "name": "Krystina Flatley",
                "email": "will51@example.org"
            },
            "created_at": "2021-03-19T11:53:11.000000Z"
        },
        ...
    ],
    "links": {
        "first": "http://localhost:8000/api/v1/posts?page=1",
        "last": "http://localhost:8000/api/v1/posts?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "http://localhost:8000/api/v1/posts?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "http://localhost:8000/api/v1/posts",
        "per_page": 15,
        "to": 3,
        "total": 3
    }
}

El método show se encargará de mostrarnos un único post enviando el id por la url. Este método crea un objeto de tipo PostResource y recibe el objeto post en el constructor.

Para realizar la petición debemos lanzar una petición de tipo GET a la siguiente url http://localhost:8000/api/v1/posts/1 sustituyendo el id del post que queráis mostrar por el 1 que es que quiero visualizar yo:

Esta petición devolverá el siguiente resultado:

{
    "data": {
        "id": 1,
        "title": "Add first post",
        "description": "Add first description",
        "photo": "http://localhost:8000/images/post/6050ef4734e34.jpg",
        "author": {
            "name": "Krystina Flatley",
            "email": "will51@example.org"
        },
        "created_at": "2021-03-16T17:47:51.000000Z"
    }
}

Actualización

El siguiente paso es crear la actualización, para ello vamos al archivo PostController.php, importamos la clase Validator y modificamos el método update con el siguiente código:

...
use Illuminate\Support\Facades\Validator;

class PostController extends Controller
{
    
    public function update(Request $request, Post $post)
    {
        Validator::make($request->all(), [
            'title' => 'max:191',
            'image' => 'image|max:1024',
            'description' => 'max:2000',
        ])->validate();

        if (Auth::id() !== $post->user->id) {
            return response()->json(['message' => 'You don\'t have permissions'], 403);
        }

        if (!empty($request->input('title'))) {
            $post->title = $request->input('title');
        }
        if (!empty($request->input('description'))) {
            $post->description = $request->input('description');
        }
        if (!empty($request->file('image'))) {
            $url_image = $this->upload($request->file('image'));
            $post->image = $url_image;
        }

        $res = $post->save();

        if ($res) {
            return response()->json(['message' => 'Post update succesfully']);
        }

        return response()->json(['message' => 'Error to update post'], 500);
    }

Una vez añadido el código vamos a explicar que hace:

- En este caso, en vez de crear un archivo request he añadido la validación desde el propio método gracias a la clase Validator. Como veis solo tenemos que añadir las reglas como en el archivo request y lanzar el método validate().

- El siguiente paso es verificar que el usuario que realiza la petición es el propietario del post. Si no es así mostraremos un error.

- Después comprobamos que datos ha enviado el usuario y solo modificamos los existentes.

- Por último guardamos y si todo ha ido bien retornamos un mensaje afirmativo.

Importante: Para lanzar la actualización en Laravel NO debemos usar el método PUT o PATCH en los casos en los que enviemos archivos, ya que PHP NO guarda la información en la super variable $_FILES en una petición PUT o PATCH y por lo tanto no podremos actualizar este campo si se da el caso. Tendremos que lanzar una petición de tipo POST y enviar el parámetro _method: PUT.

La petición será igual a la que realizamos para pedir un post en el que debemos añadir el id del post que queremos actualizar.

Os dejo captura para que lo veáis más claro:

Borrado

Por último vamos a crear la acción de borrado. Volvemos al archivo PostController.php y modificamos el método destroy por el siguiente código:

    public function destroy(Post $post)
    {
        $res = $post->delete();

        if ($res) {
            return response()->json(['message' => 'Post delete succesfully']);
        }

        return response()->json(['message' => 'Error to update post'], 500);
    }

En este caso solo debemos lanzar el método delete y listo, nuestro post habrá sido eliminado.

Para lanzar la petición deberemos utilizar el método DELETE y usar la siguiente url sustituyendo el número final por el id del post que queramos eliminar, ejemplo: http://localhost:8000/api/v1/posts/1

Conclusiones

Y listo, ya tenemos nuestra API completamente funcional con Laravel 8. Como podéis ver Laravel se encarga de realizar mucho trabajo por nosotros lo que hará que podamos ahorrar mucho tiempo a la hora de montar una API 💪.

Como siempre os dejo el enlace al proyecto y os recomiendo seguirme en Twitter para estar al tanto de los nuevos tutoriales.

Nos leemos 👋.

955 vistas

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!