我尝试在symfony2.1中提交表单,但是我得到了以下错误,我创建了表单学生注册并尝试提交它,我审查了论坛,但没有得到任何正确的解决方案。
Error:Catchable Fatal Error: Argument 1 passed to
Frontend\EntityBundle\Entity\StudentRegistration::setIdCountry()
must be an instance of Frontend\EntityBundle\Entity\MasterCountry, string given,
called in C:\wamp\www\careerguide\src\Frontend\HomeBundle\Controller\RegistrationController.php
on line 41 and defined in C:\wamp\www\careerguide\src\Frontend\EntityBundle\Entity\StudentRegistration.php line 1253
在控制器中我有:
$student_account = new \Frontend\EntityBundle\Entity\StudentRegistration();
$params = $request->get('student_registration');
$student_account->setIdCountry($params['idCountry']);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($student_account);
$em->flush();
实体类:
/**
* @var MasterCountry
*
* @ORM\ManyToOne(targetEntity="MasterCountry")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_country", referencedColumnName="id_country")
* })
*/
private $idCountry;
请建议我如何解决此错误?
答案 0 :(得分:1)
当您使用doctrine设置多对一关系时,持有此关系的属性是相关实体的对象,而不是id。它作为id保存在数据库中,但Doctrine将在您获取它时创建完整对象,并在您持久化时将对象转换为id。因此,为了反映这一点,该属性不应该被称为$ idCountry,而是$ country(这不是强制性的,你可以随意调用它,但这会使一切更加清晰)。然后setter应该是setCountry(),它应该接受MasterCountry对象。
因此,当您从表单中收到国家/地区ID时,应将其转换为MasterCountry对象(通过从数据库中提取),在studentRegistration中设置此对象,然后将其保留。类似的东西:
$student_account = new \Frontend\EntityBundle\Entity\StudentRegistration();
$params = $request->get('student_registration');
$country = $this->getDoctrine()->getRepository('AcmeStoreBundle:MasterCountry')
->find($params['idCountry']);
$student_account->setCountry($country);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($student_account);
$em->flush();
虽然这应该有用,但这不是Symfony处理表单的方法。您应该创建一个Form对象,然后绑定并验证它。您不应该处理请求参数等...我建议您仔细阅读Symfony文档的这一章:
答案 1 :(得分:0)
我认为问题在于$ params不是请求参数:
$params = $request->get('student_registration'); // looks like a String http param value
$student_account->setIdCountry($params['idCountry']); //what could be $params['idCountry']
你可能想要
$studentRegistrationId = $request->get('student_registration');
$studentRegistration = getStudentFromId( $studentRegistrationId); // I don't know how you retrieve the $studentRegistration object
$idCountry = $request->get('idCountry');
$student_account->setIdCountry($idCountry);
我确定这不是那个,但对我来说,它更有意义。
答案 2 :(得分:0)
问题是通过使用doctrine设置关系,您声明“$ idCountry”是Country对象。
如果设置idCountry本身它将作为一个快捷方式(Doctrine允许你设置id而不是对象),虽然按照惯例,属性应该命名为$ country,而不是$ idCountry,因为这个想法是通过引用对象来编码时,可以抽象出存在的id。
显示此错误是因为可能存在类型提示强制它成为对象,因此在StudentRegistration类中查找类似的内容:
public function setIdCountry(MasterCountry $idCountry)
或类似的东西,如果你想能够设置id,你想要删除类型提示($ idCountry之前的MasterCountry)。如果您不想触摸它,那么您可能需要检索国家/地区对象并使用它而不仅仅是id。