@@ -122,29 +122,6 @@ The first parameter of the :method:`Symfony\\Component\\Serializer\\Serializer::
122
122
is the object to be serialized and the second is used to choose the proper encoder,
123
123
in this case :class: `Symfony\\ Component\\ Serializer\\ Encoder\\ JsonEncoder `.
124
124
125
- Ignoring Attributes when Serializing
126
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
-
128
- .. versionadded :: 2.3
129
- The :method: `GetSetMethodNormalizer::setIgnoredAttributes<Symfony\\ Component\\ Serializer\\ Normalizer\\ GetSetMethodNormalizer::setIgnoredAttributes> `
130
- method was introduced in Symfony 2.3.
131
-
132
- As an option, there's a way to ignore attributes from the origin object when
133
- serializing. To remove those attributes use the
134
- :method: `Symfony\\ Component\\ Serializer\\ Normalizer\\ GetSetMethodNormalizer::setIgnoredAttributes `
135
- method on the normalizer definition::
136
-
137
- use Symfony\Component\Serializer\Serializer;
138
- use Symfony\Component\Serializer\Encoder\JsonEncoder;
139
- use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
140
-
141
- $normalizer = new GetSetMethodNormalizer();
142
- $normalizer->setIgnoredAttributes(array('age'));
143
- $encoder = new JsonEncoder();
144
-
145
- $serializer = new Serializer(array($normalizer), array($encoder));
146
- $serializer->serialize($person, 'json'); // Output: {"name":"foo","sportsman":false}
147
-
148
125
Deserializing an Object
149
126
-----------------------
150
127
@@ -168,6 +145,168 @@ needs three parameters:
168
145
#. The name of the class this information will be decoded to
169
146
#. The encoder used to convert that information into an array
170
147
148
+ Attributes Groups
149
+ -----------------
150
+
151
+ .. versionadded :: 2.7
152
+ The support of serialization and deserialization groups was introduced
153
+ in Symfony 2.7.
154
+
155
+ Sometimes, you want to serialize different sets of attributes from your
156
+ entities. Groups are a handy way to achieve this need.
157
+
158
+ Assume you have the following plain-old-PHP object::
159
+
160
+ namespace Acme;
161
+
162
+ class MyObj
163
+ {
164
+ public $foo;
165
+
166
+ private $bar;
167
+
168
+ public function getBar()
169
+ {
170
+ return $this->bar;
171
+ }
172
+
173
+ public function setBar($bar)
174
+ {
175
+ return $this->bar = $bar;
176
+ }
177
+ }
178
+
179
+ The definition of serialization can be specified using annotations, XML
180
+ or YAML. The :class: `Symfony\\ Component\\ Serializer\\ Mapping\\ Factory\\ ClassMetadataFactory `
181
+ that will be used by the normalizer must be aware of the format to use.
182
+
183
+ Initialize the :class: `Symfony\\ Component\\ Serializer\\ Mapping\\ Factory\\ ClassMetadataFactory `
184
+ like the following::
185
+
186
+ use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
187
+ // For annotations
188
+ usr Doctrine\Common\Annotations\AnnotationReader;
189
+ use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
190
+ // For XML
191
+ // use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
192
+ // For YAML
193
+ // use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
194
+
195
+ $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
196
+ // For XML
197
+ // $classMetadataFactory = new ClassMetadataFactory(new XmlFileLoader('/path/to/your/definition.xml'));
198
+ // For YAML
199
+ // $classMetadataFactory = new ClassMetadataFactory(new YamlFileLoader('/path/to/your/definition.yml'));
200
+
201
+ Then, create your groups definition:
202
+
203
+ .. configuration-block ::
204
+
205
+ .. code-block :: php-annotations
206
+
207
+ namespace Acme;
208
+
209
+ use Symfony\Component\Serializer\Annotation\Groups;
210
+
211
+ class MyObj
212
+ {
213
+ /**
214
+ * @Groups({"group1", "group2"})
215
+ */
216
+ public $foo;
217
+
218
+ /**
219
+ * @Groups({"group3"})
220
+ */
221
+ public function getBar() // is* methods are also supported
222
+ {
223
+ return $this->bar;
224
+ }
225
+
226
+ // ...
227
+ }
228
+
229
+ .. code-block :: yaml
230
+
231
+ Acme\MyObj :
232
+ attributes :
233
+ foo :
234
+ groups : ['group1', 'group2']
235
+ bar :
236
+ groups : ['group3']
237
+
238
+ .. code-block :: xml
239
+
240
+ <?xml version =" 1.0" ?>
241
+ <serializer xmlns =" http://symfony.com/schema/dic/serializer-mapping"
242
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
243
+ xsi : schemaLocation =" http://symfony.com/schema/dic/serializer-mapping
244
+ http://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd"
245
+ >
246
+ <class name =" Acme\MyObj" >
247
+ <attribute name =" foo" >
248
+ <group >group1</group >
249
+ <group >group2</group >
250
+ </attribute >
251
+
252
+ <attribute name =" bar" >
253
+ <group >group3</group >
254
+ </attribute >
255
+ </class >
256
+ </serializer >
257
+
258
+ You are now able to serialize only attributes in the groups you want::
259
+
260
+ use Symfony\Component\Serializer\Serializer;
261
+ use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
262
+
263
+ $obj = new MyObj();
264
+ $obj->foo = 'foo';
265
+ $obj->setBar('bar');
266
+
267
+ $normalizer = new ObjectNormalizer($classMetadataFactory);
268
+ $serializer = new Serializer(array($normalizer));
269
+
270
+ $data = $serializer->normalize($obj, null, array('groups' => array('group1')));
271
+ // $data = ['foo' => 'foo'];
272
+
273
+ $obj2 = $serializer->denormalize(
274
+ array('foo' => 'foo', 'bar' => 'bar'),
275
+ 'MyObj',
276
+ null,
277
+ array('groups' => array('group1', 'group3'))
278
+ );
279
+ // $obj2 = MyObj(foo: 'foo', bar: 'bar')
280
+
281
+ .. _ignoring-attributes-when-serializing :
282
+
283
+ Ignoring Attributes
284
+ -------------------
285
+
286
+ .. versionadded :: 2.3
287
+ The :method: `Symfony\\ Component\\ Serializer\\ Normalizer\\ GetSetMethodNormalizer::setIgnoredAttributes `
288
+ method was introduced in Symfony 2.3.
289
+
290
+ .. versionadded :: 2.7
291
+ Prior to Symfony 2.7, attributes were only ignored while serializing. Since Symfony
292
+ 2.7, they are ignored when deserializing too.
293
+
294
+ As an option, there's a way to ignore attributes from the origin object. To remove
295
+ those attributes use the
296
+ :method: `Symfony\\ Component\\ Serializer\\ Normalizer\\ GetSetMethodNormalizer::setIgnoredAttributes `
297
+ method on the normalizer definition::
298
+
299
+ use Symfony\Component\Serializer\Serializer;
300
+ use Symfony\Component\Serializer\Encoder\JsonEncoder;
301
+ use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
302
+
303
+ $normalizer = new GetSetMethodNormalizer();
304
+ $normalizer->setIgnoredAttributes(array('age'));
305
+ $encoder = new JsonEncoder();
306
+
307
+ $serializer = new Serializer(array($normalizer), array($encoder));
308
+ $serializer->serialize($person, 'json'); // Output: {"name":"foo","sportsman":false}
309
+
171
310
Converting Property Names when Serializing and Deserializing
172
311
------------------------------------------------------------
173
312
@@ -434,14 +573,10 @@ having unique identifiers::
434
573
echo $serializer->serialize($org, 'json');
435
574
// {"name":"Les-Tilleuls.coop","members":[{"name":"K\u00e9vin", organization: "Les-Tilleuls.coop"}]}
436
575
437
- JMSSerializer
438
- -------------
576
+ .. seealso ::
439
577
440
- A popular third-party library, `JMS serializer `_, provides a more
441
- sophisticated albeit more complex solution. This library includes the
442
- ability to configure how your objects should be serialized/deserialized via
443
- annotations (as well as YAML, XML and PHP), integration with the Doctrine ORM,
444
- and handling of other complex cases.
578
+ A popular alternative to the Symfony Serializer Component is the third-party
579
+ library, `JMS serializer `_ (released under the Apache license, so incompatible with GPLv2 projects).
445
580
446
581
.. _`JMS serializer` : https://github.com/schmittjoh/serializer
447
582
.. _Packagist : https://packagist.org/packages/symfony/serializer
0 commit comments