Новое в Symfony 2.7: Улучшения компонентов сериализации

В Symfony 2.7, компонент Symfony Serializer был значительно улучшен и получил  большое количество новых функций. Эта статья представляет наиболее важные из них.

Поддержка сериализационных групп в  XML и YAML файлах

Несколько месяцев назад мы уже говорили об определении сериализационных групп с помощью аннотаций. Перед их использованием, вы должны только включить опцию конфигурации enable_annotations:

# app/config/services.yml
framework:
    # ...
    serializer: { enable_annotations: true }

Для тех из вас, кто не нравится аннотации, теперь вы можете определить сериализационные группы с помощью XML или YAML файлов. Компонент Serializer будет искать serialization.xml или serialization.yml файлы, расположенных в Resources/config/ каталоге ваших бандлов. Кроме того, он будет принимать любые XML или YAML файлы, расположенный внутри каталога Resources/config/serialization/.

Независимо от используемого формата конфигураций,  метаданные, порожденная этими группами сериализации можно кэшировать используя Doctrine кэш. Это обеспечит значительное улучшение производительности в приложении. Например, если ваш сервер обеспечивает поддержку APC или APCu, включить кэш сериализатора можно  следующей конфигурацией:

# app/config/config.yml
framework:
    serializer:
        cache: serializer.mapping.cache.apc

 Новый ObjectNormalizer

В Symfony 2.6 существует два типа нормализаторов: GetSetMethod  и PropertyNormalizer. Symfony 2.7 вводит новый нормализатор под названием ObjectNormalizer. Основное преимущество над основной GetSetMethodNormalizer является то, что он поддерживает защищенные и частные свойства, и даже свойства, которые определяют только методы геттеры / иссеры:

class MyObject
{
    public $foo = 'foo';

    public getBar()
    {
       return 'bar';
    }

    public isBaz()
    {
        return true;
    }
}

use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

$normalizer = new ObjectNormalizer();
$result = $normalizer->normalize(new MyObject());
// $result = ['foo' => 'foo', 'bar' => 'bar', 'baz' => true]

Для упрощения настройки, опции этого нового нормализатора, а также группы сериализации, включены по умолчанию в FrameworkBundle.

Возможность изменения названия свойств

GetSetMethod нормализатор обеспечивает основной механизм для настройки преобразования имени свойства в имени методов геттеров / сеттеров:

// ...
$normalizer = new GetSetMethodNormalizer();
$normalizer->setCamelizedAttributes(array('first_name'));

$serializer = new Serializer(array($normalizer), array($encoder));

Этот код указывает что своиство first_name  будет правильно преобразовано в метод getFirstName(), вместо неправильного метода getFirst_name().
В  2.7 метод setCamelizedAttributes() является устаревшим в и вместо него используется новый NameConverter(). Первый, оказавшийся доступным, конвертер имени преобразует сamel сase в snake case и наоборот:

use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

// ...
$nameConverter = new CamelCaseToSnakeCaseNameConverter(array('first_name'));
$normalizer = new GetSetMethodNormalizer(null, $nameConverter);
$serializer = new Serializer(array($normalizer), array($encoder));

Десериализация в существующий объект.

Как правило, необходимо создавать новые объекты, когда вы десериализуете информацию. Тем не менее, в Symfony 2.7 вы можете десериализовывать в существующий объект. Это может быть полезно, например, для обновления объекта полученого с помощью Doctrine ORM:

$existingProduct = $this->getDoctrine()->...

$product = $this->normalizer->denormalize(
    array('bar' => 'bar'),
    'AppBundle\\Entity\\Product',
    null,
    array('object_to_populate' => $existingProduct)
);

// $product and $existingProduct are references to the same object

 DunglasJsonLdApiBundle

Для того чтобы лучше продемонстрировать новые возможности компонента Serializer, Кевин разработала новый пакет под названием DunglasJsonLdApiBundle. Этот пакет позволяет создавать гипермедиа API, с JSON-LD и поддержки Hydra поверх компонента Serializer.

Источник: http://symfony.com/blog/new-in-symfony-2-7-serializer-component-improvements

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

восемь + два =