TransformationFailedException, когда сущность передается в форму - PullRequest
0 голосов
/ 26 апреля 2018

Я использую Symfony 3.3 и получаю эту ошибку TransformationFailedException при загрузке страницы моего профиля:

Невозможно преобразовать значение для пути свойства "почтовый индекс": ожидается числовое значение.

Значение почтового индекса для этого пользователя в базе данных:

34125abc '

Атрибут почтового индекса, определенный в объекте UserProfile:

/**
 * @ORM\Column(type="string")
 */
 private $postalcode;

Мой профильКонтроллер:

class ProfileController extends Controller{

    /**
     * @Route("/edit_profile", name="edit_profile")
     */
    public function profileAction(Request $request){

        $profile = $this->getDoctrine()->getManager()->getRepository('AppBundle:UserProfile')->findOneBy(['user_id' => $this->getUser()->getUserId()]);

        // If no UserProfile exists, create a UserProfile Object to insert it into database after POST
        if(null === $profile){
            $profile = new UserProfile();
            $profile->setUserId($this->getUser()->getUserId());
        }

        $form = $this->createForm(EditProfileFormType::class);
        $form->setData($profile);

        // only handles data on POST
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {

            $result = $this->forward('AppBundle:API\User\Profile:update_profile', array(
                'profile'  => $profile
            ));

            if(200 === $result->getStatusCode()){
                $this->addFlash('success', "Profile successfully created!");
            }
        }

        return $this->render(':User/Profile:edit_profile.html.twig', [
            'EditProfileForm' => $form->createView(),
        ]);
    }
}

Мой EditProfileFormType:

class EditProfileFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', ChoiceType::class, array(
                'choices' => array(
                    'Mr' => 'Mr',
                    'Mrs' => 'Mrs'
                )
            ))
            ->add('firstName')
            ->add('lastName')
            ->add('street')
            ->add('postalcode', NumberType::class)
            ->add('city')
            ->add('telephone')
            ->add('mobile')
            ->add('company')
            ->add('birthday' , BirthdayType::class)
            ->add('callback', CheckboxType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
           'data_class' => 'AppBundle\Entity\UserProfile',
            'validation_groups' => array('edit_profile')
        ]);
    }

    public function getBlockPrefix()
    {
        return 'app_bundle_edit_profile_form_type';
    }
}

Таким образом, проблема здесь заключается в не числовом значении строки в базе данных

'34125abc'

, который хранится в объекте сущности $profile и передается в форму с помощью $form->setData($profile); Так, когда данные устанавливаются, выдается ошибка из-за Numbertype в этой строке ->add('postalcode', NumberType::class). Есть ли способ передать значение почтового индекса в форму, даже если оно не числовое, и проверять только тип номера при отправке формы? Потому что мне не нужна проверка, когда я передаю данные в форму. Как раз, когда это отправлено.

1 Ответ

0 голосов
/ 27 апреля 2018

Решение было довольно простым, но трудно найти. Я изменил

-> add ('postalcode', NumberType :: class)

на

-> add ('почтовый индекс', TextType :: class)

в моем EditProfileFormType.php.

Почему?
Потому что построителю форм просто нужно знать тип поля в базе данных.В данном случае это не должно волновать, числовое оно или нет, потому что это задача ограничения модели.В данном случае это строка , поэтому в форме это Texttype .Все типы форм применяются, когда форма установлена, но группы проверки просто проверяются, когда форма отправлена!Именно так и должно быть!

...