@@ -28,13 +28,13 @@ Creating the Transformer
2828First, create an ``IssueToNumberTransformer `` class - this class will be responsible
2929for 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
114112As 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
179193just need to create it from your issue field in some form.
180194
181195You can also use transformers without creating a new custom form type
182196by 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
226240when 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.
318331Because of these, you may choose to :doc: `create a custom field type </cookbook/form/create_custom_field_type >`.
319332First, 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,
396434it'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