Disable Doctrine 2 lazy loading when using JMS Serializer?

前端 未结 5 1289
梦谈多话
梦谈多话 2020-12-05 11:24

Im using Doctrine 2 ORM in my Zend project and need to serialize my Entities to JSON in several cases.

ATM i use the Querybuilder and join all tables i need. But my

5条回答
  •  有刺的猬
    2020-12-05 12:09

    Case you want pragmatically use your or default subscriber,

    @DavidLin answer:

    you can copy the class from JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber to Your\Bundle\Event\DoctrineProxySubscriber and comment out the $object->__load(); line

    
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    namespace Your\Bundle\Event;
    
    use Doctrine\ORM\PersistentCollection;
    use Doctrine\ODM\MongoDB\PersistentCollection as MongoDBPersistentCollection;
    use Doctrine\ODM\PHPCR\PersistentCollection as PHPCRPersistentCollection;
    use Doctrine\Common\Persistence\Proxy;
    use Doctrine\ORM\Proxy\Proxy as ORMProxy;
    use JMS\Serializer\EventDispatcher\PreSerializeEvent;
    use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
    
    class AvoidDoctrineProxySubscriber implements EventSubscriberInterface
    {
        public function onPreSerialize(PreSerializeEvent $event)
        {
            $object = $event->getObject();
            $type = $event->getType();
    
            // If the set type name is not an actual class, but a faked type for which a custom handler exists, we do not
            // modify it with this subscriber. Also, we forgo autoloading here as an instance of this type is already created,
            // so it must be loaded if its a real class.
            $virtualType = ! class_exists($type['name'], false);
    
            if ($object instanceof PersistentCollection
                || $object instanceof MongoDBPersistentCollection
                || $object instanceof PHPCRPersistentCollection
            ) {
                if ( ! $virtualType) {
                    $event->setType('ArrayCollection');
                }
    
                return;
            }
    
            if ( ! $object instanceof Proxy && ! $object instanceof ORMProxy) {
                return;
            }
    
    
            //Avoiding doctrine lazy load proxyes
            //$object->__load();
    
            if ( ! $virtualType) {
                $event->setType(get_parent_class($object));
            }
        }
    
        public static function getSubscribedEvents()
        {
            return array(
                array('event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize'),
            );
        }
    }
    

    And initialize the serialize like this:

    $serializer = JMS\Serializer\SerializerBuilder::create()
        //remove this to use lazy loading 
        ->configureListeners(function(JMS\Serializer\EventDispatcher\EventDispatcher $dispatcher) {
            $dispatcher->addSubscriber(new Your\Bundle\Event\AvoidDoctrineProxySubscriber());
        })  
        // !remove this to use lazy loading 
        ->build();
    
    //and serialize the data with/without Lazy
    
    serializer->serialize($data, 'json');
    

提交回复
热议问题