2014-12-23 32 views
1

我有一個Category實體,其中包含一堆Assets。該類別具有返回其中資產數量的getCount方法。如何更改方法以調用PreSerializeEvent上的實體?

我使用FosRestBundle,因此使用JMSSerializerBundle將Category資源序列化爲json。現在,功能改變引入了不同類型的資產,例如externalinternal個。

我還想使用實體序列化,我想通過創建一個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; 

    } 
} 
+0

,如果你有什麼只需在每個函數中添加一個JMS組 - 'getCount()'爲'internal','getExternalAssetCount()'爲'external',然後根據用戶的訪問級別添加適當的序列化組? –

+0

@JasonRoman然後,我將不得不在所有序列化類別的實例上設置組。由於依賴關係,這也不是很清楚,因爲類別也與其他實體有關係,並且在序列化時可能會被序列化。我寧願避免這種情況,並通過所有序列化的事件來實現。 – k0pernikus

回答

2

如何在默認情況下排除,然後用postSerialize()用戶與你想要的功能添加呢?例如:

定義在services.yml(或下services在config.yml):

category_serialization_subscriber: 
    class: Hn\AssetDbBundle\Listener\CategorySerializationSubscriber 
    tags: 
     - { name: jms_serializer.event_subscriber } 

那麼下面,這是從你的類修改上面:

public static function getSubscribedEvents() 
{ 
    return array(array(
     'event' => 'serializer.post_serialize', 
     'class' => 'Hn\AssetDbBundle\Entity\Category', 
     'method' => 'onPostSerialize' 
    )); 
} 

public function onPostSerialize(ObjectEvent $event) 
{ 
    $category = $event->getObject(); 
    $visitor = $event->getVisitor(); 

    if ($this->user->isAllowedToViewInternalAssets()) { 
     $visitor->addData('count', $category->getExternalAssetCount()); 
    } else { 
     $visitor->addData('count', $category->getCount()); 
    } 
} 
+0

onPostSerialize不會被調用O.o.是否還需要另一個標籤,還是'name:jms_serializer.event_subscriber'仍然適用? – k0pernikus

+0

我更新了我的帖子,表明你需要添加這個作爲一個事件監聽器,所以它被觸發 –

+0

非常感謝輸入,但仍然沒有骰子:(它甚至沒有調用onPostSerialize。可能有一個問題'Entity.Cateory.yml'配置? – k0pernikus

相關問題