boson-php/http-contracts
Lightweight PHP contracts for HTTP clients, requests, responses, and middleware. Provides stable interfaces to decouple your app from конкрет implementations, making it easier to swap HTTP libraries, mock in tests, and share consistent types across packages.
Installation Add the package via Composer:
composer require boson-php/http-contracts
No additional configuration is required—this is a pure PHP package with no Laravel-specific dependencies.
First Use Case: HTTP Request/Response Contracts Use the package to define strict contracts for HTTP interactions (e.g., API requests/responses). Example:
use Boson\Http\Contracts\RequestContract;
use Boson\Http\Contracts\ResponseContract;
// Define a contract for a user creation request
$requestContract = new RequestContract(
path: '/api/users',
method: 'POST',
requiredHeaders: ['Content-Type' => 'application/json'],
requiredBody: ['name' => 'string', 'email' => 'string']
);
// Validate a request against the contract
$isValid = $requestContract->validate($request);
Where to Look First
src/Contracts/ for RequestContract, ResponseContract, and MiddlewareContract.src/Validation/ for rules and utilities.tests/ for usage patterns (if available).// Middleware to validate incoming requests
public function handle($request, Closure $next)
{
$contract = new RequestContract(...);
if (!$contract->validate($request)) {
abort(400, 'Invalid request format');
}
return $next($request);
}
use Boson\Http\Contracts\MiddlewareContract;
class ValidateApiKey implements MiddlewareContract
{
public function handle($request, Closure $next)
{
$contract = new RequestContract(
requiredHeaders: ['X-API-KEY' => 'string']
);
if (!$contract->validate($request)) {
abort(403);
}
return $next($request);
}
}
app/Http/Kernel.php:
protected $middleware = [
\App\Http\Middleware\ValidateApiKey::class,
];
use Boson\Http\Contracts\ResponseContract;
public function store(Request $request)
{
$responseContract = new ResponseContract(
statusCode: 201,
requiredBody: ['id' => 'integer', 'name' => 'string']
);
$data = User::create($request->validated());
return response()->json($data)->assert($responseContract);
}
public function test_request_validation()
{
$contract = new RequestContract(...);
$request = new Request([], [], [], [], [], ['HTTP_X_API_KEY' => 'valid']);
$this->assertTrue($contract->validate($request));
}
Overhead for Simple APIs
Lack of Laravel-Specific Features
FormRequest or ApiResource. You’ll need to manually bridge contracts with Laravel’s validation (e.g., using Validator::make()).No Built-in Error Messages
if (!$contract->validate($request)) {
abort(400, $contract->getErrors());
}
Subtree Split Dependency
boson-php/boson, ensure compatibility with the parent package if used together. Check for breaking changes in the parent repo.$contract->getErrors() to debug failed validations.\Log::debug('Request contract:', $contract->toArray());
Custom Validators
Extend Boson\Http\Validation\Validator to add domain-specific rules:
class CustomValidator extends Validator
{
protected function validateEmailFormat($value)
{
return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
}
}
Response Assertions
Add assertions to ResponseContract for Laravel’s JsonResponse:
$response = response()->json($data);
$response->assert($contract); // Hypothetical; implement custom logic.
Middleware Chaining Chain multiple contracts in middleware for layered validation:
$contracts = [
new RequestContract(...),
new RequestContract(...),
];
foreach ($contracts as $contract) {
if (!$contract->validate($request)) {
abort(400);
}
}
How can I help you explore Laravel packages today?