Передайте возвращаемое значение функции как свойство в json, используя EventSubscriber - PullRequest
2 голосов
/ 20 мая 2019

Я создал API, используя сериализованный пакет JMS.Более того, у меня есть сущность Ticket , в которой есть хранилище с именем TicketRepository .Этот репозиторий содержит следующий метод:

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

Моя цель : Передать возвращаемое значение этой функции в json с помощью EventSubscriber.

Вот мой класс 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

1 Ответ

2 голосов
/ 20 мая 2019

Ваш текущий код не выполняется, потому что $ticketRepo = $event->getObject(); возвращает объект Ticket, как в строке над ним, а не ожидаемый TicketRepository.

Вам нужно будет ввести EntityManager или 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 и warmup кеш Symfony после внесения изменений.

...