2017-04-11 88 views
1

我正在使用api平臺(https://api-platform.com/)我的網站的框架,我試圖用不同的標準多次序列化一個實體的集合。我創建了下面的例子實體:API-平臺定製過濾收集作爲屬性

EntityWithFilteredCollection

namespace AppBundle\Entity; 

use ApiPlatform\Core\Annotation\ApiResource; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Serializer\Annotation\Groups; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @ApiResource(attributes={"normalization_context"={"groups"={"get"}}}) 
* @ORM\Entity() 
*/ 
class EntityWithFilteredCollection 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    * @Groups({"get"}) 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\FilteredCollectionRelatedEntity", mappedBy="relatedEntity") 
    */ 
    private $relatedEntities; 

    /** 
    * @Groups({"get"}) 
    */ 
    private $filteredEntities; 

    public function __construct() 
    { 
     $this->relatedEntities = new ArrayCollection(); 
    } 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function getRelatedEntities() 
    { 
     return $this->relatedEntities; 
    } 

    public function setRelatedEntities($relatedEntities) 
    { 
     $this->relatedEntities = $relatedEntities; 
    } 

    public function getFilteredEntities() 
    { 
     return $this->filteredEntities; 
    } 

    public function setFilteredEntities($filteredEntities) 
    { 
     $this->filteredEntities = $filteredEntities; 
    } 
} 

FilteredCollectionRelatedEntity

namespace AppBundle\Entity; 

use ApiPlatform\Core\Annotation\ApiResource; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Serializer\Annotation\Groups; 

/** 
* @ApiResource(attributes={"normalization_context"={"groups"={"get"}}}) 
* @ORM\Entity() 
*/ 
class FilteredCollectionRelatedEntity 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    * @Groups({"get"}) 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\RelatedEntity", inversedBy="relatedEntites") 
    */ 
    protected $relatedEntity; 

    /** 
    * @ORM\Column(type="integer") 
    * @Groups({"get"}) 
    */ 
    protected $value; 

    /** 
    * @ORM\Column(type="boolean") 
    * @Groups({"get"}) 
    */ 
    protected $condition; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function getRelatedEntity() 
    { 
     return $this->relatedEntity; 
    } 

    public function setRelatedEntity($relatedEntity) 
    { 
     $this->relatedEntity = $relatedEntity; 
    } 

    public function getValue() 
    { 
     return $this->value; 
    } 

    public function setValue($value) 
    { 
     $this->value = $value; 
    } 

    public function getCondition() 
    { 
     return $this->condition; 
    } 

    public function setCondition($condition) 
    { 
     $this->condition = $condition; 
    } 
} 

而且對於教義後裝載事件的事件訂閱:

namespace AppBundle\EventSubscriber; 


use AppBundle\Entity\EntityWithFilteredCollection; 
use AppBundle\Entity\FilteredCollectionRelatedEntity; 
use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; 

class FilterCollectionSubscriber implements EventSubscriber 
{ 
    /** @var RequestStack */ 
    private $requestStack; 

    public function __construct(TokenStorage $tokenStorage, RequestStack $requestStack) 
    { 
     $this->tokenStorage = $tokenStorage; 
     $this->requestStack = $requestStack; 
    } 


    public function postLoad(LifecycleEventArgs $event) 
    { 
     $entity = $event->getEntity(); 
     $method = $this->requestStack->getCurrentRequest()->getMethod(); 


     if (!$entity instanceof EntityWithFilteredCollection || Request::METHOD_GET !== $method) { 
      return; 
     } 

     $entity->setFilteredEntities($entity->getRelatedEntities()->filter(function (FilteredCollectionRelatedEntity $entity) { 
      return $entity->getCondition(); 
     })); 

    } 

    /** 
    * Returns an array of events this subscriber wants to listen to. 
    * 
    * @return array 
    */ 
    public function getSubscribedEvents() 
    { 
     return [ 
      'postLoad' 
     ]; 
    } 
} 

當我嘗試檢索一個EntityWithFilteredCollection h的具有設置爲true我得到下面的異常狀態值一些FilteredCollectionRelatedEntity實體:

No resource class found for object of type "AppBundle\Entity\FilteredCollectionRelatedEntity"

我是不是走錯了路?我錯過了什麼嗎? 當我不嘗試序列化過濾的集合,但它的工作原始,但我得到的所有實體。

回答