Symfony 2 persit data to one table with relationships

Symfony 2 persit data to one table with relationships

我尝试在提交包含有效数据的表单后将记录保存在数据库中,但出现下一个错误:

Expected value of type "AppBundle\Entity\Gender" for association field "AppBundle\Entity\Usuario#$gender", got "string" instead.

我想在 Usuario 中保存一条记录 table 但我不明白为什么它不能这样工作。

我的实体是:

Usuario.php

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;

/**
* @ORM\Entity
* @ORM\Table(name="usuario")
*/
class Usuario implements UserInterface, \Serializable
{
/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(name="name", type="string")
 * @Assert\NotBlank()
 */
protected $name;

/**
 * @ORM\Column(name="lastName", type="string")
 * @Assert\NotBlank()
 */
protected $lastName;

/**
 * @ORM\Column(name="email", type="string", unique=true)
 * @Assert\Email()
 * @Assert\NotBlank()
 */
protected $email;

/**
 * @ORM\Column(name="password", type="string")
 * @Assert\NotBlank()
 */
protected $password;

/**
 * @ORM\Column(name="playingLevel", type="integer")
 * @Assert\NotBlank(message = "Choose a valid level.")
 */
protected $playingLevel;

/**
 * @ORM\ManyToOne(targetEntity="Gender", inversedBy="users")
 * @ORM\JoinColumn(name="gender", referencedColumnName="code")
 * @Assert\NotBlank(message = "Choose a valid gender.")
 */
protected $gender;

/**
 * @ORM\ManyToOne(targetEntity="Country", inversedBy="users")
 * @ORM\JoinColumn(name="country", referencedColumnName="code")
 * 
 * @Assert\Country()
 */
protected $country;

/**
 * @ORM\Column(name="city", type="string")
 * @Assert\NotBlank()
 */
protected $city;

/**
 * @ORM\Column(name="status", type="string")
 */
 protected $status;

public function getUserName()
{
    return $this->email;
}

public function getSalt()
{
    return null;
}

public function getRoles()
{
    return array('ROLE_USER');
}

public function eraseCredentials()
{

}

public function serialize()
{
    return serialize(array(
        $this->id,
        $this->email,
        $this->password,
        //$this->salt
    ));
}

public function unserialize($serialized)
{
    list(
        $this->id,
        $this->email,
        $this->password,
        //$this->salt
    )= unserialize($serialized);
}

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 *
 * @return Usuario
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}

/**
 * Set lastName
 *
 * @param string $lastName
 *
 * @return Usuario
 */
public function setLastName($lastName)
{
    $this->lastName = $lastName;

    return $this;
}

/**
 * Get lastName
 *
 * @return string
 */
public function getLastName()
{
    return $this->lastName;
}

/**
 * Set email
 *
 * @param string $email
 *
 * @return Usuario
 */
public function setEmail($email)
{
    $this->email = $email;

    return $this;
}

/**
 * Get email
 *
 * @return string
 */
public function getEmail()
{
    return $this->email;
}

/**
 * Set password
 *
 * @param string $password
 *
 * @return Usuario
 */
public function setPassword($password)
{
    $this->password = $password;

    return $this;
}

/**
 * Get password
 *
 * @return string
 */
public function getPassword()
{
    return $this->password;
}

/**
 * Set playingLevel
 *
 * @param integer $playingLevel
 *
 * @return Usuario
 */
public function setPlayingLevel($playingLevel)
{
    $this->playingLevel = $playingLevel;

    return $this;
}

/**
 * Get playingLevel
 *
 * @return integer
 */
public function getPlayingLevel()
{
    return $this->playingLevel;
}

/**
 * Set gender
 *
 * @param string $gender
 *
 * @return Usuario
 */
public function setGender($gender)
{
    $this->gender = $gender;

    return $this;
}

/**
 * Get gender
 *
 * @return string
 */
public function getGender()
{
    return $this->gender;
}

/**
 * Set country
 *
 * @param string $country
 *
 * @return Usuario
 */
public function setCountry($country)
{
    $this->country = $country;

    return $this;
}

/**
 * Get country
 *
 * @return string
 */
public function getCountry()
{
    return $this->country;
}

/**
 * Set city
 *
 * @param string $city
 *
 * @return Usuario
 */
public function setCity($city)
{
    $this->city = $city;

    return $this;
}

/**
 * Get city
 *
 * @return string
 */
public function getCity()
{
    return $this->city;
}

/**
 * Set status
 *
 * @param string $status
 *
 * @return Usuario
 */
public function setStatus($status)
{
    $this->status = $status;

    return $this;
}

