0

ユーザーがコレクションの一部としてエンティティを更新できるAPIを構築しています。全体でフォームを使用する場合、これは正常に機能しますが、APIを構築しています。私のエンティティは次のようになります。

<?php
class MyEntity {
    // ...

    /**
     * @ORM\OneToMany(targetEntity="TitleEntity", mappedBy="entityID", cascade={"persist"})
     */
    protected $myTitles;

    public function getMyTitles() {
        return $this->myTitles;
    }

    public function setMyTitles($titles) {
       foreach($titles as $key => $obj) { $obj->setEntity($this); }
       $this->myTitles = $collection;
    }

    public function addMyTitle($obj) {
        $obj->setEntity($this);
        $this->myTitles[] = $obj;
    }

    public function removeMyTitle($obj) {
        $this->myTitle->removeElement($obj);
    }
}

myTitles、ID、接続されているエンティティのID、およびタイトルを持つエンティティです。

APIの場合、JSONコンテンツ本体をMyEntityオブジェクトのPUTリクエストとして返すため、タイトルの配列ができあがり、検証用のフォームにバインドするために次のように準備します。

$myTitles = array();
foreach($titles as $key => $title) {
    $titleObj = new TitleEntity();
    $titleObj->setTitle($title);
}
$myEntity->setTitles($titles);

しかし、それは不平を言います:

The form's view data is expected to be of type scalar, array or an instance of
\ArrayAccess, but is an instance of class stdClass. You can avoid this error by 
setting the &quot;data_class&quot; option to "stdClass" or by adding a view 
transformer that transforms an instance of class stdClass to scalar, array or 
an instance of \ArrayAccess

getMyTitles()これは、検証に使用しているフォームにエンティティをバインドする前に呼び出すために発生するようです。

配列を使用してフォームにバインドしています:

$form = $this->createForm(new AddEntity(), $myEntity);
$data = array( // Set all my data );
$form->bind($data);
if($form->isValid() {
// ...

最初にcreateForm()電話をかけ、後でタイトルを追加すると、次のようになります。

Call to a member function removeElement() on a non-object

これは内部で発生しますremoveMyTitle()

これをどのように処理しますか?

編集

AddEntity()タイプは次のとおりです。

<?php
class AddEntity extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
        ->add('title', 'text')
        ->add('subheading', 'text')
        ->add('description', 'textarea')
        ->add('myTitles', 'collection', array(
            'type' => new AddMyTitles(), // Basic type to allow setting the title for myTitle entities
            'allow_add' => true,
            'allow_delete' => true,
            'prototype' => true,
            'by_reference' => false,
            'options' => array(
                'required' => false,
            ),
        ));
}

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

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'My\TestBundle\Entity\Entity',
    ));
}
4

1 に答える 1

0

ここにはデータトランスフォーマーが必要です。

http://symfony.com/doc/2.0/cookbook/form/data_transformers.html

基本的に、あなたはそれが配列を取得しているというフォームに話しました、そしてあなたはそれに何か他のものを与えました。変圧器がこれを処理することになっています。

さらにサポートが必要な場合は、さらに情報が必要です。

また、やや不可解なことに、散文で「myCollections」を参照していますが、コードでは表示していません。^^^^^^^^^編集により修正されました。

于 2013-02-22T23:28:41.163 に答える