En esta ocasión, crearemos la API RESTful de Notas con acceso protegido mediante JWToken.
Primero, crearemos un Macro para que las respuestas desde el servidor al Font-End sean homogéneas, que tengan el mismo formato tanto en caso de éxito como de error (incluidos los errores de validación).Para ello, abrimos el Terminal desde nuestra carpeta de proyecto y ejecutamos:
1 |
php artisan make:provider ResponseMacroServiceProvider |
Abrimos el archivo generado y editamos tal que:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Response; class ResponseMacroServiceProvider extends ServiceProvider { public function boot() { Response::macro('success', function ($data) { return Response::json([ 'errors' => false, 'data' => $data, ]); }); Response::macro('error', function ($message, $status = 400) { return Response::json([ 'message' => $status.' error', 'errors' => [ 'message' => [$message], ], 'status_code' => $status, ], $status); }); } // *** } |
Registramos el provider:
1 2 3 4 5 6 7 8 9 |
<?php return [ 'providers' => [ // *** App\Providers\ResponseMacroServiceProvider::class, // *** ], |
Ahora, creamos la ruta para el controlador de notas que será de tipo resource y quitando de la lista de rutas las de «create» y «edit» que en este tipo de controladores sólo muestran formularios, cosa que no hay en controladores tipo API RESTful:
1 2 3 4 5 6 7 8 |
Route::group(['middleware' => 'jwt.auth'], function () { Route::group(['prefix' => 'v1'], function () { Route::resource('notes', 'Api\V1\NoteController', ['except' => ['create', 'edit']]); }); . . . }); |
A continuación, creamos el controlador de tipo resource para las notas:
1 |
php artisan make:controller --resource Api\V1\NoteController |
Abrimos el archivo generado y editaremos una a una las funciones que contiene la clase creada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Note; use Illuminate\Http\Request; class NoteController extends Controller { public function __construct() { $this->user = \Auth::user(); } public function index() { $notes = $this->user->notes() ->orderBy('created_at', 'DESC') ->get(); return response()->success(compact('notes')); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { try { $note = $this->user->notes()->create([ 'title' => $request->title, 'content' => $request->content, ]); return response()->success(compact('note')); } catch (Exception $e) { return response()->error('error_creating_note', $e->getStatusCode()); } } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { $note = Note::findOrFail($id); if (!$this->user->isAuthor($note)) { return response()->error('unauthorized', 401); } return response()->success(compact('note')); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { $note = Note::findOrFail($id); if (!$this->user->isAuthor($note)) { return response()->error('unauthorized', 401); } $note->title = $request->title; $note->content = $request->content; try { $note->save(); } catch (Exception $e) { return response()->error('error_updating_note', $e->getStatusCode()); } return response()->success(compact('note')); } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { $note = Note::findOrFail($id); if (!$this->user->isAuthor($note)) { return response()->error('unauthorized', 401); } try { // Soft Delete $note->delete(); } catch (Exception $e) { return response()->error('error_deleting_note', $e->getStatusCode()); } return response('success', 200); } } |
Ya tenemos nuestra API RESTful completada, más adelante incorporaremos un campo de imagen para que el usuario pueda subir una imagen junto con la nota.