2012-12-13 9 views
5

मेरी पोस्ट को सिम्फनी कुकबुक के समान होने के लिए संपादित किया गया और कुछ कोड जोड़ा गया।Symfony2 में बड़े फॉर्म संग्रह को संभालने का सबसे अच्छा तरीका

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

ध्यान दें कि इकाई/पर्चा कोड भाग में तैनात दस्तावेज़ ऊपर लिंक में से एक के रूप में ही है।

मेरे पास "टास्क" इकाई है, जो "टैग" इकाई से जुड़ी है। इसे सरल रखने के लिए, "कार्य" में एक फ़ील्ड "विवरण" है, और "टैग" में एक फ़ील्ड "नाम" है एक "टैग" एक "कार्य" से जुड़ा हुआ है, और एक "कार्य" कई "टैग" से जुड़ा हुआ है।

निकाय:

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

त्रुटि सिद्धांत है, जो बहुत अच्छी तरह से पूरी बात हैंडल से नहीं आती है, लेकिन Symfony फार्म से।

क्या इस मामले में सिम्फनी 2 अंतर्निर्मित फॉर्म सिस्टम (संग्रह के साथ) का उपयोग करके मेरे फॉर्म को संभालने का अच्छा विचार है, या क्या इसे कच्चे HTML इनपुट और सर्वर-साइड सत्यापन/सहेजने के साथ पुराने दिनों में इसे संभालना चाहिए ?

+0

अपना कोड और उस सिम्फनी दस्तावेज़ों का किस भाग का आप उल्लेख कर रहे हैं पोस्ट करें? – Squazic

+0

मैंने संग्रह के बारे में सिम्फनी कुकबुक के लिंक के साथ अपनी पोस्ट संपादित की। मेरे कोड का कोई महत्व नहीं है, मैं लिंक के पहले भाग में वर्णित फॉर्म संग्रहों का उपयोग कर रहा हूं (सभी "टैग" इकाइयां मेरी "उत्पाद" इकाई से भरी हुई हैं) जब मैं "$-> createForm" करता हूं। – elwood

+0

क्या आपने कभी इसे हल किया है? – jrjohnson

उत्तर

1

मुझे आश्चर्य है कि क्या आपके मुद्दे के इस हिस्से के साथ कुछ लेना देना नहीं है, लेकिन टैग ऑब्जेक्ट्स की हाइड्रेशन। यदि आप ऑब्जेक्ट्स के एक टन को हाइड्रेट करने के लिए सिद्धांत पूछ रहे हैं, तो यह स्मृति के एक बड़े हिस्से का उपयोग करने जा रहा है। आप टैग को हाइड्रेट करने की एक अन्य विधि को देखना चाहते हैं, शायद HYDRATE_OBJECT के बजाय HYDRATE_ARRAY।

+0

हाँ, मुझे लगता है कि समस्या का सबसे बड़ा हिस्सा सिद्धांत हाइड्रेशन आता है। क्या ऑब्जेक्ट की बजाए ऐरे के रूप में हाइड्रेटेड इकाई पर आधारित मेरे फॉर्म को बनाना/बांधना संभव है? क्या मैं अभी भी इकाइयों को प्रमाणित करने में सक्षम हूं/सब कुछ हैंडकोड किए बिना उन्हें बचा सकता हूं? – elwood

+0

हम यहां कितने टैग बात कर रहे हैं? मैं 500 इकाइयों को सामान्य विधि का उपयोग करके बहुत अधिक विस्तारित इकाई सूची में लोड करने में सक्षम हूं। – Mike

+0

अधिक जानकारी के साथ मेरी पोस्ट संपादित की। समस्या सिद्धांत से नहीं आती है, लेकिन सिम्फनी $ से-> संग्रह के साथ बनाएँफॉर्म() विधियों। – elwood