争论1传递给?

时间:2012-09-16 11:48:40

标签: php symfony symfony-2.1

我尝试在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;

请建议我如何解决此错误?

3 个答案:

答案 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文档的这一章:

http://symfony.com/doc/current/book/forms.html

答案 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。