bernard/normalt

Normalt 是一个扩展到 Symfony Serializer 的库,它仅实现规范化部分

v1.2.0 2018-01-13 09:47 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:40:04 UTC


README

Build Status

Normalt 包含了与 Symfony 中的序列化组件一起使用的额外规范化器。它还实现了一个规范化代理,该代理将检查您想要规范化或反规范化的数据,并调用支持它的规范化器。

在 Normalt 的上下文中,规范化是将对象转换为数组的操作。反规范化是相反的方向(将数组转换为对象)。据我所知,这与 Symfony 序列化器使用的概念相同。

目录

入门

入门只需使用 Composer 需求库即可。

$ composer require bernard/normalt

规范化器

这些规范化器可以直接与序列化组件一起使用,也可以通过 AggregateNormalizer 使用。

AggregateNormalizer

AggregateNormalizer 是一个代理和聚合器,因为它聚合了多个规范化器和反规范化器,并将处理过程委托给它们。

它有一份规范化器和反规范化器的列表。它会询问这些列表中的每一个是否支持数据/对象,并使用找到的第一个。

它实现了完整序列化器的一部分,并且其唯一关注点是规范化到数组以及将数组反规范化为对象。这使得您可以专注于规范化,而不是将数据转换为特定格式,如 xmljson 等。

用法

您需要实例化规范化器以及您想要使用的规范化器/反规范化器列表。在这个例子中,我们使用 GetSetMethodNormalizer,这是 symfony 包中分发的一个。

这是我们将要使用的类。GetSetMethodNormalizer 使用获取器和设置器来完成其工作。

class User
{
    protected $name;

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

让我们再次进行规范化和反规范化。

use Normalt\Normalizer\AggregateNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

$aggregate = new AggregateNormalizer([new GetSetMethodNormalizer]);

$user = new User;
$user->setName('henrik');

$array = $aggregate->normalize($user);

// $array now contains ['name' => 'henrik']

$user = $aggregate->denormalize($array, 'User');
echo $user->getName(); // outputs Henrik

与该包中的其他规范化器相比,与序列化器一起使用这个没有意义,因为序列化器已经提供了大多数功能。

DoctrineNormalizer

DoctrineNormalizer 将映射对象(实体、文档等)规范化为数组,然后再将它们转换回对象。

它的用法非常简单。以下示例假设有一个映射对象 $user,并且您正在使用 doctrine orm(其他 doctrine 项目也可以使用)。

use Doctrine\ORM\EntityManager;
use Normalt\Normalizer\DoctrineNormalizer;

// create $entityManager
$normalizer = new DoctrineNormalizer($entityManager);

// assuming $user is a mapped object and have the identifier value of 10. the following will return
// array('MyModel\User', 10)
$array = $normalizer->normalize($user);

// using the same structure you can convert it back into a user
$user = $normalizer->denormalize($array, null);

RecursiveReflectionNormalizer

规范化器也像 AggregateNormalizer 一样进行代理,但它将为您正在规范化的对象中的每个属性进行代理。它通过递归来完成这项工作,因此如果规范化器不支持给定的属性并且它是数组,它将遍历该数组以查找更多的对象。

在反规范化时发生同样的情况,只是在循环之前,它将尝试找到一个支持属性结构的反规范化器。

使用方法与其他一样简单,以下示例使用 DoctrineNormalizer,并假设我们有一个包含对用户引用的 $profile 对象,其中 $profile->user

use Normalt\Normalizer\RecursiveReflectionNormalizer;
use Normalt\Normalizer\DoctrineNormalizer;

$normalizer = new RecursiveReflectionNormalizer([new DoctrineNormalizer($entityManager)]);

// following will return assuming User is mapped and has the identifier of 10
//['user' => ['MyModel\User', 10]]
$array = $normalizer->normalize($profile);

// converting it back into the object.
// $profile->user is now an instance of MyModel\User
$profile = $normalize->denormalize($array, 'MyModel\Profile');

许可证

请参阅包含的 LICENSE 文件。