Трансформатор Symfony2 не может преобразовать
Привет, ребята, я пытаюсь сделать форму FloorType, которая имеет скрытое поле объекта (который строит), и я не могу преобразовать объектную сущность, у меня есть, используя код преобразования из поваренной книги.
http://symfony.com/doc/2.7/cookbook/form/data_transformers.html
Вот код:
Трансформатор
namespace George\FloorBundle\Form\DataTransformer;
use George\ObjectsBundle\Entity\Object;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
class ObjectToNumberTransformer implements DataTransformerInterface
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* Transforms an object (issue) to a string (number).
*
* @param Object|null $issue
* @return string
*/
public function transform($object)
{
if (null === $object) {
return '';
}
return $object->getId();
}
/**
* Transforms a string (number) to an object (issue).
*
* @return Object|null
* @throws TransformationFailedException if object (issue) is not found.
*/
public function reverseTransform($objectNumber)
{
// no issue number? It's optional, so that's ok
if (!$objectNumber) {
return;
}
$object= $this->manager
->getRepository('ObjectsBundle:Object')
// query for the issue with this id
->find($objectNumber)
;
if (null === $object) {
// causes a validation error
// this message is not shown to the user
// see the invalid_message option
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$objectNumber
));
}
return $object;
}
}
Тип пола
namespace George\FloorBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use George\FloorBundle\Form\DataTransformer\ObjectToNumberTransformer;
use Doctrine\Common\Persistence\ObjectManager;
class FloorType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('translations', 'a2lix_translations',array(
'required_locales' => array('bg','en')
))
->add('object')->addModelTransformer(new ObjectToNumberTransformer($this->manager));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'George\FloorBundle\Entity\Floor'
));
}
/**
* @return string
*/
public function getName()
{
return 'george_floorbundle_floor';
}
}
CreateCreteForm
private function createCreateForm(Floor $entity)
{
$manager = $this->getDoctrine()->getManager();
$form = $this->createForm(new FloorType($manager), $entity, array(
'action' => $this->generateUrl('admin_floor_create'),
'method' => 'POST',
));
$form->add('submit', 'submit', array('label' => 'Create'));
return $form;
}
обслуживание
<services>
<service id="app.form.type.task" class="George\FloorBundle\Form\FloorType">
<tag name="form.type" />
<argument type="service" id="doctrine.orm.entity_manager"></argument>
</service>
</services>
И большая жирная ошибка:
Catchable Fatal Error: Object of class George\ObjectsBundle\Entity\Object could not be converted to string
Интересно, что сервис не работает, мне нужно положить в форму создания менеджера:
$manager = $this->getDoctrine()->getManager();
Итак, я понимаю, что трансформатор выходит из строя, но я не вижу, где... Может ли кто-нибудь помочь мне с этим преобразованием?
3 ответа
Вы должны использовать это
$builder
->add('translations', 'a2lix_translations',array(
'required_locales' => array('bg','en')
))
->add('object');
$builder->get('object')->addModelTransformer(new ObjectToNumberTransformer($this->manager));
вместо
$builder
->add('translations', 'a2lix_translations',array(
'required_locales' => array('bg','en')
))
->add('object')->addModelTransformer(new ObjectToNumberTransformer($this->manager));
Надеюсь, поможет!!
Ваш синтаксис немного отключен. $builder->add фактически возвращает объект построителя, а не объект формы, который был добавлен. Книга показывает:
$builder->add(
$builder->create('description', 'textarea')
->addModelTransformer(...)
);
В вашем случае это будет что-то вроде:
$builder
->add('translations', 'a2lix_translations',array(
'required_locales' => array('bg','en')
))
->add(
$builder->create('object','text')
->addModelTransformer(new ObjectToNumberTransformer($this->manager))
));
Может быть, запутались парены, но вы поняли.
Второй проблемой было использование псевдонима в сервисе:
<services>
<service id="app.form.type.floor" class="George\FloorBundle\Form\FloorType">
<tag name="form.type" alias="george_floorbundle_floor" />
<argument type="service" id="doctrine.orm.entity_manager"></argument>
</service>
</services>
И где я создаю форму:
$form = $this->createForm('george_floorbundle_floor', $entity, array(
'action' => $this->generateUrl('admin_floor_update', array('id' => $entity->getId())),
'method' => 'PUT',
));