2017-04-19 33 views
0

我想递归访问序列化实体的每个属性,检查是否设置了字符串并验证元数据属性是否设置为string,否则改变它以允许序列化。当`serializer.pre_serialize`事件发生时如何访问每个实体的属性

想象一下users属性是ArrayCollection,但我强制该值在角落情况下是一个字符串。

我设置了一个SerializationSubscriber来捕捉serializer.pre_serialize事件,但是我没有找到任何利用Visitor和周围环境的文档。

任何提示?

回答

0
class MyEventSubscriber implements JMS\Serializer\EventDispatcher\EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
      array('event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize'), 
     ); 
    } 

    public function onPreSerialize(JMS\Serializer\EventDispatcher\PreSerializeEvent $event) 
    { 
     /* 
     * @var YourEntity $object 
     */ 
     $object = $event->getObject(); 
     $reflect = new \ReflectionClass($foo); 
     $props = $reflect->getProperties(\ReflectionProperty::IS_PRIVATE); 

     foreach ($props as $prop) { 
      $method = 'get'.ucfirst($prop->getName()); 

      // here is call of methods like getId(), getName() etc, 
      // depending on name of entity properties 
      $object->$method(); 
     } 
    } 
} 
+0

哎!通过反思?非常昂贵,不是吗? – Bertuz

+0

确实,但它的工作。 –

+0

不幸的是不是递归的:我真正需要的是访问每个属性并根据需要更改类型。由于没有事件可以捕捉到访问节点的那一刻,我应该重新访问JMSSerialize遵循的所有实体属性。非常昂贵,我会说 – Bertuz

相关问题