Новое в Symfony 2.7: Сериализация Группы

Компонент 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

Добавить комментарий

Ваш адрес email не будет опубликован.

одиннадцать + 13 =