dmp / rest-bundle
DMP Rest bundle
Requires
- php: >=8.1
- ext-json: *
- sensio/framework-extra-bundle: ^6.2
- symfony/framework-bundle: *
- symfony/serializer-pack: *
Requires (Dev)
- dmp/cg-lib: ^0.1.1
- doctrine/annotations: ^1.13
- doctrine/collections: ^1.8
- doctrine/common: ^3.4
- doctrine/dbal: ^2.13
- doctrine/orm: ^2.13
- matthiasnoback/symfony-dependency-injection-test: ^4.3
- phpunit/phpunit: ^9.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
此包提供了方便的功能,用于编写简单而强大的基于JSON的RPC控制器
如何使用
将包 DMP\RestBundle\RestBundle
添加到您的内核。
编写控制器风格
class TestController
{
#[Rest\Post("")]
#[BodyConverter("request")]
#[Rest\Serializable(statusCode: 201)]
public function request(string $testCode, RequestDTO $request): ResponseDTO
{
...
}
}
其中 RequestDTO 和 ResponseDTO 是定义字段序列化和验证规则的数据传输对象(DTO)
所有路由都应该以 '/api/' 开头(TODO:删除此硬编码要求)
查看 tests/Fixtures/
目录以了解如何定义 Rest 控制器的大致情况
BodyConverter
在控制器操作上放置 @BodyConverter
注解(DMP\RestBundle\Annotations\BodyConverter
)。将 DTO 参数的名称作为默认参数放置在注解中。
这将产生以下效果:`@dmp_rest.converter.request_body` 服务将尝试将请求体反序列化为 DTO 参数的类。然后对反序列化的 DTO 进行验证(使用 Symfony 验证器,相应配置)验证后的反序列化 DTO 将作为 DTO 参数的值传递给控制器操作。
异常
默认情况下,任何验证错误都会抛出异常(精确地说,是 DMP\RestBundle\Validation\ValidationException
)。这是通过 @dmp_rest.validation_exception_throwing_body_converter
服务(装饰器)实现的。
一个重要的注意事项是,它依赖于 dmp_rest.body_converter.validation_errors_argument
的值是 validationErrors
(它被定义为 const
DMP\RestBundle\Validation\ValidationExceptionThrowingBodyConverterDecorator::VALIDATION_ERRORS_ARGUMENT_NAME
)。覆盖该值将禁用装饰器抛出异常的能力,这将导致未验证的 DTO 被传递到控制器操作中。
如果控制器抛出异常,它将转换为以下形式的响应
{ "errors": [ { "message": "Exception message", } ] }
DMP\RestBundle\Validation\ValidationException
被不同地处理
{ "errors": [ { "message": "Field value should be a valid email address.", "type": "body", "field": "email" }, { "message": "Field value should not be blank.", "type": "body", "field": "password" } ] }