Saltar al contenido principal

Guía rápida API REST con Lumen

1. Creación del proyecto

Instala Lumen vía Composer (crea un directorio dwcs con los ficheros de Lumen):

composer create-project --prefer-dist laravel/lumen dwcs
cd dwcs

2. Levantar el servidor

Usa el servidor integrado de PHP:

php -S localhost:8000 -t public

Accede en: http://localhost:8000.

Si estamos levantando el servidor en otro equipo, debemos indicar la IP: http://192.168.56.80:8000, pero deberíamos ejecutar el siguiente comando para tener acceso desde un equipo externo:

php -S 0.0.0.0:8000 -t public

3. Configuración del .env

Copia el archivo de ejemplo y edítalo:

cp .env.example .env

Configura la conexión a la base de datos:

APP_NAME=MiAPI
APP_ENV=local
APP_KEY=base64:TU_CLAVE_AQUI
APP_DEBUG=true
APP_URL=http://localhost:8000

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lumen
DB_USERNAME=root
DB_PASSWORD=abc123.

Si es necesario, genera la APP_KEY con:

php artisan key:generate

4. Levantar una base de datos MariaDB

Crea un fichero compose.yml con el siguiente contenido:

services:

mariadb:
image: mariadb:12
restart: always
environment:
MYSQL_ROOT_PASSWORD: abc123.
MYSQL_DATABASE: lumen
MYSQL_USER: user
MYSQL_PASSWORD: abc123.
ports:
- 3306:3306
volumes:
- mariadb_lumen:/var/lib/mysql

phpmyadmin:
image: phpmyadmin/phpmyadmin:5.2
links:
- mariadb
environment:
PMA_HOST: mariadb
PMA_PORT: 3306
PMA_ARBITRARY: 1
restart: always
ports:
- 9000:80
depends_on:
- mariadb

volumes:
mariadb_lumen:

Para levantar MariaDB, ejecuta:

docker compose up -d

Puedes acceder a un panel de administración phpMyAdmin a través de http://localhost:9000 (http://192.168.56.80:9000 si estamos levantando en un servidor remoto). Los datos de acceso son:

  • Host: mariadb
  • Username: root
  • Password: abc123.

5. Migraciones

Crea una migración para, por ejemplo, una tabla productos:

php artisan make:migration create_productos_table

Edita el archivo generado en database/migrations/:

public function up()
{
Schema::create('productos', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->decimal('precio', 8, 2);
$table->timestamps();
});
}

Ejecuta las migraciones:

php artisan migrate

6. Modelos — Habilitar Eloquent

Por defecto, Lumen tiene Eloquent desactivado. Debes habilitarlo en bootstrap/app.php:

// Descomenta esta línea
$app->withEloquent();

Luego crea el modelo en app/Models/Producto.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Producto extends Model
{
protected $table = 'productos';

protected $fillable = ['nombre', 'precio'];
}

El modelo se debe crear manualmente, no existe un comando de artisan.

7. Controladores

Crea el controlador en app/Http/Controllers/ProductoController.php:

<?php

namespace App\Http\Controllers;

use App\Models\Producto;
use Illuminate\Http\Request;

class ProductoController extends Controller
{
// GET /productos
public function index()
{
return response()->json(Producto::all());
}

// GET /productos/{id}
public function show($id)
{
$producto = Producto::find($id);
if (!$producto) {
return response()->json(['error' => 'No encontrado'], 404);
}
return response()->json($producto);
}

// POST /productos
public function store(Request $request)
{
$validated = $this->validate($request, [
'nombre' => 'required|string',
'precio' => 'required|numeric',
]);

$producto = Producto::create($validated));
return response()->json($producto, 201);
}

// PUT /productos/{id}
public function update(Request $request, $id)
{
$producto = Producto::find($id);
if (!$producto) {
return response()->json(['error' => 'No encontrado'], 404);
}

$validated = $this->validate($request, [
'nombre' => 'required|string',
'precio' => 'required|numeric',
]);

$producto->update($request->only($validated));
return response()->json($producto);
}

// DELETE /productos/{id}
public function destroy($id)
{
$producto = Producto::find($id);
if (!$producto) {
return response()->json(['error' => 'No encontrado'], 404);
}
$producto->delete();
return response()->json(['message' => 'Eliminado correctamente']);
}
}

El controlador se debe crear manualmente, no existe un comando de artisan. Puedes tomar como referencia ExampleController.php.

8. Routing

Define las rutas en routes/web.php:

$router->get('productos',         'ProductoController@index');
$router->get('productos/{id}', 'ProductoController@show');
$router->post('productos', 'ProductoController@store');
$router->put('productos/{id}', 'ProductoController@update');
$router->delete('productos/{id}', 'ProductoController@destroy');

9. Peticiones con cURL

Podemos usar herramientas como Postman, Apidog o Insomnia para probar los endpoints de forma visual. Por otra banda, podemos hacerlo a través de la línea de comandos con cURL.

Listar todos los productos

curl http://localhost:8000/api/productos

Obtener un producto por ID

curl http://localhost:8000/api/productos/1

Crear un producto (POST)

curl -X POST http://localhost:8000/api/productos \
-H "Content-Type: application/json" \
-d '{"nombre": "Laptop", "precio": 999.99}'

Actualizar un producto (PUT)

curl -X PUT http://localhost:8000/api/productos/1 \
-H "Content-Type: application/json" \
-d '{"nombre": "Laptop Pro", "precio": 1299.99}'

Eliminar un producto (DELETE)

curl -X DELETE http://localhost:8000/api/productos/1