/**
 * Get status
 *
 * @return string
 */
public function getStatus()
{
    return $this->status;
}
}

Gender.php

<?php  
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\Entity
*/

class Gender
{

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

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

/**
* @ORM\OneToMany(targetEntity="Usuario", mappedBy="gender")
*/
private $users;

/**
 * Constructor
 */
public function __construct()
{
    $this->users = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Set code
 *
 * @param string $code
 *
 * @return Gender
 */
public function setCode($code)
{
    $this->code = $code;

    return $this;
}

/**
 * Get code
 *
 * @return string
 */
public function getCode()
{
    return $this->code;
}

/**
 * Set name
 *
 * @param string $name
 *
 * @return Gender
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}

/**
 * Add user
 *
 * @param \AppBundle\Entity\Usuario $user
 *
 * @return Gender
 */
public function addUser(\AppBundle\Entity\Usuario $user)
{
    $this->users[] = $user;

    return $this;
}

/**
 * Remove user
 *
 * @param \AppBundle\Entity\Usuario $user
 */
public function removeUser(\AppBundle\Entity\Usuario $user)
{
    $this->users->removeElement($user);
}

/**
 * Get users
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getUsers()
{
    return $this->users;
}
}

Country.php

<?php  
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\Entity
*/

class Country
{
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
protected $code;

/**
* @ORM\Column(name="name", type="string")
*/
protected $name;

/**
* @ORM\OneToMany(targetEntity="Usuario", mappedBy="country")
*/
protected $users;

public function __construct()
{
    $this->users = new ArrayCollection();
}

/**
 * Set code
 *
 * @param string $code
 *
 * @return Country
 */
public function setCode($code)
{
    $this->code = $code;

    return $this;
}

/**
 * Get code
 *
 * @return string
 */
public function getCode()
{
    return $this->code;
}

/**
 * Set name
 *
 * @param string $name
 *
 * @return Country
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}


/**
 * Add user
 *
 * @param \AppBundle\Entity\Usuario $user
 *
 * @return Country
 */
public function addUser(\AppBundle\Entity\Usuario $user)
{
    $this->users[] = $user;

    return $this;
}

/**
 * Remove user
 *
 * @param \AppBundle\Entity\Usuario $user
 */
public function removeUser(\AppBundle\Entity\Usuario $user)
{
    $this->users->removeElement($user);
}

/**
 * Get users
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getUsers()
{
    return $this->users;
}
}

还有我的控制器 UserController.php

public function playerSignUpAction(Request $request)
{
    $user = new Usuario();
    //$gender = new Gender();



    $form = $this->createForm(new UsuarioSignUpType(), $user);

    $form->handleRequest($request);

    if($form->isValid())
    {
        //Encoding User Password
        $plainPassword = $request->request->get('UsuarioSignUp')['password'];
        $encoder = $this->container->get('security.password_encoder');
        $encoded = $encoder->encodePassword($user, $plainPassword);

        $user->setPassword($encoded);
        $user->setStatus("ROLE_USER");
        //$user->setGender($gender);

        try {
            //Saving User in the DataBase
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();

            $this->addFlash(
                'notice',
                'Well done! you completed your registration correctly. Welcome to Squash Connection!'
                );

            return $this->render('default/submitted_registration.html.twig');

        } catch (\Doctrine\DBAL\Exception\UniqueConstraintViolationException $e) {
            $this->addFlash(
                'error',
                'Something went wrong! It seems that someone is already using that email.'
                );

            return $this->render('default/submitted_registration.html.twig');

        }


    }

    return $this->render('user/user_registration.html.twig', array('form' => $form->createView(), 'request' => $request));
}

我的UsuarioSingUpType.php

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvents;

class UsuarioSignUpType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text')
        ->add('lastName', 'text')
        ->add('email', 'email')
        ->add('password', 'password')
        ->add('playingLevel', 'rating', array(
            'label' => 'Playing Level',
            'stars' => 5))
        ->add('gender', 'choice', array(
            'choices' => array('m' => 'Male', 'f' => 'Female'), 
            'expanded' => 'true',
            ))
        ->add('country', 'country')
    ;



    $builder
        ->add('city', 'text')
        ->add('send', 'submit') 
    ;

}

public function getName()
{
    return 'UsuarioSignUp';
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Usuario'
    ));
}
}
?>

您的 UsuarioSignUpType 代码是什么 class。您是否定义了您的性别字段以使用您的性别实体?

如果没有,你应该这样做

$builder->add(
  'gender',
  'entity',
  array(
  'class' => 'AppBundle:Gender',
  'property' => 'name',
  'empty_value' => 'Choose your gender'
  )