ユーザーがコレクションの一部としてエンティティを更新できる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 "data_class" 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',
));
}