イベントのサブスクライバを作成し、postSerialize
イベントにサブスクライブする方法があります。
はjms_serializer.event_subscriber
タグ
# app/config/services.yml
services:
app.subscriber.oder_serialization_subscriber:
class: AppBundle\Subscriber\OrderSerializationSubscriber
tags:
- { name: jms_serializer.event_subscriber }
を使用してサービスを定義し、それがサブクエリの一部であるため、加入者クラス
# AppBundle/Subscriber/OrderSerializationSubscriber.php
<?php
namespace AppBundle\Subscriber;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use JMS\Serializer\GenericSerializationVisitor;
use AppBundle\Entity\Order;
class OrderSerializationSubscriber implements EventSubscriberInterface {
/**
* @return array
*/
public static function getSubscribedEvents() {
return array(
array(
'event' => 'serializer.post_serialize',
'method' => 'postSerialize',
)
);
}
/**
* @param ObjectEvent $event
*/
public function postSerialize(ObjectEvent $event) {
/** @var Order $order */
$order = $event->getObject();
if (! $order instanceof Order) {
return;
}
/** @var GenericSerializationVisitor $visitor */
$visitor = $event->getVisitor();
// fetch feed data from repository or directly on the object if a (bidirectional) relation exists
$feedback = $order->hasFeedback();
// set virtual property
$visitor->addData('isFeedBackAdded', $feedback);
}
}
Orderエンティティは、 'isFeedbackAdded'または' hasFeedback'を取得することはありません作成します。配列からオブジェクトにどのように渡すことができるかを詳しく説明できます。次は例ですhttps://gist.github.com/iBasit/f0b9e94575f901514a5a73c8ae1f4b81 – Basit
@Basitメインクエリからサブクエリを削除し、エンティティマネージャ/リポジトリをサブスクライバに挿入し、そこにクエリを投げて追加する値を取得します。 – lordrhodos
それは動作しますが、N + 1のクエリの問題を作成していますが、サブクエリをどのように保持できますか?リストビューでは多くのクエリにヒットしません。 – Basit