Я мог представить себе комбинацию виртуальной собственности и группы сериализации:
Добавьте свойство к своей сущности, например:
/**
* @Serializer\VirtualProperty
* @Serializer\SerializedName("permissions")
* @Serializer\Groups({"includePermissions"}) */
*
* @return string
*/
public function getPermissions()
{
return $permissionFinder->getPermissions($this);
}
Единственное, что вам нужно сделать, это сериализовать группу includePermissions только в вашем особом случае (см. http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies)
Если у вас нет доступа к $ permissionFinder от вашего объекта, вы также можете установить атрибут разрешения объекта из контроллера / службы перед его сериализацией.
ИЗМЕНИТЬ:
Это немного больше кода, чтобы продемонстрировать, что я имею в виду, оборачивая вашу сущность и используя VirtualProperty вместе с SerializationGroups. Этот код вообще не тестируется - это, по сути, вручную скопированная и удаленная версия того, что мы используем. Поэтому, пожалуйста, используйте это как идею!
1) Создайте что-то вроде класса упаковки для вашей сущности:
<?php
namespace Acquaim\ArcticBundle\Api;
use JMS\Serializer\Annotation as JMS;
/**
* Class MyEntityApi
*
* @package My\Package\Api
*/
class MyEntityApi
{
/**
* The entity which is wrapped
*
* @var MyEntity
* @JMS\Include()
*/
protected $entity;
protected $permissions;
/**
* @param MyEntity $entity
* @param Permission[] $permissions
*/
public function __construct(
MyEntity $entity,
$permissions = null)
{
$this->entity = $entity;
$this->permissions = $permissions;
}
/**
* @Serializer\VirtualProperty
* @Serializer\SerializedName("permissions")
* @Serializer\Groups({"includePermissions"})
*
* @return string
*/
public function getPermissions()
{
if ($this->permissions !== null && count($this->permissions) > 0) {
return $this->permissions;
} else {
return null;
}
}
/**
* @return object
*/
public function getEntity()
{
return $this->entity;
}
}
2) В вашем контроллере не возвращайте исходную сущность, а получите свои разрешения и создайте свой обернутый класс с сущностью и разрешениями. Задайте контекст сериализации, чтобы включить разрешения, и позвольте ViewHandler вернуть ваш сериализованный объект.
Если вы не установите для контекста сериализации значение includePermissions, он будет исключен из сериализованного результата.
YourController:
$myEntity = new Entity();
$permissions = $this->get('permission_service')->getPermissions();
$context = SerializationContext::create()->setGroups(array('includePermissions'));
$myEntityApi = new MyEntityApi($myEntity,$permissions);
$view = $this->view($myEntityApi, 200);
$view->setSerializationContext($context);
return $this->handleView($view);
person
LBA
schedule
13.11.2015