5

私の投稿を Symfony Cookbook に似たものに編集し、いくつかのコードを追加しました。

http://symfony.com/doc/current/cookbook/form/form_collections.html

パーツに掲載されているエンティティ/フォーム コードは、上記のリンク先のドキュメントのものと同じであることに注意してください。

「タグ」エンティティにリンクされた「タスク」エンティティがあります。単純にするために、「タスク」には単一のフィールド「説明」があり、「タグ」には単一のフィールド「名前」があります。 " は 1 つの "タスク" に関連付けられ、"タスク" は多数の "タグ" に関連付けられます。

実在物:

class Task
{
    protected $description;
    protected $tags;

    public function __construct()
    { $this->tags = new ArrayCollection(); }

    public function getDescription()
    { return $this->description;}

    public function setDescription($description)
    { $this->description = $description; }

    public function getTags()
    { return $this->tags; }

    public function setTags(ArrayCollection $tags)
    { $this->tags = $tags; }
}

class Tag
{
    public $name;
}

現時点では、Symfony CookBook で説明されているように、「タスク」フォームで「タグ」のコレクションを使用して、すべてを一度に編集します。

形:

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

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

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


class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('description');

        $builder->add('tags', 'collection', array('type' => new TagType()));
    }

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

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

しかし、1,000 要素を超える "タグ" のコレクションを作成すると、問題が発生します。現時点では、フォームの読み込みに数秒と数秒かかり、メモリが原因でクラッシュすることもあります。

$task = new Task();

$tag1 = new Tag();
$tag1->name = 'tag1';
$task->getTags()->add($tag1);
$tag2 = new Tag();
$tag2->name = 'tag2';
$task->getTags()->add($tag2);
//Create a couple thousand more item here ...

//The script crashes here, when the form is being created
$form = $this->createForm(new TaskType(), $task);

エラーは、すべてをうまく処理する Doctrine からではなく、Symfony Form から発生します。

この場合、Symfony2 のビルトイン フォーム システム (コレクションを使用) を使用してフォームを処理するのは良い考えですか?それとも、生の html 入力とサーバー側の検証/保存を使用して、昔のように処理する必要がありますか?

4

1 に答える 1

1

あなたの問題がこれのフォーム部分とは何の関係もないのだろうかと思いますが、タグオブジェクトのハイドレーションです. doctrine に大量のオブジェクトをハイドレートするように要求している場合、大量のメモリを使用することになります。タグをハイドレートする別の方法、おそらく HYDRATE_OBJECT の代わりに HYDRATE_ARRAY を検討することをお勧めします。

于 2012-12-13T18:32:19.670 に答える