В настоящее время я создаю API с помощью FosRestBundle. Я ищу, как сделать повторно используемую и оптимизированную службу для обновления моих сущностей.
На данный момент в моем контроллере у меня есть два энтита с paramConverter:
/**
* @Rest\Put("/enseignes/{enseigne_id}",
* requirements={"id" = "\d+"})
*@ParamConverter("enseigne", options={"id":"enseigne_id"})
*@ParamConverter("enseigneUpdate",
* converter="fos_rest.request_body")
*
* @Rest\View()
*/
public function updateEnseigneAction(Enseigne $enseigne,Enseigne $enseigneUpdate, ConstraintViolationList $violations)
{
if (count($violations)){
return $this->view($violations,Response::HTTP_BAD_REQUEST);
}
$mapData = $this->get('app.mapdata');
$mapData->mapDataOnEntity($enseigneUpdate,$enseigne);
$em = $this->getDoctrine()->getManager();
$em->flush();
return $enseigne;
}
Итак, одна сущность в настоящее время находится в моем bdd с параметром id (и проверьте, существует ли id), и другая, которая проверяется с помощью преобразователя fosRest. ХОРОШО
Мой сервис выглядит так:
class MapData {
private $propertyMetadata;
private $serializer;
function __construct(MetadataFactory $metadataFactory,Serializer $serializer)
{
$this->propertyMetadata = $metadataFactory;
$this->serializer = $serializer;
}
public function mapDataOnEntity($entityUpdate, $targetEntity)
{
if (get_class($entityUpdate) != get_class($targetEntity)){
throw new BadRequestHttpException('Entity doesnt match');
}
$this->fillProperties($targetEntity,$entityUpdate );
}
/**
*
* @param object $targetEntity
* @param object $entityUpdate
*/
protected function fillProperties($targetEntity, $entityUpdate)
{
$propertyAccessor = new PropertyAccessor();
$reflectorTargetEntity = new \ReflectionClass($entityUpdate);
// dump($classAnnotaions);die();
// Recupere les propriétés de targetEntity
$properties = $reflectorTargetEntity->getProperties();
// dump($properties);die();
foreach ($properties as $property){
if ($property->getName() != 'id'){
$newValue = $propertyAccessor->getValue($entityUpdate,$property->getName());
$propertyAccessor->setValue($targetEntity,$property->getName(),$newValue);
}
}
}
}
Первый:
В свойствах моего класса у меня есть свойства отношений с другими объектами, и я не хочу этого!
Во-вторых:
Как я могу использовать этот код для управления патчем тоже? А что вы думаете об этом решении?