league/openapi-psr7-validator
ServerRequestInterface, RequestInterface, ResponseInterface), aligning perfectly with Laravel’s HTTP layer (e.g., Symfony’s HttpFoundation or Laravel’s Illuminate\Http).darkaonline/l5-swagger, zircote/swagger-php) already integrates with OpenAPI, reducing friction.Kernel.php or route middleware).Illuminate\Http\Request and Illuminate\Http\Response implement PSR-7 interfaces, making direct validation possible with minimal adapters.config/openapi.php or API documentation files).Illuminate\Cache) can be leveraged here.ValidationFailed, InvalidBody) align with Laravel’s error-handling conventions (e.g., App\Exceptions\Handler).Request and Response may require minor adjustments for edge cases (e.g., custom headers, non-standard body parsing). Testing with real-world Laravel requests is critical.Illuminate\Http and Symfony\Component\HttpFoundation compatibility. No major stack conflicts expected.app/Http/Kernel.php or route-specific middleware (e.g., Route::middleware([ValidationMiddleware::class])).darkaonline/l5-swagger) for documentation and validation consistency.Http::fake(), tests/Feature/HttpTests) and Pest/PHPUnit.config/openapi.php or a dedicated resources/openapi/ directory.File facade or Storage to load YAML/JSON files.League\OpenAPIValidation\PSR15\ValidationMiddleware:
namespace App\Http\Middleware;
use League\OpenAPIValidation\PSR15\ValidationMiddlewareBuilder;
use League\OpenAPIValidation\PSR15\SlimAdapter;
class OpenApiValidatorMiddleware
{
public function __construct()
{
$this->middleware = (new ValidationMiddlewareBuilder())
->fromYamlFile(base_path('config/openapi.yaml'))
->setCache(app('cache'))
->getValidationMiddleware();
}
public function handle($request, $next)
{
return $this->middleware->process($request, $next);
}
}
Kernel.php:
protected $middleware = [
\App\Http\Middleware\OpenApiValidatorMiddleware::class,
];
Route::get('/api/endpoint', [Controller::class, 'method'])
->middleware([OpenApiValidatorMiddleware::class]);
public function render($request, Throwable $exception)
{
if ($exception instanceof \League\OpenAPIValidation\PSR7\Exception\ValidationFailed) {
return response()->json([
'message' => 'Validation failed',
'errors' => $exception->getErrors(),
], 400);
}
return parent::render($request, $exception);
}
cebe/openapi (v3.0.x) and psr/http-message (^1.0).league/openapi-psr7-validator and cebe/openapi for breaking changes. Laravel’s composer.json can pin versions:
"require": {
"league/openapi-psr7-validator": "^3.0",
"cebe/openapi": "^3.0"
}
Log facade) for debugging:
catch (\League\OpenAPIValidation\PSR7\Exception\ValidationFailed $e) {
\Log::error('OpenAPI Validation Failed', [
'errors' => $e->getErrors(),
'request' => $request->toArray(),
]);
}
## OpenAPI Validation Errors
- `InvalidBody`: Request body does not match schema.
Fix: Update request payload or schema.
- `InvalidQueryArgs`: Missing/incorrect query parameters.
Fix: Validate client-side or adjust schema.
How can I help you explore Laravel packages today?