0

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;

このエラーを解決するために私が何をすべきか教えてください。

4

3 に答える 3

1

doctrine を使用して多対 1 の関係を設定すると、この関係を保持するプロパティは ID ではなく、関連するエンティティのオブジェクトになります。これは ID としてデータベースに保存されますが、Doctrine は取得時に完全なオブジェクトを作成し、永続化するときにオブジェクトを ID に変換します。したがって、これを反映するために、プロパティは $idCountry ではなく、代わりに $country と呼ばれるべきです (これは必須ではありません。好きなように呼び出すことができますが、これによりすべてがより明確になります)。次に、セッターは 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 docs のこの章を注意深く読むことをお勧めします:

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

于 2012-09-16T14:48:50.723 に答える
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);

正確にはそうではないと思いますが、私にとってはもっと理にかなっています。

于 2012-09-16T12:39:07.693 に答える
0

問題は、doctrine を使用して関係を設定することで、"$idCountry" が Country オブジェクトであることを宣言することです。

idCountry 自体を設定するとショートカットとして機能します (Doctrine ではオブジェクトの代わりに id を設定できます) が、慣例により、プロパティは $idCountry ではなく $country という名前にする必要があります。オブジェクトを参照するだけで、コーディング中にIDの存在を確認できます。

このエラーが表示されるのは、おそらくオブジェクトであることを強制する型ヒントがあるためです。StudentRegistration クラスで次のようなものを探します。

public function setIdCountry(MasterCountry $idCountry)

または似たようなもので、ID を設定できるようにする場合は、タイプヒント ($idCountry の前の MasterCountry) を削除します。それに触れたくない場合は、国オブジェクトを取得して、ID だけでなくそれを使用する必要がある場合があります。

于 2012-09-16T12:45:02.883 に答える