2012-12-13 13 views
5

私の記事をSymfony Cookbookと似ているように編集し、いくつかのコードを追加しました。Symfony2の大きなフォームコレクションを処理する最良の方法

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

部分に転記エンティティ/フォームコードは、上記連結DOCにおけるものと同じであることに留意されたいです。

「タグ」エンティティにリンクされている「タスク」エンティティがあります。単純にするため、「タスク」には単一のフィールド「説明」があり、「タグ」には単一のフィールド「名前」があります。 「タグ」は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のクックブックで説明したように、一度にすべてのそれらを編集し、「タスク」の形で「タグ」のコレクションを使用します。

フォーム:

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'; 
    } 
} 

しかし、私はラ・「タグ」のコレクションを作成するときに問題が表示されます千要素よりも大きい。現時点では、フォームには秒や秒がかかりますが、メモリーによってクラッシュすることがあります。

$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フォームからです。

この場合、Symfony2ビルトインフォームシステム(コレクションあり)を使用してフォームを処理することをお勧めします。また、古くからのHTML入力やサーバー側の検証/保存?

+0

あなたのコードとあなたが参照しているsymfonyドキュメントのどの部分を投稿しますか? – Squazic

+0

私は、コレクションに関するSymfony Cookbookへのリンクを使って投稿を編集しました。私のコードはここでは重要ではありません。私は "$ this-> createForm"を実行すると、リンクの最初の部分(すべての "タグ"エンティティが私の "product"エンティティにロードされている)で説明したフォームコレクションを使用しています。 – elwood

+0

あなたはこれを解決しましたか? – jrjohnson

答えて

1

あなたの問題がこのフォームの部分とは関係ないのではないかと思いますが、タグオブジェクトの水分補給です。大量の水を水和するように教説を頼んでいるのであれば、大きな記憶を使うことになります。 HYDRATE_OBJECTの代わりにおそらくHYDRATE_ARRAYをタグに含める別の方法を調べることができます。

+0

はい、私は問題の最大の部分は教義の水和になると思います。オブジェクトではなく配列として水和されたエンティティに基づいてフォームを作成/バインドすることは可能ですか?私はエンティティを検証したり、すべてをハンドコーディングすることなくエンティティを保存したりできますか? – elwood

+0

ここではいくつのタグを使用していますか?私は500個のエンティティを、通常の方法を使ってかなり迅速に複数のエンティティリストにロードすることができます。 – Mike

+0

詳細情報を含む投稿を編集しました。この問題はDoctrineからではなく、Collectionsを持つSymfony $ this-> createForm()メソッドから発生します。 – elwood

関連する問題