@@ -28,13 +28,13 @@ Creating the Transformer
28
28
First, create an ``IssueToNumberTransformer `` class - this class will be responsible
29
29
for converting to and from the issue number and the ``Issue `` object::
30
30
31
- // src/Acme/TaskBundle /Form/DataTransformer/IssueToNumberTransformer.php
32
- namespace Acme\TaskBundle \Form\DataTransformer;
31
+ // src/AppBundle /Form/DataTransformer/IssueToNumberTransformer.php
32
+ namespace AppBundle \Form\DataTransformer;
33
33
34
+ use AppBundle\Entity\Issue;
35
+ use Doctrine\Common\Persistence\ObjectManager;
34
36
use Symfony\Component\Form\DataTransformerInterface;
35
37
use Symfony\Component\Form\Exception\TransformationFailedException;
36
- use Doctrine\Common\Persistence\ObjectManager;
37
- use Acme\TaskBundle\Entity\Issue;
38
38
39
39
class IssueToNumberTransformer implements DataTransformerInterface
40
40
{
@@ -60,7 +60,7 @@ for converting to and from the issue number and the ``Issue`` object::
60
60
public function transform($issue)
61
61
{
62
62
if (null === $issue) {
63
- return "" ;
63
+ return '' ;
64
64
}
65
65
66
66
return $issue->getNumber();
@@ -70,9 +70,7 @@ for converting to and from the issue number and the ``Issue`` object::
70
70
* Transforms a string (number) to an object (issue).
71
71
*
72
72
* @param string $number
73
- *
74
73
* @return Issue|null
75
- *
76
74
* @throws TransformationFailedException if object (issue) is not found.
77
75
*/
78
76
public function reverseTransform($number)
@@ -82,7 +80,7 @@ for converting to and from the issue number and the ``Issue`` object::
82
80
}
83
81
84
82
$issue = $this->om
85
- ->getRepository('AcmeTaskBundle :Issue')
83
+ ->getRepository('AppBundle :Issue')
86
84
->findOneBy(array('number' => $number))
87
85
;
88
86
@@ -112,13 +110,13 @@ Using the Transformer
112
110
---------------------
113
111
114
112
As seen above our transformer requires an instance of an object manager. While for most
115
- use-cases using the default manager is fine we will let you pick the manager by it's name.
116
- In order to achieve this we will add a factory::
113
+ use-cases it is sufficient to use the default entity manager, you will sometimes need
114
+ to explicitly choose the one to use. To achieve this, you can use a factory::
117
115
118
- // src/Acme/TaskBundle /Form/DataTransformer/IssueToNumberTransformerFactory.php
119
- namespace Acme\TaskBundle \Form\DataTransformer;
116
+ // src/AppBundle /Form/DataTransformer/IssueToNumberTransformerFactory.php
117
+ namespace AppBundle \Form\DataTransformer;
120
118
121
- use Symfony\Bridge\Doctrine \ManagerRegistry;
119
+ use Doctrine\Common\Persistence \ManagerRegistry;
122
120
123
121
class IssueToNumberTransformerFactory
124
122
{
@@ -143,49 +141,65 @@ In order to achieve this we will add a factory::
143
141
.. code-block :: yaml
144
142
145
143
services :
146
- acme_demo.factory.issue_transformer :
147
- class : Acme\TaskBundle \Form\DataTransformer\IssueToNumberTransformerFactory
144
+ app.issue_transformer_factory :
145
+ class : AppBundle \Form\DataTransformer\IssueToNumberTransformerFactory
148
146
arguments : ["@doctrine"]
147
+ public : false
149
148
150
- acme_demo.type.task :
151
- class : Acme\TaskBundle\Form\TaskType
152
- arguments : ["@acme_demo.factory.issue_transformer"]
149
+ app.type.task :
150
+ class : AppBundle\Form\TaskType
151
+ arguments : ["@app.issue_transformer_factory"]
152
+ tag :
153
+ - { name: form.type, alias: app_task }
153
154
154
155
.. code-block :: xml
155
156
156
- <service id =" acme_demo.factory.issue_transformer" class =" Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory" >
157
+ <service id =" app.issue_transformer_factory"
158
+ class =" AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory" public =" false" >
157
159
<argument type =" service" id =" doctrine" />
158
160
</service >
159
161
160
- <service id =" acme_demo.type.task" class =" Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory" >
161
- <argument type =" service" id =" acme_demo.factory.issue_transformer" />
162
+ <service id =" app.type.task"
163
+ class =" AppBundle\Form\TaskType" >
164
+ <argument type =" service" id =" app.issue_transformer_factory" />
165
+ <tag name =" form.type" alias =" app_task" />
162
166
</service >
163
167
164
168
.. code-block :: php
165
169
170
+ use Symfony\Component\DependencyInjection\Definition;
171
+ use Symfony\Component\DependencyInjection\Reference;
172
+ // ...
173
+
166
174
$container
167
- ->setDefinition('acme_demo.factory.issue_transformer', array(
175
+ ->setDefinition('app.issue_transformer_factory', new Definition(
176
+ 'AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory'
177
+ ), array(
168
178
new Reference('doctrine'),
169
179
))
180
+ ->setPublic(false)
170
181
;
171
182
172
183
$container
173
- ->setDefinition('acme_demo.type.task', array(
174
- new Reference('acme_demo.factory.issue_transformer'),
184
+ ->setDefinition('app.type.task', new Definition(
185
+ 'AppBundle\Form\TaskType'
186
+ ), array(
187
+ new Reference('app.issue_transformer_factory'),
175
188
))
189
+ ->addTag('form.type', array('alias' => 'app_task'))
176
190
;
177
191
178
- Now that you have capability to build the transformer with the desired object manager, you
192
+ Now that you have the capability to build the transformer with the desired object manager, you
179
193
just need to create it from your issue field in some form.
180
194
181
195
You can also use transformers without creating a new custom form type
182
196
by calling ``addModelTransformer `` (or ``addViewTransformer `` - see
183
197
`Model and View Transformers `_) on any field builder::
184
198
185
- // src/Acme/TaskBundle /Form/TaskType.php
186
- namespace Acme\TaskBundle \Form;
199
+ // src/AppBundle /Form/TaskType.php
200
+ namespace AppBundle \Form;
187
201
188
- use Acme\TaskBundle \Form\DataTransformer\IssueToNumberTransformerFactory;
202
+ use AppBundle \Form\DataTransformer\IssueToNumberTransformerFactory;
189
203
use Symfony\Component\Form\FormBuilderInterface;
190
204
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
191
205
@@ -215,7 +229,7 @@ by calling ``addModelTransformer`` (or ``addViewTransformer`` - see
215
229
{
216
230
$resolver
217
231
->setDefaults(array(
218
- 'data_class' => 'Acme\TaskBundle \Entity\Task',
232
+ 'data_class' => 'AppBundle \Entity\Task',
219
233
))
220
234
->setRequired(array('om'))
221
235
;
@@ -226,8 +240,7 @@ This example requires that you pass in the entity manager as an option
226
240
when creating your form. Later, you'll learn how you could create a custom
227
241
``issue `` field type to avoid needing to do this in your controller::
228
242
229
- $taskType = $this->get('acme_demo.type.task');
230
- $taskForm = $this->createForm($taskType, $task, array(
243
+ $taskForm = $this->createForm('app_task', $task, array(
231
244
'om' => 'default',
232
245
));
233
246
@@ -318,10 +331,10 @@ a form that uses the transformer.
318
331
Because of these, you may choose to :doc: `create a custom field type </cookbook/form/create_custom_field_type >`.
319
332
First, create the custom field type class::
320
333
321
- // src/Acme/TaskBundle/ Form/Type /IssueSelectorType.php
322
- namespace Acme\TaskBundle\ Form\Type ;
334
+ // src/AppBundle/ Form/IssueSelectorType.php
335
+ namespace AppBundle\ Form;
323
336
324
- use Acme\TaskBundle \Form\DataTransformer\IssueToNumberTransformerFactory;
337
+ use AppBundle \Form\DataTransformer\IssueToNumberTransformerFactory;
325
338
use Symfony\Component\Form\AbstractType;
326
339
use Symfony\Component\Form\FormBuilderInterface;
327
340
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
@@ -368,24 +381,49 @@ it's recognized as a custom field type:
368
381
.. code-block :: yaml
369
382
370
383
services :
371
- acme_demo.type.issue_selector :
372
- class : Acme\TaskBundle\Form\Type\IssueSelectorType
373
- arguments : ["@doctrine.orm.entity_manager"]
384
+ app.issue_transformer_factory :
385
+ class : AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory
386
+ arguments : ["@doctrine"]
387
+ public : false
388
+ app.type.issue_selector :
389
+ class : AppBundle\Form\IssueSelectorType
390
+ arguments : ["@app.issue_transformer_factory"]
374
391
tags :
375
392
- { name: form.type, alias: issue_selector }
376
393
377
394
.. code-block :: xml
378
395
379
- <service id =" acme_demo.type.issue_selector" class =" Acme\TaskBundle\Form\Type\IssueSelectorType" >
380
- <argument type =" service" id =" doctrine.orm.entity_manager" />
396
+ <service id =" app.issue_transformer_factory"
397
+ class =" AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory" public =" false" >
398
+ <argument type =" service" id =" doctrine" />
399
+ </service >
400
+
401
+ <service id =" app.type.issue_selector"
402
+ class =" AppBundle\Form\IssueSelectorType" >
403
+ <argument type =" service" id =" app.issue_transformer_factory" />
381
404
<tag name =" form.type" alias =" issue_selector" />
382
405
</service >
383
406
384
407
.. code-block :: php
385
408
409
+ use Symfony\Component\DependencyInjection\Definition;
410
+ use Symfony\Component\DependencyInjection\Reference;
411
+ // ...
412
+
413
+ $container
414
+ ->setDefinition('app.issue_transformer_factory', new Definition(
415
+ 'AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory'
416
+ ), array(
417
+ new Reference('doctrine'),
418
+ ))
419
+ ->setPublic(false)
420
+ ;
421
+
386
422
$container
387
- ->setDefinition('acme_demo.type.issue_selector', array(
388
- new Reference('doctrine.orm.entity_manager'),
423
+ ->setDefinition('app.type.issue_selector', new Definition(
424
+ 'AppBundle\Form\IssueSelectorType'
425
+ ), array(
426
+ new Reference('app.issue_transformer_factory'),
389
427
))
390
428
->addTag('form.type', array(
391
429
'alias' => 'issue_selector',
@@ -395,8 +433,8 @@ it's recognized as a custom field type:
395
433
Now, whenever you need to use your special ``issue_selector `` field type,
396
434
it's quite easy::
397
435
398
- // src/Acme/TaskBundle/ Form/Type /TaskType.php
399
- namespace Acme\TaskBundle\ Form\Type ;
436
+ // src/AppBundle/ Form/TaskType.php
437
+ namespace AppBundle\ Form;
400
438
401
439
use Symfony\Component\Form\AbstractType;
402
440
use Symfony\Component\Form\FormBuilderInterface;
0 commit comments