Компонент Symfony Serializer используется для перевод PHP объектов в определенный формат (XML, JSON, YAML, …) и обратно. Для того, чтобы сохранить эту простоту, мы этим ограничили функционал компонента, и именно поэтому это один из тех компонентов Symfony, которые практически не изменялись с момента публикации первой версии.
В Symfony 2.7 мы решили сломать эту традицию и мы представляем новую функцию для сериализации/десериализации различных наборов атрибутов объектов. Рассмотрим следующий объект, который включает в себя свойства, предназначенные для администраторов, аффилированных и обычных пользователей:
class Product { // this property is exclusive for administrators public $itemsSold; // this property is visible by administrators and affiliates public $commission; // this property is visible by all (administrators, affiliates, users) public $price; }
Определение сериализации можно задать с помощью аннотаций, XML или YAML. В случае использования аннотаций, определить сериализацию группы можно следующим образом:
use Symfony\Component\Serializer\Annotation\Groups; class Product { /** * @Groups({"admins"}) */ public $itemsSold; /** * @Groups({"admins", "affiliates"}) */ public $commission; /** * @Groups({"admins", "affiliates", "users"}) */ public $price; }
Теперь, когда сериализации группы были определены, можно сериализовать только те атрибуты, которые относятся к данной группе:
use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Doctrine\Common\Annotations\AnnotationReader; $product = new Product(); $product->itemsSold = 20; $product->commission = 7.5; $product->price = 19.99; $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); $normalizer = new PropertyNormalizer($classMetadataFactory); $serializer = new Serializer([$normalizer]); $data = $serializer->normalize($product, null, ['groups' => ['admins']]); // $data = ['itemsSold' => 20, 'commission' => 7.5, 'price' => 19.99]; $data = $serializer->normalize($product, null, ['groups' => ['affiliates']]); // $data = ['comission' => 7.5, 'price' => 19.99]; $data = $serializer->normalize($product, null, ['groups' => ['users']]); // $data = ['price' => 19.99]; $data = $serializer->normalize($product, null, ['groups' => ['affiliates', 'users']]); // $data = ['commission' => 7.5, 'price' => 19.99];
Кроме того, вы можете определить группы пользователей при десериализации содержимого:
use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Doctrine\Common\Annotations\AnnotationReader; $product = new Product(); $product->itemsSold = 20; $product->commission = 7.5; $product->price = 19.99; $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); $normalizer = new PropertyNormalizer($classMetadataFactory); $serializer = new Serializer(array($normalizer)); $product = $serializer->denormalize( ['itemsSold' => 20, 'price' => 19.99, 'commission' => 7.5], 'Product', null, ['groups' => ['affiliates', 'users']] ); // $product = Product(price: 19.99, commission: 7.5)
Источник: http://symfony.com/blog/new-in-symfony-2-7-serialization-groups