CREAR API REST CON LARAVEL 10
1. Instalamos Laravel 10
composer create-project --prefer-dist laravel/laravel NewAPIRest
2. Entramos en la carpeta “NewAPIRest” y agregamos las dependencias de Laravel
Passport (Laravel Passport es un servidor OAuth2 y un paquete de autenticación que
es simple y sencillo de usar).
composer require laravel/passport --ignore-platform-req=ext-sodium
3. Configuramos la BD en el archivo “.env”
4. Forzamos la migración para crear las tablas en la Base de Datos
php artisan migrate
5. Para agregar el módulo de autenticación, es necesario instalar passport
php artisan passport:install
6. Creamos una tabla “Offer” en las migraciones
php artisan make:migration create_offers_table
modificamos su contenido:
Schema::create('offers', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description');
$table->timestamps();
});
Y volvemos a migrar:
php artisan migrate
Rellenamos la tabla “offers” de la BD con algunos registros
7. Creamos el modelo “app/Models/Offer.php”
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Offer extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'description'
];
}
8. Y creamos las rutas de la API en “routes/api.php”
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\RegisterController;
use App\Http\Controllers\API\OfferController;
Route::controller(RegisterController::class)->group(function(){
Route::post('register', 'register');
Route::post('login', 'login');
});
Route::middleware('auth:sanctum')->group( function () {
// La siguiente ruta devuelve las ofertas
Route::get('/offers', [OfferController::class, 'index']);
});
9. Creamos los Controladores “app/Http/Controllers/API/BaseController.php”,
“app/Http/Controllers/API/OfferController” y
“app/Http/Controllers/API/RegisterController”
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;
class BaseController extends Controller
{
/**
* success response method.
*
* @return \Illuminate\Http\Response
*/
public function sendResponse($result, $message)
{
$response = [
'success' => true,
'data' => $result,
'message' => $message,
];
return response()->json($response, 200);
}
/**
* return error response.
*
* @return \Illuminate\Http\Response
*/
public function sendError($error, $errorMessages = [], $code = 404)
{
$response = [
'success' => false,
'message' => $error,
];
if(!empty($errorMessages)){
$response['data'] = $errorMessages;
}
return response()->json($response, $code);
}
}
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\Models\Offer;
use Validator;
use App\Http\Resources\OfferResource;
use Illuminate\Http\JsonResponse;
class OfferController extends BaseController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(): JsonResponse
{
$offers = Offer::all();
return $this->sendResponse(OfferResource::collection($offers), 'Offers
retrieved successfully.');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request): JsonResponse
{
$input = $request->all();
$validator = Validator::make($input, [
'name' => 'required',
'description' => 'required'
]);
if($validator->fails()){
return $this->sendError('Validation Error.', $validator-
>errors());
}
$offer = Offer::create($input);
return $this->sendResponse(new OfferResource($offer), 'Offer created
successfully.');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id): JsonResponse
{
$offer = Offer::find($id);
if (is_null($offer)) {
return $this->sendError('Offer not found.');
}
return $this->sendResponse(new OfferResource($offer), 'Offer retrieved
successfully.');
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Offer $offer): JsonResponse
{
$input = $request->all();
$validator = Validator::make($input, [
'name' => 'required',
'description' => 'required'
]);
if($validator->fails()){
return $this->sendError('Validation Error.', $validator-
>errors());
}
$offer->name = $input['name'];
$offer->description = $input['description'];
$offer->save();
return $this->sendResponse(new OfferResource($offer), 'Offer updated
successfully.');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Offer $offer): JsonResponse
{
$offer->delete();
return $this->sendResponse([], 'Offer deleted successfully.');
}
}
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Validator;
use Illuminate\Http\JsonResponse;
class RegisterController extends BaseController
{
/**
* Register api
*
* @return \Illuminate\Http\Response
*/
public function register(Request $request): JsonResponse
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required',
'c_password' => 'required|same:password',
]);
if($validator->fails()){
return $this->sendError('Validation Error.', $validator-
>errors());
}
$input = $request->all();
$input['password'] = bcrypt($input['password']);
$user = User::create($input);
$success['token'] = $user->createToken('MyApp')->plainTextToken;
$success['name'] = $user->name;
return $this->sendResponse($success, 'User register successfully.');
}
/**
* Login api
*
* @return \Illuminate\Http\Response
*/
public function login(Request $request): JsonResponse
{
if(Auth::attempt(['email' => $request->email, 'password' => $request-
>password])){
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')->plainTextToken;
$success['name'] = $user->name;
return $this->sendResponse($success, 'User login successfully.');
}
else{
return $this->sendError('Unauthorised.',
['error'=>'Unauthorised']);
}
}
}
10. Creamos el Resource API Eloquent “app/Http/Resources/OfferResource.php”
php artisan make:resource OfferResource
y modificamos su contenido por el siguiente:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class OfferResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'created_at' => $this->created_at->format('d/m/Y'),
'updated_at' => $this->updated_at->format('d/m/Y'),
];
}
}
11. Levantamos el servidor
php artisan serve
12. NOTA: Recuerda poner los “headers” en las llamadas
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
]