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

标签 php symfony-3.4 sonata

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

/**
 * @param Ticket $object
 *
 * @return string
 */
public function findByTicketDeadline($object)
{
  // some logic
}

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

这是我的类(class)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() 函数时,出现以下错误: enter image description here

最佳答案

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

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

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

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 }
            #...

进行更改后,请务必清除预热 Symfony 缓存。

关于php - 使用 EventSubscriber 将函数的返回值作为属性传递给 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56224283/

相关文章:

php - 我将如何设置横幅或如何从我的页面中删除此空间

php - SQL命令无法获取单词相关句子

symfony - 加载 Web 调试工具栏时出错

Symfony LTS : how to upgrade from 2. 8 到 3.4?

php - Zend Framework 中的加盐示例

PHPUnit 提供程序不使用依赖项

symfony - 具有多个ID的findBy

php - 我可以在 Sonata Admin Controller 中使用 prePersist/preUpdate 来持久化多个对象吗?

symfony - 传递给 Controller ​​的参数必须是 ContainerInterface 的实例,给定 appDevDebugProjectContainer 的实例

php - 依赖 hell : installing Sonata User