proklung / annotatedparamresolverbundle
Symfony bundle for transform parameters of request to DTO.
Installs: 70
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 1
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=7.2 | ^8.0
- doctrine/annotations: ^1.10
- proklung/base-exception: ^1.0
- spatie/data-transfer-object: ^2.8
- spiral/attributes: ^2.8
- symfony/config: ^4.4 || ^5.0
- symfony/dependency-injection: ^4.4 || ^5.0
- symfony/framework-bundle: ^4.4 || ^5.0
- symfony/http-kernel: ^4.4 || ^5.0
- symfony/property-access: ^4.4 || ^5.0
- symfony/serializer: ^4.4 || ^5.0
- symfony/validator: ^4.4 || ^5.0
Requires (Dev)
- icanhazstring/composer-unused: ^0.7.5
- proklung/phpunit-testing-tools: ^1.0
- symfony/property-info: ^4.4 || ^5.0
- symfony/yaml: ^4.4 || ^5.0
README
За основу взят https://github.com/piku235/JungiFrameworkExtraBundle и творчески доработан под личные нужды.
Например, кроме, DTO в виде stdClass поддерживаются SpatieDTO. Кое-что выпилено за ненадобностью (куки, заголовки и тому подобное).
Установка
composer require proklung/annotatedparamresolverbundle
Аннотации:
- RequestBody - Преобразует request body в аргумент контроллера (DTO).
- RequestParams - Преобразует POST параметры запроса в аргумент контроллера (DTO).
- QueryParams - Преобразует GET параметры запроса в аргумент контроллера (DTO).
Также поддерживаются аннотации PHP 8 (даже на версиях 7.2+). При использовании PHP 8 в дело пойдет нативный парсер аннотаций.
Общий принцип
RequestBodyConverted
- пользовательский класс, реализующий (использующий интерфейс в качестве метки)
Prokl\AnnotatedParamResolverBundle\ArgumentResolver\Contracts\UnserializableRequestInterface
.
В экземпляр этого класса после всех манипуляций лягут, в зависимости от аннотации, - GET, POST параметры запроса или сконвертированный request body.
Можно использовать [https://github.com/spatie/data-transfer-object](Spatie DTO
), отнаследовавшись от DataTransferObject
, и реализовав интерфейс UnserializableRequestInterface
.
use Prokl\AnnotatedParamResolverBundle\Annotation\RequestBody; use Prokl\AnnotatedParamResolverBundle\Examples\RequestBodyConverted; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; class ExampleController extends AbstractController { /** * Параметры аннотации необязательны! * * @param RequestBodyConverted $unserialized * * @return JsonResponse $content * @RequestBody( var="unserialized", class="Prokl\AnnotatedParamResolverBundle\Examples\RequestBodyConverted", validate=true ) */ public function action( RequestBodyConverted $unserialized ): JsonResponse { return new JsonResponse(); } }
Так тоже можно (валидация по умолчанию включена):
use Prokl\AnnotatedParamResolverBundle\Annotation\RequestBody; use Prokl\AnnotatedParamResolverBundle\Examples\RequestBodyConverted; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; class ExampleController extends AbstractController { /** * Параметры аннотации необязательны! * * @param RequestBodyConverted $unserialized * * @return JsonResponse $content * @RequestBody() */ public function action( RequestBodyConverted $unserialized ): JsonResponse { return new JsonResponse(); } }
Валидация
В описании класса, реализующего UnserializableRequestInterface
к свойствам класса допустимо
применять любые стандартные и кастомные валидаторы Symfony.
Опция validate в аннотации управляет валидацией, вне зависимости от аннотаций свойства класса.
use Prokl\AnnotatedParamResolverBundle\ArgumentResolver\Contracts\UnserializableRequestInterface; use Spatie\DataTransferObject\DataTransferObject; use Symfony\Component\Validator\Constraints as Assert; class RequestBodyConvertedSpatie extends DataTransferObject implements UnserializableRequestInterface { /** * @var string $email * * @Assert\Length( * min=3, * minMessage="Email must be at least {{ limit }} characters long" * ) */ public $email; /** * @var integer */ public $numeric; }