|
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace App\ArgumentResolver; |
|
|
|
use Exception; |
|
use Generator; |
|
use Linkin\Bundle\SwaggerResolverBundle\Factory\SwaggerResolverFactory; |
|
use Symfony\Component\HttpFoundation\Request; |
|
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; |
|
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; |
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; |
|
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; |
|
use Wakeapp\Component\DtoResolver\Dto\DtoResolverInterface; |
|
use function array_merge; |
|
use function is_subclass_of; |
|
use function json_decode; |
|
|
|
class EntryDtoArgumentResolver implements ArgumentValueResolverInterface |
|
{ |
|
/** |
|
* @var SwaggerResolverFactory |
|
*/ |
|
private $factory; |
|
|
|
public function __construct(SwaggerResolverFactory $factory) |
|
{ |
|
$this->factory = $factory; |
|
} |
|
|
|
/** |
|
* {@inheritDoc} |
|
*/ |
|
public function supports(Request $request, ArgumentMetadata $argument): bool |
|
{ |
|
return is_subclass_of($argument->getType(), DtoResolverInterface::class); |
|
} |
|
|
|
/** |
|
* {@inheritDoc} |
|
*/ |
|
public function resolve(Request $request, ArgumentMetadata $argument): Generator |
|
{ |
|
$dtoClassName = $argument->getType(); |
|
$resolver = $this->factory->createForRequest($request); |
|
$data = $this->getRequestDataByMethod($request); |
|
|
|
try { |
|
yield new $dtoClassName($data, $resolver); |
|
} catch (InvalidOptionsException $e) { |
|
throw new BadRequestHttpException($e->getMessage(), $e); |
|
} |
|
} |
|
|
|
private function getRequestDataByMethod(Request $request): array |
|
{ |
|
$requestMethod = $request->getMethod(); |
|
$data = $request->attributes->all(); |
|
|
|
if ($requestMethod === Request::METHOD_GET || $requestMethod === Request::METHOD_DELETE) { |
|
return array_merge($data, $request->query->all()); |
|
} |
|
|
|
try { |
|
$body = json_decode($request->getContent(), true); |
|
} catch (Exception $e) { |
|
throw new BadRequestHttpException('Unexpected content - should be JSON', $e); |
|
} |
|
|
|
return array_merge($data, $body); |
|
} |
|
} |