Каков наилучший способ обновить форму Entity whitout, FosRest? - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время я создаю 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);
        }




     }
 }


}

Первый: В свойствах моего класса у меня есть свойства отношений с другими объектами, и я не хочу этого!

Во-вторых: Как я могу использовать этот код для управления патчем тоже? А что вы думаете об этом решении?

...