使用 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
。
您需要将EntityManager
或Repository
(如果您将存储库作为服务)注入您的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
#...
进行更改后,请确保 clear
和 warmup
Symfony 缓存。
【讨论】:
fyrye,太棒了。非常感谢!以上是关于使用 EventSubscriber 将函数的返回值作为属性传递给 json的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ctypes 将数组从 C++ 函数返回到 Python