Symfony - ожидаемое значение типа Entity для поля ассоциации получило вместо «string» - PullRequest
0 голосов
/ 11 июля 2019

У меня есть UserEntity , содержащая адреса электронной почты пользователей и их пароль.Затем UserInstanceEntity , который содержит номера телефонов пользователей, а также отношение ManyToOne для PreferredContactEntity , которое позволяет пользователю выбирать метод контакта, который он предпочитает.

Я хочукогда пользователь меняет свой профиль, он также может изменить свои номера телефонов и предпочитаемый метод связи.Поэтому в моем контроллере я вставил UserType и UserInstanceType .

Когда я отправляю форму, я получаю сообщение об ошибке:

Ожидаемое значениетипа "App \ Entity \ PreferredContact" для поля связи "App \ Entity \ UserInstance # $ предпочитаемый контакт", вместо этого получено "string".

UserEntity:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use App\Validator\Constraints as AssertPerso;
use DateTime;
use DateTimeInterface;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="app_user")
 * @ORM\HasLifecycleCallbacks()
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     * @AssertPerso\Email
     */
    private $email;

    /**
     * @ORM\Column(type="array")
     */
    private $roles = [];

    /**
     * @var string plain password
     */
    private $plainPassword;

    /**
     * @ORM\Column(type="boolean")
     */
    private $enabled;

    /**
     * @var string The hashed password
     * @ORM\Column(type="string")
     */
    private $password;
...

UserInstanceEntity:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserInstanceRepository")
 * @ORM\Table(name="app_user_instance")
 */
class UserInstance
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

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

    /**
     * @var string
     *
     * @ORM\Column(type="string", nullable=true)
     */
    private $directContactNumber;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\PreferredContact")
     * @ORM\JoinColumn(nullable=false)
     */
    private $preferredContact;

PreferredContactEntity:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PreferredContactRepository")
 * @ORM\Table(name="app_user_preferred_contact")
 */
class PreferredContact
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=180, unique=true)
     */
    private $contact;

Таблица PreferredContact:

id    contact
1      Mail
2      Phone
3      Webex Teams

UserController:

public function editProfil(Request $request): Response
{
    $user = $this->getUser();
    $userInstance = new UserInstance();

    $form = $this->createForm(EditProfilType::class, $user);
    $formUserInstance = $this->createForm(UserInstanceType::class, $userInstance);

    $form->handleRequest($request);
    $formUserInstance->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid() && $formUserInstance->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($userInstance);
        $entityManager->flush();

        $this->addFlash('success', 'Informations mises à jour avec succès !');

        return $this->redirectToRoute('user_editprofil');
    }

    return $this->render($this->ticketingTemplates['edit_profil'], [
        'user' => $user,
        'form' => $form->createView(),
        'formUserInstance' => $formUserInstance->createView(),
    ]);
}

UserType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
        $builder
            ->add('email', null, array(
                    'label'    => 'Email',
                    'required' => true)
            )
            ->add('plainPassword',PasswordType::class,  array(
                    'label'    => 'Mot de passe',
                    'required' => true,
                    'constraints' => [
                        new Length([
                            'min' => 6,
                            'minMessage' => '{{ limit }} caractères minimum',
                            'max' => 4096,
                        ]),
                    ],
                    )
            )
            ->add('roles', RolesType::class);

UserInstanceType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

         ->add('contactNumber', null, array(
             'label'    => 'Numéro de téléphone portable',
             'required' => true,
         ))

        ->add('directContactNumber', null, array(
            'label'    => 'Numéro de ligne direct'), [
            'required'   => false,
            'help'     => 'Facultatif',
        ])

       ->add('preferredContact', EntityType::class, [
           'class' => PreferredContact::class,
           'label' => 'Méthode de contact préférée',
       ]);

editprofil.html.twig:

<form method="post" >
    <fieldset>
        <legend><i class="fa fa-lock" aria-hidden="true"></i> {{ 'Votre compte' }}</legend>
        {{ form_start(form) }}
        {{ form_widget(form) }}
        {{ form_start(formUserInstance) }}
        {{ form_widget(formUserInstance) }}
        {{ form_end(formUserInstance) }}
        <button type="submit" class="btn btn-primary">
            <i class="fa fa-save" aria-hidden="true"></i> {{ 'Enregistrer' }}
        </button>
        <a href="{{ path('user_change_password') }}" class="btn btn-danger">
            <i class="fa fa-lock" aria-hidden="true"></i> {{ 'Modifier le mot de passe' }}
        </a>
        {{ form_end(form) }}

    </fieldset>
</form>

Знаете ли вы, откуда возникает эта ошибка?Спасибо


Редактировать:

EditProfilType:

class EditProfilType extends AbstractType
{
    private $securityChecker;
    private $token;

    public function __construct(AuthorizationCheckerInterface $securityChecker, TokenStorageInterface $token)
    {
        $this->securityChecker = $securityChecker;
        $this->token = $token;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
            $builder
                ->add('email', null, array(
                        'label'    => 'Email  ',
                        'required' => true
                    )
                )
                ->add('firstName', null, array(
                        'label'    => 'Prénom',
                        'required' => true)
                )
                ->add('lastName', null, array(
                        'label'    => 'Nom',
                        'required' => true)
                );

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'data_class' => User::class,
            ]
        );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...