Catchable Fatal Error: Аргумент 1 передан? Symfony2 - PullRequest
3 голосов
/ 23 февраля 2012

Я застрял и разочарован появившимся ниже сообщением об ошибке:

Пойманная фатальная ошибка: аргумент 1 передан Medicine \ UserBundle \ Entity \ User :: setUsertype () должен быть экземпляром Medicine \UserBundle \ Entity \ Usertype, данный экземпляр Doctrine \ Common \ Collections \ ArrayCollection, названный в / opt / lampp / htdocs / drug / vendor / symfony / src / Symfony / Component / Form / Util /PropertyPath.php в строке 347 и определенныйв строке / opt / lampp / htdocs / drugs / src / Medicine / UserBundle / Entity / User.php 224

Что я думаю, что эта ошибка связана с использованием в моей сущности поля manytoone, я дажепопытался сохранить onetomany в другой сущности.

У меня есть сущность пользователя и сущность usertype, usertype_id - это поле с множеством значений в пользовательской таблице.Вот код для обеих сущностей: -

Пользователь

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;
}
}

Я просто показываю соответствующий код, у меня есть все методы получения и установки дляКод выше.

Тип пользователя

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;
}
}

Контроллер

Выполняется, когда пользователь хочет войти в систему.Он заполнит имя пользователя и пароль:

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()
    ));
}

Форма входа

 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, ))

    ;
}

1 Ответ

6 голосов
/ 23 февраля 2012

'multiple' => true в сочетании с определением вашей ассоциации сущностей вызывает эту проблему.

Вы должны обнаружить, что если вы измените несколько на false (и, следовательно, можете выбрать только один тип пользователя для вашего пользователя), все будет работать правильно.

Если вы хотите использовать несколько типов пользователя для одного пользователя, у вас есть ассоциация «многие ко многим» - один пользователь может иметь много типов пользователя, а один тип пользователя может иметь много пользователей. См. Doctrine's тип ассоциации ManyToMany для реализации этого. Документация здесь .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...