brendt/php-make-object

为 symfony/serializer 的 90% 用例提供的简单封装

0.5.0 2022-12-01 10:14 UTC

README

Latest Version on Packagist Tests Total Downloads

写这个

$post = make(Post::class)->from($postData);

而不是这个

$reflectionExtractor = new ReflectionExtractor();

$phpDocExtractor = new PhpDocExtractor();

$propertyTypeExtractor = new PropertyInfoExtractor(
    listExtractors: [$reflectionExtractor],
    typeExtractors: [$phpDocExtractor, $reflectionExtractor],
    descriptionExtractors: [$phpDocExtractor],
    accessExtractors: [$reflectionExtractor],
    initializableExtractors: [$reflectionExtractor]
);

$normalizer = new ObjectNormalizer(
    propertyTypeExtractor: $propertyTypeExtractor
);

$arrayNormalizer = new ArrayDenormalizer();

$serializer = new SymfonySerializer(
    normalizers: [
        $arrayNormalizer,
        $normalizer,
    ],
    encoders: [
        new XmlEncoder(),
        new JsonEncoder(),
    ],
);

$post = $serializer->denormalize($postData, Post::class)

安装

您可以通过 composer 安装此包

composer require brendt/php-make-object

用法

此包抽象化了使用 symfony/serializer 进行复杂反序列化所需的所有配置。您只需要说明您想要创建哪个类,提供一些输入(数组、JSON、XML、文件或对象),然后此包将处理其余部分。

额外优惠:正确的静态分析,因此您将知道创建了什么类型的对象。

$post = make(Post::class)->from($postData);

输入类型

数组

$post = make(Post::class)->from([
    'title' => 'test',
]);

JSON

$post = make(Post::class)->from(<<<JSON
    {
        "title": "test"
    }
JSON);

XML

$post = make(Post::class)->from(<<<XML
    <post>
        <title>test</title>
    </post>
XML);

文件

$post = make(Post::class)->from(__DIR__ . '/post.json');

Make 接口

Make 接口可以添加到任何类中,使该类能够提供用于创建对象的数据。

$post = make(Post::class)->from(new PostRequest());
final class PostRequest implements Makes
{
    public function data(): array
    {
        return [
            'title' => 'test',
        ];
    }
}

集合

$posts = make(Post::class)->fromCollection([
    ['title' => 'a'],
    ['title' => 'b'],
    ['title' => 'c'],
]);

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

致谢

许可协议

MIT 许可协议(MIT)。有关更多信息,请参阅 许可文件