Как использовать transformer с формой типа объекта с помощью querybuilder

#forms #symfony #transformation

#формы #symfony #преобразование

Вопрос:

Вот некоторая форма, которую я создаю :

 $form_roles = $this->createFormBuilder($defaultData)
   ->add('roles', 'entity', array(
         'class' => 'MyBundle:Role',
         'query_builder' => function(EntityRepository $er) {
              return $er->createQueryBuilder('r')
                  ->orderBy('r.description', 'ASC');
          },
          'choice_label' => 'description',
          'label' => 'My roles'
     ))          
  ->getForm();
  

Поле описания, отображаемое в объекте роли, недостаточно хорошо, чтобы отображать его пользователям приложения. Итак, я хотел преобразовать его.
Я уже использовал transformers в классе AbstractType при создании querybuilder с каждым свойством, которое я хочу видеть, но никогда в типе объекта.

Итак, я создал класс RoleTransformer следующим образом :

 class RoleTransformer implements DataTransformerInterface {
  public function transform($entity) {
   $substitution_value = null;

   switch ($entity->getDescription()) {
       case 'ROLE_INPUT':
           $substitution_value = "the value I want to see for this role";
           break;
       case 'ROLE_VALIDATION':
           $substitution_value = "the value I want to see for this role";
           break;
       case 'ROLE_ADMIN':
           $substitution_value = "the value I want to see for this role";
           break;
       default:
           $substitution_value = "the value I want to see for this role";
    }

    return $substitution_value;
  }

  public function reverseTransform($substitution_value) {
     return substitution_value; //the form is not submitted, I have no interest in reverse transformation I think.
  }
}
  

В контроллере, где я создаю форму, я добавляю это :

$role_transformer = new RoleTransfomer() // не уверен, нужно ли мне что-то передавать или это делается фреймворком

и я добавляю в конструктор форм (перед -> getForm()):

 ->addModelTransformer($role_transformer)
  

Я думал, что у меня будет объект роли, переданный методу transform, но это массив, и, к сожалению, он пуст.

Я думаю, что я слишком далек от решения, кто-нибудь может мне помочь?

Спасибо.

Ответ №1:

Почему бы не взять эту логику и не ввести ее непосредственно в choice_label с помощью анонимной функции, как описано здесь:

http://symfony.com/doc/current/reference/forms/types/choice.html#choice-label

 'choice_label' => function ($value, $key, $index) {
    switch ($value) {  // This may actually be key depending on how you have it setup
       case 'ROLE_INPUT':
           $substitution_value = "the value I want to see for this role";
           break;
       case 'ROLE_VALIDATION':
           $substitution_value = "the value I want to see for this role";
           break;
       case 'ROLE_ADMIN':
           $substitution_value = "the value I want to see for this role";
           break;
       default:
           $substitution_value = "the value I want to see for this role";
    }
    return $substitution_value;
},