Skip to content

Commit 939cfc5

Browse files
committed
Update data_transformers.rst
Couple of changes.
1 parent 4b09b3f commit 939cfc5

File tree

1 file changed

+81
-43
lines changed

1 file changed

+81
-43
lines changed

cookbook/form/data_transformers.rst

Lines changed: 81 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ Creating the Transformer
2828
First, create an ``IssueToNumberTransformer`` class - this class will be responsible
2929
for converting to and from the issue number and the ``Issue`` object::
3030

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;
3333

34+
use AppBundle\Entity\Issue;
35+
use Doctrine\Common\Persistence\ObjectManager;
3436
use Symfony\Component\Form\DataTransformerInterface;
3537
use Symfony\Component\Form\Exception\TransformationFailedException;
36-
use Doctrine\Common\Persistence\ObjectManager;
37-
use Acme\TaskBundle\Entity\Issue;
3838

3939
class IssueToNumberTransformer implements DataTransformerInterface
4040
{
@@ -60,7 +60,7 @@ for converting to and from the issue number and the ``Issue`` object::
6060
public function transform($issue)
6161
{
6262
if (null === $issue) {
63-
return "";
63+
return '';
6464
}
6565

6666
return $issue->getNumber();
@@ -70,9 +70,7 @@ for converting to and from the issue number and the ``Issue`` object::
7070
* Transforms a string (number) to an object (issue).
7171
*
7272
* @param string $number
73-
*
7473
* @return Issue|null
75-
*
7674
* @throws TransformationFailedException if object (issue) is not found.
7775
*/
7876
public function reverseTransform($number)
@@ -82,7 +80,7 @@ for converting to and from the issue number and the ``Issue`` object::
8280
}
8381

8482
$issue = $this->om
85-
->getRepository('AcmeTaskBundle:Issue')
83+
->getRepository('AppBundle:Issue')
8684
->findOneBy(array('number' => $number))
8785
;
8886

@@ -112,13 +110,13 @@ Using the Transformer
112110
---------------------
113111

114112
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::
117115

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;
120118

121-
use Symfony\Bridge\Doctrine\ManagerRegistry;
119+
use Doctrine\Common\Persistence\ManagerRegistry;
122120

123121
class IssueToNumberTransformerFactory
124122
{
@@ -143,49 +141,65 @@ In order to achieve this we will add a factory::
143141
.. code-block:: yaml
144142
145143
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
148146
arguments: ["@doctrine"]
147+
public: false
149148
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 }
153154
154155
.. code-block:: xml
155156
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">
157159
<argument type="service" id="doctrine"/>
158160
</service>
159161
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"/>
162166
</service>
163167
164168
.. code-block:: php
165169
170+
use Symfony\Component\DependencyInjection\Definition;
171+
use Symfony\Component\DependencyInjection\Reference;
172+
// ...
173+
166174
$container
167-
->setDefinition('acme_demo.factory.issue_transformer', array(
175+
->setDefinition('app.issue_transformer_factory', new Definition(
176+
'AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory'
177+
), array(
168178
new Reference('doctrine'),
169179
))
180+
->setPublic(false)
170181
;
171182
172183
$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'),
175188
))
189+
->addTag('form.type', array('alias' => 'app_task'))
176190
;
177191
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
179193
just need to create it from your issue field in some form.
180194

181195
You can also use transformers without creating a new custom form type
182196
by calling ``addModelTransformer`` (or ``addViewTransformer`` - see
183197
`Model and View Transformers`_) on any field builder::
184198

185-
// src/Acme/TaskBundle/Form/TaskType.php
186-
namespace Acme\TaskBundle\Form;
199+
// src/AppBundle/Form/TaskType.php
200+
namespace AppBundle\Form;
187201

188-
use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
202+
use AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
189203
use Symfony\Component\Form\FormBuilderInterface;
190204
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
191205

@@ -215,7 +229,7 @@ by calling ``addModelTransformer`` (or ``addViewTransformer`` - see
215229
{
216230
$resolver
217231
->setDefaults(array(
218-
'data_class' => 'Acme\TaskBundle\Entity\Task',
232+
'data_class' => 'AppBundle\Entity\Task',
219233
))
220234
->setRequired(array('om'))
221235
;
@@ -226,8 +240,7 @@ This example requires that you pass in the entity manager as an option
226240
when creating your form. Later, you'll learn how you could create a custom
227241
``issue`` field type to avoid needing to do this in your controller::
228242

229-
$taskType = $this->get('acme_demo.type.task');
230-
$taskForm = $this->createForm($taskType, $task, array(
243+
$taskForm = $this->createForm('app_task', $task, array(
231244
'om' => 'default',
232245
));
233246

@@ -318,10 +331,10 @@ a form that uses the transformer.
318331
Because of these, you may choose to :doc:`create a custom field type </cookbook/form/create_custom_field_type>`.
319332
First, create the custom field type class::
320333

321-
// src/Acme/TaskBundle/Form/Type/IssueSelectorType.php
322-
namespace Acme\TaskBundle\Form\Type;
334+
// src/AppBundle/Form/IssueSelectorType.php
335+
namespace AppBundle\Form;
323336

324-
use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
337+
use AppBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
325338
use Symfony\Component\Form\AbstractType;
326339
use Symfony\Component\Form\FormBuilderInterface;
327340
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
@@ -368,24 +381,49 @@ it's recognized as a custom field type:
368381
.. code-block:: yaml
369382
370383
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"]
374391
tags:
375392
- { name: form.type, alias: issue_selector }
376393
377394
.. code-block:: xml
378395
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"/>
381404
<tag name="form.type" alias="issue_selector" />
382405
</service>
383406
384407
.. code-block:: php
385408
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+
386422
$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'),
389427
))
390428
->addTag('form.type', array(
391429
'alias' => 'issue_selector',
@@ -395,8 +433,8 @@ it's recognized as a custom field type:
395433
Now, whenever you need to use your special ``issue_selector`` field type,
396434
it's quite easy::
397435

398-
// src/Acme/TaskBundle/Form/Type/TaskType.php
399-
namespace Acme\TaskBundle\Form\Type;
436+
// src/AppBundle/Form/TaskType.php
437+
namespace AppBundle\Form;
400438

401439
use Symfony\Component\Form\AbstractType;
402440
use Symfony\Component\Form\FormBuilderInterface;

0 commit comments

Comments
 (0)