フォームのフィールドのカスタムタイプに小さな問題があります。変数として「url」と「alt」を持つ「Image」エンティティに関連する「ImageType」を追加しようとしています。
このエラーが表示されます:
\ ArrayAccessを実装していないため、タイプ "Proxies__CG __\OC\PlatformBundle\Entity\Image"のオブジェクトからインデックス "url"を読み取ることができません。
タイプは次のとおりです。
<?php
// src/OC/PlatformBundle/Form/ImageType.php
namespace OC\PlatformBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class ImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('url', TextType::class)
->add('alt', TextType::class)
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'OC\PlatformBundle\Entity\Image'
));
}
public function getName()
{
return 'oc_platformbundle_image';
}
}
フォーム:
class AdvertType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class)
->add('date', DateType::class)
->add('categories', EntityType::class, array(
'class' => 'OCPlatformBundle:Category',
'choice_label' => 'name',
'multiple' => true
))
->add('image', ImageType::class)
->add('save', SubmitType::class, array('label' => 'Create Task')) ;
}
そしてエンティティ:
<?php
namespace OC\PlatformBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Image
*
* @ORM\Table(name="image")
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\ImageRepository")
*/
class Image
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="url", type="string", length=255)
*/
private $url;
/**
* @var string
*
* @ORM\Column(name="alt", type="string", length=255)
*/
private $alt;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set url
*
* @param string $url
*
* @return Image
*/
public function setUrl($url)
{
$this->url = $url;
return $this;
}
/**
* Get url
*
* @return string
*/
public function getUrl()
{
return $this->url;
}
/**
* Set alt
*
* @param string $alt
*
* @return Image
*/
public function setAlt($alt)
{
$this->alt = $alt;
return $this;
}
/**
* Get alt
*
* @return string
*/
public function getAlt()
{
return $this->alt;
}
}
Imageクラスには配列がないため、何が問題を引き起こすのかわかりません。
Symfonyはフォームタイプのデータクラスを探しているが見つからないため、このエラーを受け取ります。あなたのコードはsetDefaultOptions()
が有効なSymfony 2.xバージョンで機能していました。 Symfony 2.7から、そのメソッドは configureOptions()
の代わりに廃止されました で、3.0で完全に削除されました。
したがって、関数はフォームクラスに存在しますが、Symfonyによって参照されることはありません。デバッグツールバーは、3.0で完全に削除されたため、この非推奨を表示することさえできません。これと同じ間違いをしても簡単なフォームタイプはエラーになりませんが、いずれの場合もsetDefaultOptions()
が呼び出されることはありません。
解決策として、これを変更します。
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class AdvertType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'OC\PlatformBundle\Entity\Image',
));
}
}
これに:
use Symfony\Component\OptionsResolver\OptionsResolver;
class AdvertType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'OC\PlatformBundle\Entity\Image',
));
}
}