2012-12-13 12 views
5

Modificato il mio post per essere simile a Symfony Cookbook e aggiunto del codice.Il modo migliore per gestire la raccolta di moduli di grandi dimensioni in Symfony2

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

Si noti che il codice/modulo per le entità pubblicato nella parte è lo stesso di quello del documento linkato sopra.

Ho un'entità "Task", che è collegata a un'entità "Tag". Per semplificare, "Task" ha un singolo campo "descrizione", e un "tag" ha un singolo campo "nome" . Un "tag" è collegato a un "task" e un "task" è collegato a molti "tag".

Entity:

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

Al momento, io uso una raccolta di "Tag" in forma "Task" per modificare tutti in una volta, come descritto in Symfony Cookbook:

Forma:

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

Ma un problema appare quando creo una collezione di "Tag" la furfante di mille elementi. In questo momento, il modulo impiega secondi e secondi a caricarsi e talvolta si blocca a causa della memoria.

$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); 

L'errore non viene da Doctrine, che gestisce molto bene tutto, ma da Symfony Form.

È una buona idea gestire il mio modulo utilizzando il sistema di moduli incorporato Symfony2 (con Collections) in questo caso, o dovrei gestirlo come ai vecchi tempi, con input HTML html e validazione/salvataggi lato server ?

+0

Pubblica il tuo codice e quale parte dei documenti di symfony ti stai riferendo? – Squazic

+0

Ho modificato il mio post con il link a Symfony Cookbook sulle collezioni. Il mio codice non ha importanza qui, sto solo usando le Collezioni di form come descritto nella prima parte del link (tutte le entità "tags" sono caricate con la mia entità "prodotto") quando faccio "$ this-> createForm". – elwood

+0

Hai mai risolto questo? – jrjohnson

risposta

1

Mi chiedo se il problema non ha nulla a che fare con la parte del modulo, ma l'idratazione degli oggetti tag. Se stai chiedendo alla dottrina di idratare una tonnellata di oggetti, userà una grossa fetta di memoria. Potresti voler esaminare un altro metodo per idratare i tag, forse HYDRATE_ARRAY invece di HYDRATE_OBJECT.

+0

Sì, penso che la maggior parte del problema derivi dall'idratazione di Doctrine. È possibile creare/associare il mio modulo in base a un'entità idratata come matrice piuttosto che come oggetto? Sarò ancora in grado di convalidare le entità/salvarle senza dover codificare tutto? – elwood

+0

Quanti tag stiamo parlando qui? Sono in grado di caricare 500 entità in un elenco di entità espanse multiple abbastanza rapidamente usando il metodo normale. – Mike

+0

Modificato il mio post con maggiori informazioni. Il problema non viene da Doctrine, ma dai metodi Symfony $ this-> createForm() con Collections. – elwood

Problemi correlati