api-rest-laravel-5-1-crud-de-usuarios

En la lección anterior aprendimos sobre la estructura básica de una API REST con Laravel 5.1 mediante la creación de recursos, en esta ocasión vamos a agregar la lógica correspondiente al recurso de usuarios que nos permita crear, almacenar, modificar y eliminar un registro.

Para verificar que todo se ejecute correctamente haremos uso del componente de pruebas de Laravel, en este caso no explicaremos en detalle cómo se utiliza dicho componente pero si estas interesado en aprender un poco más de él puedes ingresar al curso Curso introductorio de Laravel 5.1 dónde encontraras una sección completa dedicada a este tema.

Para crear la tabla de usuarios vamos a hacer uso de la migración que se crea por defecto en cada nuevo proyecto de Laravel, entonces iniciamos configurando las credenciales de acceso a la base de datos a través del archivo .env de nuestra aplicación

DB_HOST=localhost
DB_DATABASE=api_database
DB_USERNAME=homestead
DB_PASSWORD=secret

Posteriormente ejecutamos la migración con

$ php artisan migrate

A continuación vamos a agregar la lógica básica a cada una de las funciones correspondientes en el archivo UsersController.php, recuerda agregar lo siguiente en la cabecera del archivo

use App\User;

Crear nuevos usuarios

    public function store(Request $request)
    {
        User::create($request->all());
        return ['created' => true];
    }

Actualizar un usuario

    public function update(Request $request, $id)
    {
        $user = User::find($id);
        $user->update($request->all());
        return ['updated' => true];
    }

Obtener los datos de un usuario

    public function show($id)
    {
        return User::find($id);
    }

Eliminar a un usuario

    public function destroy($id)
    {
        User::destroy($id);
        return ['deleted' => true];
    }

Como puedes ver estamos devolviendo un array con una respuesta, por defecto Laravel convierte estas respuestas en objetos .json. Para asegurarnos que hasta ahora todo funciona correctamente podemos escribir una prueba rápida haciendo uso del componente de pruebas de Laravel. Iniciamos creando un archivo llamado UserTest.php dentro del directorio tests de nuestra aplicación

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class UserTest extends TestCase
{

    use DatabaseMigrations;

    public function testUserCreate()
    {
        $data = $this->getData();
        // Creamos un nuevo usuario y verificamos la respuesta
        $this->post('/user', $data)
            ->seeJsonEquals(['created' => true]);

        $data = $this->getData(['name' => 'jane']);
        // Actualizamos al usuario recien creado (id = 1)
        $this->put('/user/1', $data)
            ->seeJsonEquals(['updated' => true]);

        // Obtenemos los datos de dicho usuario modificado
        // y verificamos que el nombre sea el correcto
        $this->get('user/1')->seeJson(['name' => 'jane']);

        // Eliminamos al usuario
        $this->delete('user/1')->seeJson(['deleted' => true]);
    }

    public function getData($custom = array())
    {
        $data = [
            'name'      => 'joe',
            'email'     => '[email protected]',
            'password'  => '12345'
            ];
        $data = array_merge($data, $custom);
        return $data;
    }
}

Ejecutamos la prueba desde la consola con

$ vendor/bin/phpunit

En este caso vamos a obtener un error similar a este

api-test

Este error ocurre debido a que Laravel hace uso de un Middleware llamado VerifyCsrfToken.php (cross-site request forgeries) para verificar la autenticidad del usuario que esta realizando la petición, cada vez que enviamos una petición a través de un formulario (POST, PUT) debemos incluir un campo («_token») con el valor del token generado para dicha petición, esto puede lograr utilizando el helper

{!! csrf_field() !!}

Este último devuelve un campo de tipo hidden con el valor del token para la petición.

En nuestro caso, no estamos haciendo uso de formularios, tampoco estamos enviando este valor como parte de la petición, en las pruebas esta verificación se puede evadir agregando la siguiente linea al archivo UserTest.php

use WithoutMiddleware;

De esta forma estamos indicando que no se deben ejecutar Middleware en la clase, en nuestro caso UserTest.php. Una vez agregada esta linea podemos verificar nuevamente la prueba

vendor/bin/phpunit

api-test-assert

Perfecto, hasta ahora todo esta funcionando correctamente, pero si te fijas un poco, todas las funciones esperan que los datos recibidos sean correctos y envían una única respuesta para ese caso, aun no tenemos una respuesta en caso de que los datos sean incorrectos o el proceso no se ejecute de la forma esperada, en la próxima lección abordaremos ese tema, agregando validaciones y manejando algunos tipos de excepciones.

Material relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior API REST con Laravel 5.1 - Primeros pasos Lección siguiente API REST en Laravel 5.1 - Validaciones y Excepciones