如何在引发`serializer.pre_serialize`事件时访问每个Entity的属性

时间:2017-04-19 17:12:39

标签: symfony jmsserializerbundle symfony-2.8 jms-serializer

我想以递归方式访问序列化实体的每个属性,检查是否设置了字符串并验证元数据属性是否已正确设置为string,否则请更改它以允许序列化。

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

我设置SerializationSubscriber来抓住serializer.pre_serialize事件,但我没有找到任何文档来利用Visitor和周围环境。

任何提示?

1 个答案:

答案 0 :(得分: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();
        }
    }
}