使用 EventSubscriber 将函数的返回值作为属性传递给 json

Posted

技术标签:

【中文标题】使用 EventSubscriber 将函数的返回值作为属性传递给 json【英文标题】:Pass the returned value of a function as a property to json using EventSubscriber 【发布时间】:2019-10-07 00:30:51 【问题描述】:

我已经使用 JMS 序列化包构建了一个 api。此外,我有一个实体 Ticket,它有一个名为 TicketRepository 的存储库。此存储库包含以下方法:

/**
 * @param Ticket $object
 *
 * @return string
 */
public function findByTicketDeadline($object)

  // some logic

我的目标:使用EventSubscriber将这个函数的返回值传递给json。

这是我的班级TicketSerializationSubscriber

 class TicketSerializationSubscriber implements EventSubscriberInterface



    /**
     * @param ObjectEvent $event
     */
    public function onPostSerialize(ObjectEvent $event)
    
        /** @var JsonSerializationVisitor $visitor */
        $visitor = $event->getVisitor();
        $visitor->setData('ticketDeadline', 'TEST TICKET'); // WORKS

        /** @var Ticket $ticket */
        $ticket = $event->getObject();
        /** @var TicketRepository $ticketRepo */
        $ticketRepo = $event->getObject();

        $visitor->setData('TESTING', $ticketRepo->findByTicketDeadline($ticket));

//        $visitor->setData('uri',
//                $this->router->generate('ticket_api_show', [
//                    'ticketDeadline' => $ticketRepo->findByTicketDeadline($ticket)
//                ])
//        );

    

    public static function getSubscribedEvents()
    
        return array(
            array(
                'event' => 'serializer.post_serialize',
                'method' => 'onPostSerialize',
                'class' => 'CMS3\CoreBundle\Entity\Ticket', // if no class, subscribe to every serialization
                //'class' => 'CMS3\CoreBundle\Repository\TicketRepository', // if no class, subscribe to every serialization
                'format' => 'json', // optional format
                //'priority' => 0, // optional priority
            ),
        );
    


当我将存储库方法传递给 $visitor->setData() 函数时,我收到此错误:

【问题讨论】:

我不知道该怎么办。请任何提示:这行代码不起作用: $visitor->setData('TESTING', $ticketRepo->findByTicketDeadline($ticket)); 【参考方案1】:

您当前的代码失败了,因为$ticketRepo = $event->getObject(); 正在返回上面一行中的Ticket 对象,而不是预期的TicketRepository

您需要将EntityManagerRepository(如果您将存储库作为服务)注入您的TicketSerializationSubscriber::__construct() 以检索TicketRepository

假设您为包含TicketSerializationSubscriber 的目录启用了autowire

use Doctrine\ORM\EntityManagerInterface;

class TicketSerializationSubscriber implements EventSubscriberInterface

    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    public function __construct(EntityManagerInterface $em)
    
         $this->em = $em;
    

    public function onPostSerialize(ObjectEvent $event)
    
        /** @var JsonSerializationVisitor $visitor */
        $visitor = $event->getVisitor();

        $ticket = $event->getObject();
        if (!$ticket instanceof Ticket) 
            //ensure object is of expected type
            return;
        

        /** @var TicketRepository $ticketRepo */
        $ticketRepo = $this->em->getRepository(Ticket::class);

        $visitor->setData('TESTING', $ticketRepo->findByTicketDeadline($ticket));
        //...
    

    //...


如果不使用 autowire,您需要手动将其添加到您的 TicketSerializationSubscriber 服务声明参数中。

#app/config/services.yml

services:
    #...

    TicketSerializationSubscriber:
        public: false
        arguments: ['@doctrine.orm.entity_manager']
        tags:
            -  name: kernel.event_subscriber 
            #...

进行更改后,请确保 clearwarmup Symfony 缓存。

【讨论】:

fyrye,太棒了。非常感谢!

以上是关于使用 EventSubscriber 将函数的返回值作为属性传递给 json的主要内容,如果未能解决你的问题,请参考以下文章

在Symfony单元测试期间无法获取用户名

如何使用 ctypes 将数组从 C++ 函数返回到 Python

使用数据处理函数

将变量传递给函数\使用该变量返回一个新值\重复直到值达到 0

如何将 py_func 与返回 dict 的函数一起使用

函数将多列作为单列而不是多列返回