1
0
mirror of synced 2024-11-25 14:26:08 +03:00
service-bundle/ArgumentResolver/CallbackValueResolver.php
Akolzin Dmitry 7516ec60cb
JMS serializer supports (#3)
* add callback argument value resolver
* add jms serializer support
* add phpdoc
* fix FrontApiClientAuthenticator
2021-02-17 09:31:36 +03:00

87 lines
2.3 KiB
PHP

<?php
namespace RetailCrm\ServiceBundle\ArgumentResolver;
use RetailCrm\ServiceBundle\Serializer\Adapter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Generator;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* Class CallbackValueResolver
*
* @package RetailCrm\ServiceBundle\ArgumentResolver
*/
class CallbackValueResolver extends AbstractValueResolver implements ArgumentValueResolverInterface
{
private $serializer;
private $requestSchema;
/**
* CallbackValueResolver constructor.
*
* @param Adapter $serializer
* @param ValidatorInterface $validator
* @param array $requestSchema
*/
public function __construct(
Adapter $serializer,
ValidatorInterface $validator,
array $requestSchema
) {
parent::__construct($validator);
$this->serializer = $serializer;
$this->requestSchema = $requestSchema;
}
/**
* {@inheritdoc }
*/
public function supports(Request $request, ArgumentMetadata $argument): bool
{
if (empty($this->requestSchema) || $request->getMethod() !== Request::METHOD_POST) {
return false;
}
return null !== $this->search($request, $argument);
}
/**
* {@inheritdoc }
*/
public function resolve(Request $request, ArgumentMetadata $argument): Generator
{
$parameter = $this->search($request, $argument);
$data = $this->serializer->deserialize($request->request->get($parameter), $argument->getType());
$this->validate($data);
yield $data;
}
/**
* @param Request $request
* @param ArgumentMetadata $argument
*
* @return string|null
*/
private function search(Request $request, ArgumentMetadata $argument): ?string
{
foreach ($this->requestSchema as $callback) {
if ($argument->getType() !== $callback['type']) {
continue;
}
foreach ($callback['params'] as $param) {
if ($request->request->has($param)) {
return $param;
}
}
}
return null;
}
}