如何使用序列化(Serializer)
一個物件和不同格式(例如JSON或XML)之間的序列化和反序列化是一個非常複雜的議題。 Symfony自帶了一個 Serializer元件,給你提供了一些工具,可以隨需利用。
實際上,在你開始使用之前,先熟悉一下serializer,normalizer和encoder,閱讀 Serializer元件 一文。
啟動Serializer ¶
serializer
服務預設不可用。要開啟它,在你的設定檔中啟動它:
PHP:// app/config/config.php$container->loadFromExtension('framework', array( // ... 'serializer' => array( 'enabled' => true, ),));
XML:<!-- app/config/config.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" xmlns:framework="http://symfony.com/schema/dic/symfony" xmlns:twig="http://symfony.com/schema/dic/twig" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd http://symfony.com/schema/dic/twig http://symfony.com/schema/dic/twig/twig-1.0.xsd"> <framework:config> <!-- ... --> <framework:serializer enabled="true" /> </framework:config></container>
YAML:# app/config/config.ymlframework: # ... serializer: enabled: true
使用Serializer服務 ¶
一旦開啟,serializer
服務可以在你需要它時注入到任何服務中,或者像下面這樣在控制器中使用:
// src/AppBundle/Controller/DefaultController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller{ public function indexAction() { $serializer = $this->get('serializer'); // ... }}
添加Normalizers和Encoders ¶
#被開啟之後, serializer
在容器中可用,被載入時還帶有兩個encoders(JsonEncoder
和XmlEncoder
)以及ObjectNormalizer normalizer。
你可以載入normalizers和/或encoders,只要給它們打上 serializer.normalizer 和 serializer.encoder 標籤。也可以設定標籤的優先級,以便決定符合順序。
下例示範如何載入 GetSetMethodNormalizer
:
PHP:// app/config/services.phpuse Symfony\Component\DependencyInjection\Definition; $definition = new Definition( 'Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer'));$definition->setPublic(false);$definition->addTag('serializer.normalizer');$container->setDefinition('get_set_method_normalizer', $definition);
XML:<!-- app/config/services.xml --><services> <service id="get_set_method_normalizer" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer" public="false"> <tag name="serializer.normalizer" /> </service></services>
YAML:# app/config/services.ymlservices: get_set_method_normalizer: class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer public: false tags: - { name: serializer.normalizer }
使用序列化的群組Annotations ¶
透過以下配置來開啟序列化群組註解:
PHP:// app/config/config.php$container->loadFromExtension('framework', array( // ... 'serializer' => array( 'enable_annotations' => true, ),));
XML:<!-- app/config/config.xml --><framework:config> <!-- ... --> <framework:serializer enable-annotations="true" /></framework:config>
YAML:# app/config/config.ymlframework: # ... serializer: enable_annotations: true
接下來,加入@Goups annotations 到你的類別中,然後在序列化時,選擇要使用哪個群組:
$serializer = $this->get('serializer');$json = $serializer->serialize( $someObject, 'json', array('groups' => array('group1')));
除了 @Groups
註釋, serializer組件也支援Yaml或Xml檔案。這些元件在存放於下列位置時會自動載入:
存放在bundle下方的
或Resources/config/
##存放在bundle下方的
Resources/config/目錄中的
serialization .yml serialization.xml- ;
和所有存放在bundle下方的
Resources/config/serialization/目錄中的所有
*.yml *.xml
開啟Metadata快取
¶
Doctrine\Common\Cache\Cache 介面的服務都可以被使用。
一個利用了APCu 的服務被內建在框架中:PHP:// app/config/config_prod.php$container->loadFromExtension('framework', array(
// ...
'serializer' => array(
'cache' => 'serializer.mapping.cache.apc',
),));
XML:<!-- app/config/config_prod.xml --><framework:config>
<!-- ... -->
<framework:serializer cache="serializer.mapping.cache.apc" /></framework:config>
YAML:# app/config/config_prod.ymlframework: # ...
serializer:
cache: serializer.mapping.cache.apc
開啟一個命名轉換器 2.8
選項從Symfony 2.8開始被引入。 要使用 name converter
服務,可以在設定檔中使用name_converter選項進行定義。 內建的
CamelCase to snake_case name converter
PHP:// app/config/config.php$container->loadFromExtension('framework', array( // ... 'serializer' => array( 'name_converter' => 'serializer.name_converter.camel_case_to_snake_case, ), ));
XML:<!-- app/config/config.xml --><framework:config> <!-- ... --> <framework:serializer name-converter="serializer.name_converter.camel_case_to_snake_case" /></framework:config>###
YAML:# app/config/config.ymlframework: # ... serializer: name_converter: 'serializer.name_converter.camel_case_to_snake_case'###
深入Serializer ¶
ApiPlatform 提供了一個API系統,它支援JSON-LD 和Hydra Core Vocabulary hypermedia格式。它是基於Symfony框架和Serializer組件而構建的。它提供了自訂的normalizers,一個自訂的encoder,自訂的metadata以及一個快取系統。
如果你希望利用好Symfony Serializer組件的全部威力,應該看看這個bundle是如何運作的。