Если вы хотите, чтобы ваш процесс сериализации был явным, вы можете зарегистрировать свой собственный нормализатор, как это следует в сервисах definition
AppBundle\Serializer\Your\MyObjectNormalizer:
tags:
- { name: serializer.normalizer }
Вы можете объявить нормализатор, как следует
namespace AppBundle\Serializer\Your;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class MyObjectNormalizer implements NormalizerInterface
{
public function normalize($object, $format = null, array $context = [])
{
// $object is an instance of MyObject
$groups = array_key_exists('groups', $context) ? $context['groups'] : [];
$data = [
'name' => $object->getName()
// ..........
];
if(array_key_exists('full', $groups)) {
$data['owner'] = $object->getOwner()->getFullName();
}
return $data;
}
/**
* Checks whether the given class is supported for normalization by this normalizer.
*
* @param mixed $data Data to normalize
* @param string $format The format being (de-)serialized from or into
*
* @return bool
*/
public function supportsNormalization($data, $format = null)
{
return $data instanceof MyObject;
}
}
Если вы будете действовать как следует, Symfony увидит, что вы объявили пользовательский нормализатор для такого типа объектов. Таким образом, он примет ваш класс в первую очередь, чтобы нормализовать MyObject
Вы можете нормализовать данные из массива контекста
$myobject = new MyObject();
$fullObj = $this->container->get('serializer')->serialize($myobject, 'json', ['full']);
$lightObj = $this->container->get('serializer')->serialize($myobject, 'json');
// $fullObj is ['name' => 'someName', 'owner' => 'ownerName'];
// $lightObj is ['name' => 'someName'];
Взгляните на эту часть документации