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
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
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
- Pruebas de integración en Laravel 5.1
- Crea tus propias pruebas de integración
- Creación de un feature con pruebas de integración
- Pruebas de integración con base de datos
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