hexium-agency/symfony-serializer-for-laravel

Laravel 包用于 symfony/serializer 组件

v0.0.6 2024-05-15 06:26 UTC

This package is auto-updated.

Last update: 2024-09-08 16:47:09 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

symfony/serializer 组件是一个出色的对象序列化和反序列化工具。此包在 Laravel 和 symfony/serializer 组件之间提供了一个桥梁。然后它应该很容易与您的应用程序代码中的 DI 一起使用,以及添加一些规范化和编码器。

安装

您可以通过 composer 安装此包

composer require hexium-agency/symfony-serializer-for-laravel

您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="symfony-serializer-for-laravel-config"

这是发布配置文件的内容

<?php

/**
 * @return array{
 *     normalizers: array<array{id: string, priority?: int}>,
 *     encoders: array<array{id: string, priority?: int}>,
 *     list_extractors: array<array{id: string, priority?: int}>,
 *     type_extractors: array<array{id: string, priority?: int}>,
 *     access_extractors: array<array{id: string, priority?: int}>,
 *     initializable_extractors: array<array{id: string, priority?: int}>,
 *     defaultContext: array<string, mixed>
 * }
 */
return [
    'normalizers' => [
        [
            'id' => 'serializer.normalizer.datetimezone',
            'priority' => -915,
        ],
        [
            'id' => 'serializer.normalizer.dateinterval',
            'priority' => -915,
        ],
        [
            'id' => 'serializer.normalizer.datetime',
            'priority' => -910,
        ],
        [
            'id' => 'serializer.normalizer.json_serializable',
            'priority' => -950,
        ],
        [
            'id' => 'serializer.denormalizer.unwrapping',
            'priority' => 1000,
        ],
        [
            'id' => 'serializer.normalizer.uid',
            'priority' => -890,
        ],
        [
            'id' => 'serializer.normalizer.object',
            'priority' => -1000,
        ],
        [
            'id' => 'serializer.denormalizer.array',
            'priority' => -990,
        ],
        [
            'id' => 'serializer.normalizer.backed_enum',
            'priority' => -915,
        ],
    ],
    'encoders' => [
        [
            'id' => 'serializer.encoder.xml',
        ],
        [
            'id' => 'serializer.encoder.json',
        ],
        [
            'id' => 'serializer.encoder.yaml',
        ],
        [
            'id' => 'serializer.encoder.csv',
        ],
    ],
    'list_extractors' => [
        [
            'id' => 'property_info.reflection_extractor',
            'priority' => -1000,
        ],
        [
            'id' => 'property_info.serializer_extractor',
            'priority' => -999,
        ],
    ],
    'type_extractors' => [
        [
            'id' => 'property_info.php_doc_extractor',
            'priority' => -990,
        ],
        [
            'id' => 'property_info.reflection_extractor',
            'priority' => -1002,
        ],
    ],
    'access_extractors' => [
        [
            'id' => 'property_info.reflection_extractor',
            'priority' => -1000,
        ],
    ],
    'initializable_extractors' => [
        [
            'id' => 'property_info.reflection_extractor',
            'priority' => -1000,
        ],
    ],
];

用法

正常依赖注入

class SendDiscordNotification {
    private SerializerInterface $serializer;
    private HttpClientInterface $httpClient;
    private string $webhookUrl;
    
    public function __construct(SerializerInterface $serializer, HttpClientInterface $httpClient, string $webhookUrl) {
        $this->serializer = $serializer;
        $this->httpClient = $httpClient;
        $this->webhookUrl = $webhookUrl;
    }
    
    public function __invoke(DiscordNotification $notification) {
        $data = $this->serializer->serialize($notification, 'json');
        
        $this->httpClient->request('POST', $this->webhookUrl, [
            'body' => $data,
        ]);
    }
}
class DiscordNotificationParser {
    private SerializerInterface $serializer;
    
    public function __construct(SerializerInterface $serializer) {
        $this->serializer = $serializer;
    }
    
    public function parse(string $data): DiscordNotification {
        return $this->serializer->deserialize($data, DiscordNotification::class, 'json');
    }
}

使用外观

use HexiumAgency\SymfonySerializerForLaravel\Facades\Serializer;

class DiscordNotificationParser {
    public function parse(string $data): DiscordNotification {
        return Serializer::deserialize($data, DiscordNotification::class, 'json');
    }
}

添加规范化和编码器

您可以通过将它们添加到配置文件来向序列化器添加规范化和编码器。优先级用于对规范化和编码器进行排序。服务 ID 必须与您的容器中的某些 ID 匹配。

测试

composer test

更新日志

有关最近更改的更多信息,请参阅 更新日志

贡献

有关详细信息,请参阅 贡献

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅 我们的安全策略

鸣谢

许可证

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