В 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