2012-11-20 17 views
7

जो मैं जानना चाहता हूं वह एक ऐसा फॉर्म बनाने का सबसे अच्छा तरीका है जो किसी इकाई से मेल खाता है।सिद्धांत संस्थाओं से जेडएफ 2 फॉर्म बनाएं

  • मैन्युअल रूप से कोड में या फॉर्म एनोटेशन का उपयोग करके फ़ॉर्म बनाएं?
  • इकाई से एनोटेशन का उपयोग करना?

मैंने कुछ अलग उदाहरण देखे हैं, कुछ @ एन्नोटेशन और दूसरों का उपयोग @Form का उपयोग कर रहे हैं? क्या कोई अंतर को समझा सकता है?

संबंधित/घोंसले वाली इकाइयों वाली संस्थाओं के मामले में मुझे प्रत्येक इकाई के लिए कस्टम हाइड्रेटर प्रदान करने की आवश्यकता है? मुझे लगता है कि सिद्धांत में पहले से ही एक है जो हाइड्रेटर इंटरफेस लागू करता है?

संक्षेप में: - एक इकाई से एक फॉर्म बनाने का सबसे अच्छा तरीका। - @ फॉर्म और @ एनीोटेशन के बीच अंतर - क्या सिद्धांतों के लिए सिद्धांतों में हाइड्रेटर है?

उत्तर

11

पहला बंद: एनोटेशन एक स्पीड-किलर हैं। यदि आप एनोटेशन बिल्डर का उपयोग करना चाहते हैं, तो कृपया हमेशा बनाई गई वस्तुओं को कैश करें। लेकिन एनोटेशन भी फॉर्म चलाने के लिए सबसे आसान तरीका है;)

दूसरा: हाइड्रेटर। Doctrine 2 के संयोजन के साथ ZF2 प्रपत्रों का उपयोग करते समय आप संभवतः अंदर स्थित डॉक्टरिन एंटीटी हाइड्रेटर का उपयोग करना चाहते हैं। निम्नलिखित कोड पर विचार करें:

$form = new ReferenzwertForm(); 
$form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager'))) 
    ->setObject(new Referenzwert()) 
    ->setInputFilter(new ReferenzwertFilter()) 
    ->setAttribute('method', 'post'); 
return $form; 
  • ReferenzwertForm() प्रकार Zend\Form\Form Object
  • DoctrineEntity() की है प्रकार DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity
    • DoctrineEntity प्रदान की EntityManager की जरूरत की है। जब ZF2
  • Referenzwert() में एक इकाई-वस्तु
सिद्धांत 2 उपयोग कर रहा है

एनोटेशन का उपयोग नहीं जब और आप किसी अन्य इकाई को संदर्भित कर रहे हैं, तो आप उपयोग सुनिश्चित करें आप इस से परिचित होना चाहिए उपयुक्त रूप तत्व (ज्यादातर मामलों में यह एक का चयन-तत्व (एक BlogEntity या कुछ और)

$this->add(array(
    'name' => 'type', 
    'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity', 
    'options' => array(
      'label' => 'Choose a MyEntity', 
      'object_manager' => $this->getEntityManager(), 
      'target_class' => 'Namespace\Entity\MyEntity', 
      'property' => 'name' 
    ), 
    'attributes' => array(
     'required' => true 
    ) 
)); 

आप देख सकते हैं, फार्म तत्व entityManager के बारे में पता करने की जरूरत है के लिए एक CategoryEntity का चयन करना होगा, भी। यह यही कारण है कि आप आदर्श रूप से ext करना चाहते हैं इकाई फॉर्म को अपने फॉर्म ऑब्जेक्ट में इंजेक्ट करने के लिए किसी अन्य सेटर के साथ पहला कोड-उदाहरण समाप्त करें।

$form->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager')) 
    ->set()//all the other stuff 

सामान्य रूप से सबसे अच्छा तरीका क्या है? मैं कहूंगा कि कोई नहीं है। गति उद्देश्यों के लिए, एनोटेशन पूरी तरह से एक हत्यारा हैं। कैश किए गए संस्करणों का उपयोग करने में मदद करनी चाहिए, हालांकि मुझे अभी तक ZF2 में कैशिंग के साथ कोई व्यक्तिगत अनुभव नहीं है। मैं एनोटेशन के बाहर हाथ से अपने फॉर्म बनाना चाहता हूं, सिर्फ इसलिए कि मेरा आईडीई बहुत सारी चीजों का समर्थन करता है, लेकिन निश्चित रूप से एनोटेशन नहीं बनाते हैं: डी

आशा है कि यह आपको थोड़ा सा मदद कर सके और मैंने बहुत अधिक नहीं लिखा संदर्भ: पी

+0

अच्छा जवाब, धन्यवाद। क्या मैं यह मानने में सही होगा कि target_class आदि के साथ आपका कोड उदाहरण एनोटेशन में परिवर्तित किया जा सकता है?मुझे ऐसा नहीं लगता कि प्रदर्शन इन क्षेत्रों में एक बड़ा मुद्दा होगा और कैशिंग कुछ ऐसा है जिसे हम लागू कर सकते हैं। – Ben

+0

मैंने अब तक एनोटेशन के साथ काम नहीं किया है, इसलिए मैं आपको बिल्कुल नहीं बता सकता। मुझे क्या पता है कि पार्सिंग एक बड़ा प्रदर्शन ड्रॉ है, इसलिए मैं इससे दूर चला गया। संस्थाओं को पहले से पार्स करने के लिए मेरे लिए पर्याप्त है;) 'target_class' इकाई को प्रदर्शित करने के लिए परिभाषित करता है और 'संपत्ति' वह गुण है जो चयन-तत्व – Sam

+0

के अंदर प्रदर्शित होता है, मुझे ऐसा नहीं लगता है कि प्रदर्शन हिट फॉर्म पर नगण्य है। क्या आपके पास इसका कुछ सबूत है? अन्यथा आपका कोड नमूना बहुत अच्छा काम करता है। पूरी सहायताके लिए शुक्रिया। – Ben

संबंधित मुद्दे