<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
baptiste-contreras / symfony-request-param-bundle example snippets
#[Route('/demo', name: 'demo_')]
class RegisterController extends AbstractApiController
{
#[Route(path: '/{uid}', name: 'register', methods: ['POST'])]
#[AutoProvideRequestDto]
public function register(#[DtoRequestParam] RegisterRequest $registerRequest, ?string $uid = null): Response
{
dd($registerRequest);
}
}
#[Route('/demo', name: 'demo_')]
class RegisterController extends AbstractApiController
{
#[Route(path: '/', name: 'register', methods: ['POST'])]
#[AutoProvideRequestDto]
public function register(#[DtoRequestParam(sourceType: SourceType::JSON)] RegisterRequest $registerRequest): Response
{
dd($registerRequest);
}
#[Route(path: '/xml', name: 'register_xml', methods: ['POST'])]
#[AutoProvideRequestDto]
public function registerXml(#[DtoRequestParam(sourceType: 'xml')] RegisterRequest $registerRequest): Response
{
dd($registerRequest);
}
}
#[Route('/demo', name: 'demo_')]
class RegisterController extends AbstractApiController
{
#[Route(path: '/', name: 'register', methods: ['POST'])]
#[AutoProvideRequestDto]
public function register(#[DtoRequestParam(throwValidationException: true)] RegisterRequest $registerRequest): Response
{
// If something went bad during the deserialization, the exception is rethrown and this code will not be called...
dd($registerRequest);
}
#[Route(path: '/test2', name: 'test2', methods: ['POST'])]
#[AutoProvideRequestDto]
public function test2(#[DtoRequestParam(throwValidationException: false)] ?RegisterRequest $registerRequest): Response
{
// Notice the type difference with the first method, we add "?RegisterRequest" because $registerRequest
// will be null if there is a problem during the deserialization.
dd($registerRequest);
}
}
#[Route('/demo', name: 'demo_')]
class RegisterController extends AbstractApiController
{
#[Route(path: '/', name: 'register', methods: ['POST'])]
#[AutoProvideRequestDto]
public function register(#[DtoRequestParam(validateDto: true)] RegisterRequest $registerRequest): Response
{
dd($registerRequest); // My DTO is validated
}
#[Route(path: '/test2', name: 'test2', methods: ['POST'])]
#[AutoProvideRequestDto]
public function registerXml(#[DtoRequestParam(validateDto: false)] RegisterRequest $registerRequest): Response
{
dd($registerRequest); // No validation
}
}
#[Route('/demo', name: 'demo_')]
class RegisterController extends AbstractApiController
{
#[Route(path: '/', name: 'register', methods: ['POST'])]
#[AutoProvideRequestDto]
public function register(#[DtoRequestParam(validationGroups: 'register-validation-1')] RegisterRequest $registerRequest): Response
{
dd($registerRequest);
}
#[Route(path: '/test2', name: 'test2', methods: ['POST'])]
#[AutoProvideRequestDto]
public function registerXml(#[DtoRequestParam(validationGroups: ['register-validation-1', 'register-validation-2'])] RegisterRequest $registerRequest): Response
{
dd($registerRequest);
}
}
class CustomXmlProvider implements DtoProviderDriverInterface
{
public function __construct(private readonly SerializerInterface $serializer)
{
}
public function fromRequest(DtoProviderContext $context, Request $request): mixed
{
try {
// The Symfony's serialize is used here but feel free to handle the raw data your way !
return $this->serializer->deserialize($request->getContent(), $context->getDtoClass(), 'xml', []);
} catch (\Throwable $exception) {
// This is optional, but you should do it, otherwise the
// throwDeserializationException parameter will be useless...
if ($context->shouldThrowDeserializationException()) {
throw $exception;
}
return null;
}
}
public function supports(DtoProviderContext $dtoProviderContext): bool
{
return 'xml' === $dtoProviderContext->getSourceType(); // You can add more logic if needed
}
}
class BasicHtmlErrorPresenter implements ErrorPresenterDriverInterface
{
public function presentBadRequest(RequestDtoException $requestDtoException, Request $request): Response
{
return new Response('<html><body><h1>Bad request</h1></body></html>', 400);
}
public function presentTechnicalError(RequestDtoException $requestDtoException, Request $request): Response
{
return return new Response('<html><body><h1>Technical error</h1></body></html>', 500);
}
public function supports(RequestDtoException $requestDtoException, Request $request): bool
{
return $request->headers->has('....'); // Your logic here
}
}
class CustomJsonFormatter implements JsonFormatterInterface
{
// $this->decorated is the next formatter in the chain (i.e. the one we decorate with our custom formatter)
// It can be null if our formatter is the last to be called
// the order depends on the stack definition you made in your services.yaml
public function __construct(private readonly ?JsonFormatterInterface $decorated = null)
{
}
public function format(array $currentResponse, RequestDtoException $requestDtoException, Request $request, string $defaultMessage, int $httpCode): array
{
$currentResponse['test'] = 'ok';
if ($this->decorated) {
$currentResponse = $this->decorated->format(
$currentResponse, $requestDtoException, $request, $defaultMessage, $httpCode
);
unset($currentResponse['success']);
}
return $currentResponse;
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.