dmp / rest-bundle
DMP Rest bundle
Requires
- php: ^8.4
- ext-json: *
- phpdocumentor/reflection-docblock: ^5.6
- phpstan/phpdoc-parser: ^2.0
- symfony/framework-bundle: ^6.4|^7.4
- symfony/property-access: ^6.4|^7.4
- symfony/property-info: ^6.4|^7.4
- symfony/serializer: ^6.4|^7.4
Requires (Dev)
- dmp/cg-lib: ^0.1.1
- doctrine/orm: ^3.6
- matthiasnoback/symfony-dependency-injection-test: ^6.3
- phpunit/phpunit: ^12.5
- symfony/browser-kit: *
- symfony/config: *
- symfony/console: *
- symfony/dependency-injection: *
- symfony/http-kernel: *
- symfony/messenger: *
- symfony/options-resolver: *
- symfony/routing: *
- symfony/validator: *
- symfony/web-link: *
README
This bundle provides convenient functionality to write simple and powerful JSON-based RPC controllers
How to use:
Add bundle DMP\RestBundle\RestBundle to your kernel.
Write controllers in a style:
use DMP\RestBundle\Annotation as Rest; use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; use Symfony\Component\Routing\Attribute\Route; class TestController { #[Route("/api/test", methods: ["POST"])] #[Rest\Serializable(statusCode: 201)] public function request(#[MapRequestPayload] RequestDTO $request): ResponseDTO { ... } }
where RequestDTO and ResponseDTO are Data Transfer Objects that should define Serialization and Validation rules for the fields
All routes should start with '/api/' (TODO: remove this hard-coded requirement)
Consult tests/Fixtures/ directory for an overview of how to define Rest Controllers
Request Data Mapping
Use Symfony's native attributes for mapping request data to DTOs:
#[MapRequestPayload]for JSON request body.#[MapQueryString]for query parameters.
The bundle's ExceptionListener will automatically catch validation errors from these attributes and format them into a consistent JSON response.
Exceptions
If the controller throws an exception, it will be converted into a response in the form
{
"errors": [
{
"message": "Exception message"
}
]
}
Validation error responses are different:
{
"errors": [
{
"message": "Field value should be a valid email address.",
"field": "email",
"parameters": {}
},
{
"message": "Field value should not be blank.",
"field": "password"
}
]
}