Item エンティティと Image エンティティがあり、それらの間の OneToOne 関係があります。ItemType フォームと ImageType フォームもあります。今まで、このような状況になったときは、2 つのフォームを別々に使用し (単一の HTML フォームにレンダリング)、コントローラーまたはフォーム ハンドラー内で関係を設定していました。ImageType フォームを ItemType フォームに埋め込む -symfony- 方法はありますか? ちょっとしたコードが役立つかもしれません。アイテム:
namespace Company\ItemBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use NewZaarly\ImageBundle\Entity\Image;
/**
* @ORM\Table()
* @ORM\Entity()
*/
class Item
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $title;
/**
* @var \NewZaarly\ImageBundle\Entity\ImageItem
* @ORM\OneToOne(targetEntity="NewZaarly\ImageBundle\Entity\ImageItem", mappedBy="item", cascade={"persist", "merge", "remove"})
*/
private $image;
//other fields. Setters and getters
}
画像:
<?php
namespace Company\ImageBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* @ORM\Table()
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks
*/
class Image
{
/**
* @Assert\File(maxSize = "2M", mimeTypes = {"image/png", "image/jpg", "image/jpeg"})
*/
protected $file;
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="image", type="string", length=255, nullable=true)
*/
protected $image;
//other fields, setter and getters
}
画像タイプ
<?php
namespace Company\ImageBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class ImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('file', 'file', array('required' => true));
}
public function getName()
{
return 'image';
}
}
そして ItemType フォーム
<?php
namespace Company\ItemBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Company\ImageBundle\Form\Type\ImageType;
class ItemType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title', 'text');
$builder->add('image', new ImageType()); // <-- this is what I'd like to do
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Company\ItemBundle\Entity\Item');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('data_class' => 'Company\ItemBundle\Entity\Item'));
}
public function getName()
{
return 'item';
}
}
このようにすると、リクエストをバインドするときにエラーが発生します。これは、画像が Image オブジェクトではなく配列であるためです。これは、Item クラスの setImage メソッドで予期されることです。私のハンドル関数は非常に単純です:
public function handle(FormInterface $form, Request $request)
{
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
$item = $form->getData();
$this->itemManager->saveItem($item);
return true;
}
}
return false;
}
何か案が?最初に指定した方法が好きではありません。