tastyigniter/ti-ext-api
Laravel Sanctum-powered API extension for TastyIgniter. Provides ready-to-use endpoints for core resources, token authentication, and extensible architecture to add custom API resources or override default action/verb behavior.
Installation:
composer require tastyigniter/ti-ext-api
php artisan ti-ext-api:install
config/igniter-api.php) and migrations.Configuration:
config/igniter-api.php to define:
'all' or 'admin').'auth' => [
'fallback' => 'all',
],
First Use Case:
php artisan ti-ext-api:resource User
/api/users) and resource class (app/Http/Resources/UserResource.php).php artisan ti-ext-api:token --email=user@example.com
Quick Validation:
/api/users with the token:
curl -X GET http://your-app.test/api/users -H "Authorization: Bearer {token}"
config/igniter-api.php (customize auth, token groups, and resource defaults).ti-ext-api:resource (generate API for a model).ti-ext-api:token (create test tokens).ti-ext-api:abilities (manage token permissions).Pattern: Use ti-ext-api:resource to scaffold CRUD APIs for Eloquent models.
php artisan ti-ext-api:resource Product --with-relations
routes/api.php).app/Http/Resources/ProductResource.php).app/Http/Controllers/Api/ProductController.php).Product::hasMany(Inventory::class)).When to Use:
User, Order, Menu).Pattern: Extend auto-generated resources or override methods.
UserResource:
namespace App\Http\Resources;
use TastyIgniter\Api\Resources\ApiResource;
class UserResource extends ApiResource
{
public function toArray($request)
{
return array_merge(parent::toArray($request), [
'custom_field' => $this->whenLoaded('customField'),
]);
}
}
store()):
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
// Custom validation
]);
return parent::store($request);
}
When to Use:
Pattern: Use Sanctum tokens with custom abilities.
php artisan ti-ext-api:token --email=admin@example.com --group=admin
config/igniter-api.php):
'abilities' => [
'admin' => ['users.create', 'orders.update'],
'editor' => ['menus.read'],
],
public function update(Request $request, $id)
{
$this->authorize('orders.update'); // Uses Sanctum's ability system
return parent::update($request, $id);
}
When to Use:
Pattern: Create standalone API resources for non-model data.
php artisan ti-ext-api:resource CustomReport --type=custom
app/Http/Controllers/Api/CustomReportController.php):
public function index()
{
return response()->json([
'data' => $this->fetchReportData(),
]);
}
private function fetchReportData()
{
// Custom logic (e.g., query database, call external API)
return Report::query()->where('active', true)->get();
}
routes/api.php:
Route::apiResource('reports', \App\Http\Controllers\Api\CustomReportController::class);
When to Use:
Pattern: Leverage Laravel’s built-in pagination and query scopes.
index() endpoints.public function scopeActive($query)
{
return $query->where('is_active', true);
}
/api/users?active=true.public function index(Request $request)
{
return User::paginate($request->input('per_page', 15));
}
When to Use:
ti-ext-api:token to generate tokens for testing:
php artisan ti-ext-api:token --email=user@example.com --group=customer
public function test_custom_validation()
{
$response = $this->post('/api/users', [
'email' => 'invalid-email',
]);
$response->assertStatus(422);
}
public function index()
{
return Cache::remember('api_products', now()->addHours(1), function () {
return Product::all();
});
}
TastyIgniter\Api\Concerns\Apiable for full support:
use TastyIgniter\Api\Concerns\Apiable;
class Order extends Model
{
use Apiable;
}
Route::put('/api/orders/{id}/status', [OrderController::class, 'updateStatus']);
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'user' => UserResource::make($this->whenLoaded('user')),
];
}
app/Http/Kernel.php:
\Illuminate\Cache\RateLimiting\Limit::perMinute(60)->by($this->resolveRequest()->ip());
fillable or guarded attributes.
protected $fillable = ['name', 'email'];
protected $guarded = ['deleted_at'];
SoftDeletes) may conflict with API generation.
use Illuminate\Database\Eloquent\SoftDeletes;
use TastyIgniter\Api\Concerns\Apiable;
class User extends Authenticatable
{
use SoftDeletes, Apiable;
}
'all' (not 'admin'), which may expose endpoints unintentionally.How can I help you explore Laravel packages today?