亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 EventSubscriber 將函數的返回值作為屬性傳遞給 json

使用 EventSubscriber 將函數的返回值作為屬性傳遞給 json

PHP
函數式編程 2021-06-09 13:08:16
我已經使用 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() 函數時,出現此錯誤:
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

您當前的代碼失敗,因為$ticketRepo = $event->getObject();它返回的Ticket對象是它上面一行中的對象,而不是預期的TicketRepository.


您需要將EntityManageror Repository(如果您有存儲庫作為服務)注入您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 }

            #...

確保在進行更改后clear和warmupSymfony 緩存。


查看完整回答
反對 回復 2021-06-25
  • 1 回答
  • 0 關注
  • 217 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號