Installation:
composer require nebo15/lumen.rest
php artisan vendor:publish --provider="Nebo15\REST\RESTServiceProvider"
config/rest.php and database/migrations/.Generate a CRUD Endpoint:
php artisan rest:create Post
PostController with basic CRUD methods (index, store, show, update, destroy).Post model (if not exists).PostRepository (interface + implementation).PostRequest (form request for validation).Register the API Route:
In bootstrap/app.php or routes/web.php:
$api = $app->make('Nebo15\REST\Router');
$api->api('api/v1', 'PostController', ['auth']);
GET /api/v1/posts → indexPOST /api/v1/posts → storeGET /api/v1/posts/{id} → showPUT/PATCH /api/v1/posts/{id} → updateDELETE /api/v1/posts/{id} → destroyTest the Endpoint: Use tools like Postman or cURL to hit the generated routes. Example:
curl -X GET http://your-lumen-app/api/v1/posts
Post, User, and Comment resources.php artisan rest:create Post
php artisan rest:create User
php artisan rest:create Comment
routes/web.php:
$api->api('api/v1', 'PostController', ['auth']);
$api->api('api/v1', 'UserController', ['auth']);
$api->api('api/v1', 'CommentController', ['auth']);
Request classes (e.g., PostRequest) to add custom validation rules.Controller Layer:
Nebo15\REST\Controller and delegate logic to repositories.store(), update(), or customAction() for business logic.public function store(PostRequest $request)
{
$data = $request->all();
$data['author_id'] = auth()->id(); // Custom logic
return $this->repository->create($data);
}
Repository Pattern:
PostRepository to abstract data access.Nebo15\REST\Repository\Eloquent for Eloquent-based implementations.public function findWithAuthor($id)
{
return $this->model->with('author')->find($id);
}
Request Validation:
PostRequest extends Nebo15\REST\Request and uses Laravel's form requests.rules() method:
public function rules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'author_id' => 'exists:users,id',
];
}
Middleware Integration:
api() method:
$api->api('api/v1', 'PostController', ['auth', 'throttle:60,1']);
auth) and custom middleware.Resource Transformation:
Resource classes (v5) or manually transform data in controllers/repositories.JsonResource:
public function show($id)
{
$post = $this->repository->find($id);
return new PostResource($post);
}
Versioning:
$api->api('api/v1/posts', 'PostController', ['auth']);
$api->api('api/v2/posts', 'PostController', ['auth']);
API Documentation:
/**
* @GET /api/v1/posts
* @return array
*/
public function index()
Testing:
Http tests to test controllers:
public function testCreatePost()
{
$response = $this->post('/api/v1/posts', [
'title' => 'Test Post',
'content' => 'Hello World',
]);
$response->assertStatus(201);
}
Custom Actions:
public function publish($id)
{
$post = $this->repository->find($id);
$post->update(['published_at' => now()]);
return response()->json(['message' => 'Published!']);
}
routes/web.php:
$api->get('api/v1/posts/{id}/publish', 'PostController@publish');
Pagination:
index() method:
public function index()
{
return $this->repository->paginate(10);
}
Outdated Package:
laravel/framework, illuminate/database).No Built-in DTOs/Resources:
Resource classes (introduced in Laravel 5.1).JsonResource classes or use a package like spatie/laravel-data.Limited Customization:
Middleware Conflicts:
api() may conflict with global middleware.->except() or ->only() in HandleThrottleRequests if needed.No API Rate Limiting:
throttle middleware or a package like fruitcake/laravel-throttle.Database Migrations:
laravel/model:make.Route Debugging:
Route::get('/debug/routes', function() {
return response()->json(Route::getRoutes()->getRoutes());
});
Repository Debugging:
public function find($id)
{
\Log::debug("Finding model ID: {$id}");
return parent::find($id);
}
Request Validation:
public function store(PostRequest $request)
{
if ($request->fails()) {
return response()->json($request->errors(), 422);
}
// ...
}
Middleware Debugging:
$api->api('api/v1', 'PostController', []); // Disable middleware
Custom Repository Methods:
// PostRepositoryInterface.php
public function findPublished();
// PostRepository.php
public function findPublished()
{
return $this->model->where('published_at', '<=', now())->get();
}
Custom Controller Actions:
public function archive($id)
{
$this->repository->archive($id);
return response()->json(['message' => 'Archived']);
}
Override Base Classes:
Controller or Repository classesHow can I help you explore Laravel packages today?