2016-11-02 3 views
2

У меня есть модельсериализации массив объектов с использованием Doctrine и JMSSerializer аннотаций

/** 
    * @ORM\Table(name="polygon") 
    * @ORM\Entity(repositoryClass="MyBundle\Repository\PolygonRepository") 
    * @JMS\ExclusionPolicy("none") 
    */ 
    class Polygon { 
     /** 
      * @var string 
      * 
      * @ORM\Column(name="polygon", type="json_array") 
      * @JMS\Type("array<MyBundle\Model\Point>") 
      */ 
      private $points; 

      /***/ 
    } 

в БД хранится как текст "[{ "х": 1, "у": 1} ...]

контроллер у меня

/** 
* Matches /polygon exactly 
* 
* @Route("/", name="polygon_list") 
* @Method("GET") 
* 
* @Rest\Get("/") 
* 
*/ 
public function listAction() 
{ 
    return $this->container->get('doctrine.orm.entity_manager') 
     ->getRepository('MyBundle:Polygon') 
     ->findAll(); 
} 

так я получаю ReflectionProperty :: GetValue() ожидает параметр 1, чтобы быть объект, массив дал

в ... поставщика/JMS/метаданные/SRC/Метаданные/PropertyMetadata.php: 51

Если бы это было только, чтобы получить результат, она может быть решена с помощью виртуальной собственности

/** 
* @JMS\Exclude 
*/ 
private $points; 

/** 
* @JMS\VirtualProperty 
* @JMS\Type("array<MyBundle\Model\Point>") 
* @JMS\SerializedName("points") 
* @JMS\Groups({"common"}) 
* 
* @return array 
*/ 
public function getMyPoints() { 
    return [new Point(), new Point()] 
} 

Но я должно получить эти пункты, как JSON от POST таким образом, единственным способом, которым я нашел до сих пор является доктрина пользовательского типа похож на https://github.com/sonata-project/sonata-doctrine-extensions

с единственной разницей, что в методе convertToPHPValue я нахожусь addind дополнительного приведения типов, чтобы получить объекты вместо массива ДООСА:

// pass my [{"x":1, "y":1} ...] 
public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
     return array_map(function($a){ return (object)$a;}, json_decode($value)); 
    } 

Есть ли более чистое решение без добавления пользовательской сериализации Doctrine?

если только этого ... Поставщик/JMS/метаданные/SRC/Метаданные/PropertyMetadata.php: 51 был

return $this->reflection->getValue((object)$obj); 

но

return $this->reflection->getValue($obj); // :(
+0

если поля doctrine - это json_array, почему вы не пытаетесь сбрасывать как строку для jmsserializer? – Matteo

+1

вы можете найти дискуссию [здесь] (https://github.com/schmittjoh/JMSSerializerBundle/issues/431) об этом – Matteo

ответ

0

Моя проблема была в использовании @JMS \ Тип вообще

class Polygon { 
     /** 
      * @ORM\Column(name="polygon", type="json_array") 
      */ 
      private $points; 

      public function getPoints() { return $this->points;} 
      public function setPoints($points) { 
       $this->points = $points; 
       return $this; 
      } 
      /***/ 
    } 

Работает отлично, спасибо s @Matteo за то, что я усложняю вещи :)

+0

Ниже приведена ссылка, вероятно, потому, что вы разместили какой-то фиктивный текст, а затем отредактировали в окне изящества. Возможно, что downvoter заметит и убирает их вниз, но на самом деле нет чистого пути назад. Я полагаю, что все, что вы можете сделать, это принять к сведению, что в будущем это не будет сделано. – tripleee

Смежные вопросы