Agent skill
api-controller
Create a new Laravel API controller following this project's patterns. Use when creating new API endpoints, CRUD controllers, or backoffice controllers.
Stars
163
Forks
31
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/api-controller
SKILL.md
Create API Controller
Create a new Laravel API controller for $ARGUMENTS following this project's established patterns.
Project Patterns
Controller Location
- Public API controllers:
app/Http/Controllers/ - Auth controllers:
app/Http/Controllers/Auth/
Standard Controller Structure
php
<?php
namespace App\Http\Controllers;
use App\Models\{ModelName};
use App\Http\Resources\{ModelName}Resource;
use App\Http\Resources\{ModelName}Collection;
use App\Http\Requests\{ModelName}StoreRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class {ModelName}Controller extends Controller
{
// GET /api/{resource} - List all
public function index()
{
return new {ModelName}Collection({ModelName}::all());
}
// GET /api/{resource}/{id} - Show one
public function show($id)
{
return new {ModelName}Resource({ModelName}::findOrFail($id));
}
// POST /api/{resource} - Create
public function store({ModelName}StoreRequest $request)
{
$model = {ModelName}::create($request->validated());
// Invalidate cache if using caching
Cache::forget('{resource}-all');
return new {ModelName}Resource($model);
}
// PUT /api/{resource}/{id} - Update
public function update(Request $request, $id)
{
$model = {ModelName}::findOrFail($id);
$model->update($request->all());
Cache::forget('{resource}-all');
return new {ModelName}Resource($model);
}
// DELETE /api/{resource}/{id} - Delete
public function destroy($id)
{
{ModelName}::destroy($id);
Cache::forget('{resource}-all');
return response()->json(['success' => true]);
}
}
Caching Pattern (used in InventoryController, CategoryController)
php
public function all()
{
return Cache::remember('inventory-all', 60, function() {
return new InventoryCollection(Inventory::all());
});
}
Filtering Pattern (used in InvoiceController, SalesController)
php
use App\Models\Traits\Revenue; // or SalesRevenue, InventoryFilters
public function index(Request $request)
{
return Invoice::filter($request)->paginate(15);
}
Pusher Broadcasting (for real-time updates)
php
use Services\Pusher;
// After mutations that need real-time sync:
try {
Pusher::trigger('tables-update', []);
} catch (\Exception $e) {
\Log::error($e->getMessage());
}
Backoffice Controller Pattern
Backoffice routes are prefixed with /api/backoffice/ and may have different methods:
allBackoffice()- Admin-specific listing with more detailsexport()- Excel/CSV export functionality
Steps
- Create the controller in
app/Http/Controllers/ - Create corresponding Resource class in
app/Http/Resources/ - Create Collection class if needed
- Create FormRequest for validation in
app/Http/Requests/ - Add routes to
routes/api.php - Consider if caching is needed for read operations
- Add Pusher triggers if real-time updates are needed
Route Registration Pattern
php
// In routes/api.php
// Public routes
Route::get('{resources}', [{ModelName}Controller::class, 'index']);
Route::get('{resource}/{id}', [{ModelName}Controller::class, 'show']);
Route::post('{resources}', [{ModelName}Controller::class, 'store']);
// Backoffice routes (in the backoffice prefix group)
Route::prefix('/backoffice')->group(function () {
Route::put('/{resources}/{id}', [{ModelName}Controller::class, 'update']);
Route::delete('/{resources}/{id}', [{ModelName}Controller::class, 'destroy']);
});
Didn't find tool you were looking for?