如何创建你的自定义Encoder

3.4 版本
维护中的版本

Serializer组件 使用了Normalizers来把任意数据转换成数组。然后再利用 Encoders 把数据转换成任意数据结构 (如 JSON)。

组件提供了几个内置的encoders,在 它们自己的章节 中有述,但你可能希望使用另一种不被支持的结构。

创建一个新的encoder 

假设你要对Yaml进行序列化和反序列化。因此你不得不使用 Yaml组件 来创建自己的encoders:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace AppBundle\Serializer;
 
use Symfony\Component\Serializer\Encoder\DecoderInterface;
use Symfony\Component\Serializer\Encoder\EncoderInterface;
use Symfony\Component\Yaml\Yaml;
 
class YamlEncoder implements EncoderInterface, DecoderInterface
{
    public function encode($data, $format, array $context = array())
    {
        return Yaml::dump($data);
    }
 
    public function supportsEncoding($format)
    {
        return 'yaml' === $format;
    }
 
    public function decode($data, $format, array $context = array())
    {
        return Yaml::parse($data);
    }
 
    public function supportsDecoding($format)
    {
        return 'yaml' === $format;
    }
}

把它注册到你的程序中 

如果你使用的是Symfony完整版框架,你可能希望在程序中把这个encoder注册为服务。那么,你只需给它打上 serializer.encoder 标签,即可将这个自定义的encoder注入到Serializer中。

1
2
3
4
5
6
# app/config/services.yml
services:
    app.yaml_encoder:
        class: AppBundle\Serializer\YamlEncoder
        tags:
            - { name: serializer.encoder }
1
2
3
4
5
6
7
8
9
10
11
12
<!-- app/config/services.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <services>
        <service id="app.yaml_encoder" class="AppBundle\Serializer\YamlEncoder">
            <tag name="serializer.encoder" />
        </service>
    </services>
</container>
1
2
3
4
5
6
7
// app/config/services.php
use AppBundle\Serializer\YamlEncoder;
 
$container
    ->register('app.yaml_encoder', YamlEncoder::class)
    ->addTag('serializer.encoder')
;

现在你已经可以序列化和反序列化Yaml了!

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)