0

これは私の最初の質問です:S

Symfony2 を使用していますが、次のような問題があります。

ManyToOne 関係で関連付けられた 2 つのエンティティがあり、次のエンティティのフォームを作成したい

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;
   /**
     * @ORM\ManyToOne(targetEntity="Acme\ProductsBundle\Entity\ProductCategory", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $productCategory;
}

だから私は次の「ProductType」をしました

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('productCategory')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\ProductsBundle\Entity\Product'
        ));
    }

    public function getName()
    {
        return 'acme_hellobundle_producttype';
    }
}

そして、フォームをレンダリングするとすべてがうまく機能しますが、ユーザーはproductCategoryの主キーである番号を書き込む必要があるため、「productCategory」のウィジェットをテキストウィジェットに変更したいと考えています。

しかし、それを実行してフォームに記入すると、次のエラーが発生しました。

警告: spl_object_hash() は、パラメーター 1 がオブジェクトであると想定し、C:\xampp\htdocs\sym2\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php 行 1358 で指定された文字列

ORM が PK の文字列の読み取りに失敗したようです。それを修正するために何を確認する必要があるかについては、だれもほとんど知りません。アドバイスありがとう:)

4

1 に答える 1

0

製品エンティティには、製品カテゴリとの関係があります。したがって、フォームはカテゴリが文字列ではなくエンティティであると想定しています。これが、エラーが発生する理由ですexpects parameter 1 to be object, string given

これを回避するには、setDefaultOptionsメソッドを削除します。これを行うと、フォーム クラスは特定のエンティティ クラスに関連付けられていることを認識できなくなります。これの落とし穴は、エンティティをフォーム クラスに渡すときに、フィールドが自動的に設定されないことです。

ただし、カテゴリ ID を入力して処理できるようになりました。

例えば

class ProductType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('productCategory');        
    }

    public function getName()
    {
        return 'acme_hellobundle_producttype';
    }
}

これで、productCategory は自動的にテキスト ウィジェットになります。ただし、コントローラーで独自に永続化する必要があります。しかし、これについては別の質問をするかもしれません。

フォームを作成するときは、製品オブジェクトを渡さないでください。このようにしてください

$form = $this->createForm(new ProductType(), array());
于 2013-02-16T06:51:02.393 に答える