我有一個Category
實體,其中包含一堆Assets
。該類別具有返回其中資產數量的getCount
方法。如何更改方法以調用PreSerializeEvent上的實體?
我使用FosRestBundle,因此使用JMSSerializerBundle將Category資源序列化爲json。現在,功能改變引入了不同類型的資產,例如external
和internal
個。
我還想使用實體序列化,我想通過創建一個PreSerializeEvent
我實際上可以做到這一點。
然而docs for the serializer component是模糊的,參照相關部分作爲do something
我怎麼實際上應該在這裏做什麼?
我想實現的是改變如果一個標誌被設置被調用的方法。串行器的正常情況應該使用getCount
方法,如果getCount
被序列化,則使用Category對象上的getExternalCountOnly
方法。
這實際上是可以做到這裏還是我在錯誤的軌道上?
見我CategorySerializationSubscriber
:
<?php
namespace Hn\AssetDbBundle\Listener;
use Hn\AssetDbBundle\Entity\Category;
use Hn\UserBundle\Entity\User;
use JMS\Serializer\Annotation\PostSerialize;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use JMS\Serializer\EventDispatcher\PreSerializeEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
/**
* Class CategorySerializationSubscriber
* @package Hn\AssetDbBundle\Listener
*/
class CategorySerializationSubscriber implements EventSubscriberInterface
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var User $user
*/
private $user;
/**
* @param LoggerInterface $logger
*/
public function __construct(LoggerInterface $logger, SecurityContextInterface $context)
{
$this->user = $context->getToken()->getUser();
$this->logger = $logger;
$logger->critical($this->user->getFullNameOrEmail());
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
[
'event' => 'serializer.pre_serialize',
'method' => 'onPreSerialize'
],
];
}
/**
* @param PreSerializeEvent $event
*/
public function onPreSerialize(PreSerializeEvent $event)
{
$category = $this->getCategoryFromEvent($event);
if (!$category) {
$this->logger->info('is not a category, aborting');
return;
}
$userCanViewInternalAsset = $this->user->isAllowedToViewInternalAssets();
/**
* How to actually do something?
*
* Pseudocode follows:
*/
if ($userCanViewInternalAsset) {
$seriaization->replaceMethod($category, 'getCount', 'getExternalAssetCount');
} else {
/**
* $category->getCount(); remains intact
*/
}
}
/**
* @param PreSerializeEvent $event
* @return Category|null
*/
protected function getCategoryFromEvent(PreSerializeEvent $event) {
/**
* @var Category $category
*/
$category = $event->getObject();
if (!$category instanceof Category) {
return null;
}
return $category;
}
}
,如果你有什麼只需在每個函數中添加一個JMS組 - 'getCount()'爲'internal','getExternalAssetCount()'爲'external',然後根據用戶的訪問級別添加適當的序列化組? –
@JasonRoman然後,我將不得不在所有序列化類別的實例上設置組。由於依賴關係,這也不是很清楚,因爲類別也與其他實體有關係,並且在序列化時可能會被序列化。我寧願避免這種情況,並通過所有序列化的事件來實現。 – k0pernikus