Las licencias de esta API viven en un proveedor. Eso hizo de los capítulos 2 y 3 una buena lección sobre fronteras, y una lección poco habitual. La mayoría de los endpoints que escribirás en tu vida se apoyan en una tabla de tu propia base de datos.
La License API también tiene uno de esos. El Capítulo 4 presentó al Consumer, y alguien tiene que crear consumidores, listarlos, renombrarlos, emitir sus tokens y eliminarlos. Hasta ahora eso se hacía desde una consola. Este capítulo le da una API, y al hacerlo muestra los mismos patrones en el caso para el que Laravel fue diseñado: un recurso respaldado por Eloquent.
No necesita nada de la maquinaria que construyó el Capítulo 3: ni contrato, ni driver, ni objeto tipado, ni cliente HTTP. Cuando los datos son tuyos, el framework carga con casi todo.
La tabla y el modelo
php artisan make:model Consumer -mf
El Capítulo 4 ejecutó ese comando y dejó la migración casi vacía. Aquí está completa:
// database/migrations/..._create_consumers_table.php
Schema::create('consumers', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->string('contact_email')->nullable();
$table->text('settings')->nullable();
$table->unsignedInteger('rate_limit')->nullable();
$table->unsignedInteger('license_limit')->default(50);
$table->softDeletes();
$table->timestamps();
});
Tres columnas merecen un comentario. settings es text, no json, porque el Capítulo 4 la cifra, y el texto cifrado no es JSON. license_limit es cuántas licencias puede tener este consumidor, cosa que el Capítulo 7 hace cumplir. softDeletes() añade una columna deleted_at, por una razón que explica el final de este capítulo.
// app/Models/Consumer.php
#[Fillable([
'name', 'contact_email', 'rate_limit', 'license_limit',
])]
#[Hidden(['settings'])]
class Consumer extends Authenticatable
{
use HasApiTokens, HasFactory, SoftDeletes;
// ... casts() y providerToken() del Capítulo 4
}
Fillable es la lista de atributos que una petición puede asignar en bloque. settings no está en ella: las credenciales de proveedor de un consumidor nunca se asignan pasando un array de una petición directo al modelo. (Documentación de Laravel: Eloquent: Getting Started › Mass Assignment.)
Hidden mantiene settings fuera de la forma en array y en JSON del modelo. El Resource que aparece más adelante en este capítulo es la verdadera protección, pero un modelo que no puede serializar sus propios secretos es una segunda cerradura en la misma puerta, y cuesta una línea.