可捕获的致命错误:参数1传递给?Symfony2的

Sco*_*ion 3 symfony

我对以下错误信息感到困惑和沮丧:

可捕获的致命错误:传递给Medicine\UserBundle\Entity\User :: setUsertype()的参数1必须是Medicine\UserBundle\Entity\Usertype的实例,Doctrine\Common\Collections\ArrayCollection的实例,在/ opt/lampp中调用第347行的/ htdocs/drugs/vendor/symfony/src/Symfony/Component/Form/Util /PropertyPath.php,在/ opt/lampp/htdocs/drugs/src/Medicine/UserBundle/Entity/User.php第224行中定义

我认为这个错误是由于在我的实体中使用了多个字段,我甚至试图在另一个实体中保持onetomany.

我有一个用户实体和一个usertype实体,usertype_id是用户表中的manytoone字段.这是两个实体的代码: -

用户

namespace Medicine\UserBundle\Entity;

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

/**
* @ORM\Entity(repositoryClass="Medicine\UserBundle\Repository\UserRepository")
* @ORM\Table(name="user")
* @ORM\HasLifecycleCallbacks()
*/

class User
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\HasLifecycleCallbacks()
 */
protected $id;

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

 /**
 * @ORM\ManyToOne(targetEntity="Usertype", inversedBy="users")
 * @ORM\JoinColumn(name="usertype_id", referencedColumnName="id")
 */
 protected $usertype;

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

/**
 * Set usertype
 *
 * @param Medicine\UserBundle\Entity\Usertype $usertype
 */
public function setUsertype(\Medicine\UserBundle\Entity\Usertype $usertype)
{
    $this->usertype = $usertype;
}

/**
 * Get usertype
 *
 * @return Medicine\UserBundle\Entity\Usertype 
 */
public function getUsertype()
{
    return $this->usertype;
}
}
Run Code Online (Sandbox Code Playgroud)

我只是展示了相关的代码,我拥有上述代码的所有getter和setter方法.

用户类型

namespace Medicine\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\Entity(repositoryClass="Medicine\UserBundle\Repository\UsertypeRepository")
* @ORM\Table(name="usertype")
* @ORM\HasLifecycleCallbacks()
*/

class Usertype
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\HasLifecycleCallbacks()
 */
protected $id;

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

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

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

/**
 * Add users
 *
 * @param Medicine\UserBundle\Entity\User $users
*/
public function addUser(\Medicine\UserBundle\Entity\User $users)
{
    $this->users[] = $users;
}

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

调节器

这在用户想要登录时执行.他将填写用户名密码和UserType:

public function indexAction()
{
$entity = new User();
    $form = $this->createForm(new LoginForm(), $entity);
    $request = $this->getRequest();
    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        if ($form->isValid()) {
        echo "<pre>"; print_r($entity->getUsertype()); exit;
        $em = $this->getDoctrine()
              ->getEntityManager();
        $em->persist($entity);
        $userrepository = $em->getRepository('MedicineUserBundle:User');
        echo "<pre>"; print_r($entity->getUsertype()); exit;
        $all = $userrepository->findOneBy(array('login' => $entity->getLogin(), 'password' => $entity->getPassword()));
        if($all)
        {
            return $this->redirect($this->generateUrl('MedicineUserBundle_login'));
        }
        }
     }

     return $this->render('MedicineUserBundle:User:loginpage.html.twig',array(
        'form' => $form->createView()
    ));
}
Run Code Online (Sandbox Code Playgroud)

登录表格

 public function buildForm(FormBuilder $builder, array $options)
{
    $builder
    ->add('login', 'text', array('label'  => 'Username',))
        ->add('password','password')
    ->add('usertype', 'entity', array('class' => 'MedicineUserBundle:Usertype', 'property'=>'name', 'multiple'  => true, ))

    ;
}
Run Code Online (Sandbox Code Playgroud)

jst*_*son 6

'multiple' => true与实体关联定义组合引起此问题.

您应该会发现,如果您将多个更改为false(因此只能为您的用户选择一个UserType),那么一切正常.

如果您想为一个用户提供多个UserType,则您具有多对多关联 - 一个用户可以拥有多个UserType,一个UserType可以拥有多个用户.请参阅Doctrine的ManyToMany关联类型以实现此目的.文档在这里.

希望这可以帮助.