@@ -111,29 +111,96 @@ for converting to and from the issue number and the ``Issue`` object::
111111Using the Transformer
112112---------------------
113113
114- Now that you have the transformer built, you just need to add it to your
115- issue field in some form.
114+ 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:
117+
118+ // src/Acme/TaskBundle/Form/DataTransformer/IssueToNumberTransformerFactory.php
119+ namespace Acme\T askBundle\F orm\D ataTransformer;
120+
121+ use Symfony\B ridge\D octrine\M anagerRegistry;
122+
123+ class IssueToNumberTransformerFactory
124+ {
125+ /** @var ManagerRegistry */
126+ private $registry;
127+
128+ public function __construct(ManagerRegistry $registry)
129+ {
130+ $this->registry = $registry;
131+ }
132+
133+ public function create($om)
134+ {
135+ return new IssueToNumberTransformer($this->registry->getManager($om));
136+ }
137+ }
138+
139+ .. configuration-block ::
140+
141+ .. code-block :: yaml
142+
143+ services :
144+ acme_demo.factory.issue_transformer :
145+ class : Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory
146+ arguments : ["@doctrine"]
147+
148+ acme_demo.type.task :
149+ class : Acme\TaskBundle\Form\TaskType
150+ arguments : ["@acme_demo.factory.issue_transformer"]
151+
152+ .. code-block :: xml
153+
154+ <service id =" acme_demo.factory.issue_transformer" class =" Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory" >
155+ <argument type =" service" id =" doctrine" />
156+ </service >
157+
158+ <service id =" acme_demo.type.task" class =" Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory" >
159+ <argument type =" service" id =" acme_demo.factory.issue_transformer" />
160+ </service >
161+
162+ .. code-block :: php
163+
164+ $container
165+ ->setDefinition('acme_demo.factory.issue_transformer', array(
166+ new Reference('doctrine'),
167+ ))
168+ ;
169+
170+ $container
171+ ->setDefinition('acme_demo.type.task', array(
172+ new Reference('acme_demo.factory.issue_transformer'),
173+ ))
174+ ;
175+
176+ Now that you have capability to build the transformer with the desired object manager, you
177+ just need to create it from your issue field in some form.
116178
117179You can also use transformers without creating a new custom form type
118180by calling ``addModelTransformer `` (or ``addViewTransformer `` - see
119181`Model and View Transformers `_) on any field builder::
120182
183+ // src/Acme/TaskBundle/Form/TaskType.php
184+ namespace Acme\TaskBundle\Form;
185+
186+ use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
121187 use Symfony\Component\Form\FormBuilderInterface;
122- use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformer ;
188+ use Symfony\Component\OptionsResolver\OptionsResolverInterface ;
123189
124190 class TaskType extends AbstractType
125191 {
126- public function buildForm(FormBuilderInterface $builder, array $options)
192+ /** @var IssueToNumberTransformerFactory */
193+ private $factory;
194+
195+ public function __construct(IssueToNumberTransformerFactory $factory)
127196 {
128- // ...
197+ $this->factory = $factory;
198+ }
129199
130- // the "em" is an option that you pass when creating your form. Check out
131- // the 3rd argument to createForm in the next code block to see how this
132- // is passed to the form (also see setDefaultOptions).
133- $entityManager = $options['em'];
134- $transformer = new IssueToNumberTransformer($entityManager);
200+ public function buildForm(FormBuilderInterface $builder, array $options)
201+ {
202+ $transformer = $this->factory->create($options['om']);
135203
136- // add a normal text field, but add your transformer to it
137204 $builder->add(
138205 $builder->create('issue', 'text')
139206 ->addModelTransformer($transformer)
@@ -146,25 +213,18 @@ by calling ``addModelTransformer`` (or ``addViewTransformer`` - see
146213 ->setDefaults(array(
147214 'data_class' => 'Acme\TaskBundle\Entity\Task',
148215 ))
149- ->setRequired(array(
150- 'em',
151- ))
152- ->setAllowedTypes(array(
153- 'em' => 'Doctrine\Common\Persistence\ObjectManager',
154- ));
155-
156- // ...
216+ ->setRequired(array('om'))
217+ ;
157218 }
158-
159- // ...
160219 }
161220
162221This example requires that you pass in the entity manager as an option
163222when creating your form. Later, you'll learn how you could create a custom
164223``issue `` field type to avoid needing to do this in your controller::
165224
166- $taskForm = $this->createForm(new TaskType(), $task, array(
167- 'em' => $this->getDoctrine()->getManager(),
225+ $taskType = $this->get('acme_demo.type.task');
226+ $taskForm = $this->createForm($taskType, $task, array(
227+ 'om' => 'default',
168228 ));
169229
170230Cool, you're done! Your user will be able to enter an issue number into the
@@ -257,37 +317,31 @@ First, create the custom field type class::
257317 // src/Acme/TaskBundle/Form/Type/IssueSelectorType.php
258318 namespace Acme\TaskBundle\Form\Type;
259319
320+ use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
260321 use Symfony\Component\Form\AbstractType;
261322 use Symfony\Component\Form\FormBuilderInterface;
262- use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformer;
263- use Doctrine\Common\Persistence\ObjectManager;
264323 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
265324
266325 class IssueSelectorType extends AbstractType
267326 {
268- /**
269- * @var ObjectManager
270- */
271- private $om;
272-
273- /**
274- * @param ObjectManager $om
275- */
276- public function __construct(ObjectManager $om)
327+ private $factory;
328+
329+ public function __construct(IssueToNumberTransformerFactory $factory)
277330 {
278- $this->om = $om ;
331+ $this->factory = $factory ;
279332 }
280333
281334 public function buildForm(FormBuilderInterface $builder, array $options)
282335 {
283- $transformer = new IssueToNumberTransformer( $this->om );
336+ $transformer = $this->factory->create($options['om'] );
284337 $builder->addModelTransformer($transformer);
285338 }
286339
287340 public function setDefaultOptions(OptionsResolverInterface $resolver)
288341 {
289342 $resolver->setDefaults(array(
290343 'invalid_message' => 'The selected issue does not exist',
344+ 'om' => 'default'
291345 ));
292346 }
293347
0 commit comments