dokapi/dokapi-rest
Laravel package to expose REST endpoints from your app with minimal setup. Helps scaffold controllers/routes, standardize request/response handling, and speed up building API resources for common CRUD operations.
Installation
composer require dokapi/dokapi-rest
Add the service provider to config/app.php under providers:
Dokapi\Rest\RestServiceProvider::class,
Basic Configuration Publish the config file:
php artisan vendor:publish --provider="Dokapi\Rest\RestServiceProvider"
Update config/dokapi.php with your API base URL and namespace.
First Use Case Annotate a controller method to generate documentation:
use Dokapi\Rest\Annotations\Api;
class UserController extends Controller
{
/**
* @Api(
* path="/users",
* method="GET",
* description="Get all users",
* response={"200": {"type": "array", "items": {"$ref": "#/definitions/User"}}}
* )
*/
public function index()
{
return User::all();
}
}
Generate Documentation Run the generator:
php artisan dokapi:generate
Outputs OpenAPI/Swagger-compliant JSON/YAML to storage/dokapi.
Standardize Annotations Use consistent annotation formats across controllers:
/**
* @Api(
* path="/users/{id}",
* method="GET",
* description="Fetch a user by ID",
* parameters={
* {"name": "id", "in": "path", "type": "integer", "required": true}
* },
* response={"200": {"$ref": "#/definitions/User"}}
* )
*/
Group Related Endpoints
Use @ApiGroup at the class level for logical grouping:
/**
* @ApiGroup(
* name="Users",
* description="User management endpoints"
* )
*/
class UserController extends Controller { ... }
Middleware & Auth
Document auth requirements via @ApiSecurity:
/**
* @ApiSecurity("bearerAuth")
*/
public function sensitiveData() { ... }
Form Request Validation
Auto-generate parameter schemas from FormRequest classes:
use Dokapi\Rest\Annotations\ApiRequest;
/**
* @ApiRequest(StoreUserRequest::class)
*/
public function store(StoreUserRequest $request) { ... }
Iterative Documentation
php artisan dokapi:generate after each change.CI/CD Pipeline
dokapi:generate into your build process to ensure docs stay updated..github/workflows/docs.yml:
- name: Generate API Docs
run: php artisan dokapi:generate
- name: Upload Artifact
uses: actions/upload-artifact@v2
with:
name: api-docs
path: storage/dokapi
Versioning
--version flag to generate docs for specific API versions:
php artisan dokapi:generate --version=v1
storage/dokapi/v1, storage/dokapi/v2).Annotation Parsing Errors
Invalid annotation syntax.php artisan dokapi:validate.Circular References
$ref loops cause infinite recursion in generated docs.Middleware Ignored
@ApiSecurity or @ApiMiddleware:
/**
* @ApiMiddleware("auth:api")
*/
Verbose Output
Enable debug mode in config/dokapi.php:
'debug' => env('DOKAPI_DEBUG', false),
Run with:
php artisan dokapi:generate --debug
Log Annotations
Dump parsed annotations to storage/logs/dokapi_annotations.log:
'log_annotations' => true,
Custom Annotations
Extend the annotation parser by implementing Dokapi\Rest\Contracts\AnnotationParser:
namespace App\Extensions;
use Dokapi\Rest\Contracts\AnnotationParser;
use Dokapi\Rest\Models\Annotation;
class CustomParser implements AnnotationParser
{
public function parse(string $annotation): ?Annotation
{
// Handle custom annotations (e.g., @ApiDeprecated)
return new Annotation(...);
}
}
Register in config/dokapi.php:
'parsers' => [
\Dokapi\Rest\Parsers\DefaultParser::class,
\App\Extensions\CustomParser::class,
],
Post-Processing Hooks
Modify generated docs via Dokapi\Rest\Events\DocsGenerated:
use Dokapi\Rest\Events\DocsGenerated;
DocsGenerated::listen(function ($event) {
$event->docs->info->title = 'My Awesome API';
});
Base Path Handling
api.base_path in config/dokapi.php matches your Laravel url config:
'api' => [
'base_path' => env('API_BASE_PATH', '/api'),
],
api.yourdomain.com), set:
'api' => [
'base_path' => env('API_BASE_PATH', ''),
'host' => env('API_HOST', 'api.yourdomain.com'),
],
Schema Resolution
$ref sparingly for large schemas to avoid bloated docs."response": {
"200": {
"type": "object",
"properties": {
"id": {"type": "integer"},
"name": {"type": "string"}
}
}
}
How can I help you explore Laravel packages today?