2010-07-24 16 views
8

यदि मैं सिद्धांत 2 के साथ ज़ेंड फ्रेमवर्क 1.10 को एकीकृत करता हूं, जहां मैं अपना सिद्धांत मॉडल/संस्थाएं और प्रॉक्सी डालता हूं? मैंने /application या /library निर्देशिकाओं के बारे में सोचा। अगर मैं /library निर्देशिका में डालता हूं, तो क्या वहां से जेडएफ ऑटोलोडिंग कक्षाओं में हस्तक्षेप होगा क्योंकि कक्षाएं PHP 5.3 नामस्थान बनाम पीईआर स्टाइल नेमस्पेस का उपयोग कर रही हैं।जेडएफ/सिद्धांत 2 को एकीकृत करना: मैं अपने मॉडल/संस्थाओं और प्रॉक्सी कक्षाओं को कहां रखूं

उत्तर

8

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जो ZF1.10 के साथ सिद्धांत 2 को एकीकृत करता है। आपको डॉक्टर ऑटो लोडर का उपयोग करने की आवश्यकता नहीं है।

1) अपने application.ini फ़ाइल में (यदि आप अपने पुस्तकालय फ़ोल्डर में सिद्धांत स्थापित किया है यह सोचते हैं (Zend फ़ोल्डर के रूप में ही) निम्न पंक्ति जोड़ें:

autoloadernamespaces.doctrine = "Doctrine" 

2) एक सिद्धांत या entitymanager संसाधन बनाएँ। आपकी आईएनआई फ़ाइल में:

resources.entitymanager.db.driver = "pdo_mysql" 
resources.entitymanager.db.user = "user" 
resources.entitymanager.db.dbname = "db" 
resources.entitymanager.db.host = "localhost" 
resources.entitymanager.db.password = "pass" 
resources.entitymanager.query.cache = "Doctrine\Common\Cache\ApcCache" 
resources.entitymanager.metadata.cache = "Doctrine\Common\Cache\ApcCache" 
resources.entitymanager.metadata.driver = "Doctrine\ORM\Mapping\Driver\AnnotationDriver" 
resources.entitymanager.metadata.proxyDir = APPLICATION_PATH "/../data/proxies" 
resources.entitymanager.metadata.entityDir[] = APPLICATION_PATH "/models/entity" 

3) अगला, आपको इसे बूटस्ट्रैप करने की आवश्यकता होगी। मैंने अपने संसाधन फ़ोल्डर में एक संसाधन वर्ग जोड़ा। सुनिश्चित करें कि आप अपने INI फ़ाइल में फ़ोल्डर को मैप करें:

pluginPaths.Application_Resource_ = APPLICATION_PATH "/resources" 

फिर अपने संसाधन वर्ग ...

class Application_Resource_EntityManager 
extends Zend_Application_Resource_ResourceAbstract 
{ 
    /** 
    * @var Doctrine\ORM\EntityManager 
    */ 
    protected $_em; 

    public function init() 
    { 
     $this->_em = $this->getEntityManager(); 
     return $this->_em; 
    } 

    public function getEntityManager() 
    { 
     $options = $this->getOptions(); 
     $config = new \Doctrine\ORM\Configuration(); 
     $config->setProxyDir($options['metadata']['proxyDir']); 
     $config->setProxyNamespace('Proxy'); 
     $config->setAutoGenerateProxyClasses((APPLICATION_ENV == 'development')); 
     $driverImpl = $config->newDefaultAnnotationDriver($options['metadata']['entityDir']); 
     $config->setMetadataDriverImpl($driverImpl); 
     $cache = new Doctrine\Common\Cache\ArrayCache(); 
     $config->setMetadataCacheImpl($cache); 
     $config->setQueryCacheImpl($cache); 

     $evm = new Doctrine\Common\EventManager(); 
     $em = Doctrine\ORM\EntityManager::create($options['db'],$config,$evm); 

     return $em; 
    } 
} 

सिद्धांत 2 इकाई प्रबंधक अपने आवेदन करने के लिए अब उपलब्ध है। अपने नियंत्रक में आप यह इतना तरह हड़पने कर सकते हैं:

$bootstrap = $this->getInvokeArg('bootstrap'); 
$em = $bootstrap->getResource('entitymanager'); 

मुझे यकीन है कि इस में मदद मिलेगी किसी :)

+0

और रिपॉजिटरीज़ के बारे में क्या? @Entity (repositoryClass = "Entities \ ArticlesRepository") मैं उन्हें लोड नहीं कर सकता। :( – cirpo

+0

एक एफवाईआई के रूप में, मुझे अभी तक इस सुविधा का उपयोग करने का मौका नहीं मिला है (Magento के साथ बहुत व्यस्त हो गया है)। दस्तावेज़ों के मुताबिक, repositorClass के लिए मान एक पूरी तरह से योग्य वर्ग नाम होना चाहिए जो सिद्धांत \ ORM \ EntityRepository को बढ़ाता है। – David

+0

इसके अलावा, आपको अवगत होना चाहिए कि आपके पास उदाहरण एक नामांकित वर्ग है। यदि आप नामस्थान का उपयोग नहीं कर रहे हैं, वहां पूर्ण वर्ग का नाम डालने का प्रयास करें (उदाहरण: Module_Model_Entities_ArticlesRepository)। – David

0

मैं मॉडल को उसी निर्देशिका में रखूंगा जहां "सामान्य" ज़ेंड फ्रेमवर्क मॉडल जीवन। /models

आप इस जगह पर मॉडल जेनरेट करने के लिए सिद्धांत बता सकते हैं, और उन्हें "Default_Model" या जो कुछ भी उपसर्ग कर सकते हैं।

बाहर चेक Zend फ्रेमवर्क के बारे में जॉन Lebenshold ब्लैकबेरी से एक और सिद्धांत

Zend Screencasts

+0

मैं सिद्धांत 2 जो पीएचपी का उपयोग करता है 5.3 "सही" नामस्थान का उपयोग कर रहा हूँ, मुझे नहीं लगता है कि मैं ऐसा कर सकते हैं ? मैं 'APPLICATION_PATH'' से अपनी ''संस्थाएं' और 'प्रॉक्सी' 'लोड करने के लिए ज़ेंड ऑटोलोडर को कैसे बता सकता हूं?मैं अपनी संस्थाओं और प्रॉक्सी को 'लाइब्रेरी/एप्लिकेशन' में डालकर काम करने में कामयाब रहा, जहां वे पथ शामिल हैं, इसलिए यह –

1

सिद्धांत रूप में, आप तो कहीं भी नामस्थान सही हल के रूप में डाल सकता है, जब तक।

/application/models/MyApp/Entities 
/application/models/MyApp/Proxies 

लोड सिद्धांत के classloader का उपयोग कर 'MyApp':

मैं इस संरचना सुझाव है। मुझे ज़ेंड लोडर के साथ सिद्धांत लोडर का उपयोग करके कोई विवाद नहीं हुआ है (यदि आपके पास कक्षाएं हैं जो आपके नामस्थान फ़ोल्डर के अंदर पीयर सम्मेलन का उपयोग करती हैं, तो आपको अभी भी ज़ेंड लोडर का उपयोग करने की आवश्यकता होगी)।

याद रखें कि 'मॉडल' केवल आपकी इकाई वर्गों से अधिक हो सकता है। मेरी मॉडल परत में इंटरफेस, कारखानों, सत्यापनकर्ता और सेवा वस्तुएं शामिल हैं। इसके लिए, कुछ भी जो विशिष्ट विशिष्ट विशिष्ट तर्क तर्क मॉडल मॉडल में जाना चाहिए।

+0

काम करता है आप ज़ेंड ऑटोलोडर के साथ काम करने के लिए डॉक्टर क्लास लोडर को कैसे कॉन्फ़िगर करते हैं? मैं वर्तमान में अपनी संस्थाओं को '/ पुस्तकालय/एप्लिकेशन' फ़ोल्डर में रख रहा हूं। फिर application.ini में 'autoloaderNamespaces [] = एप्लिकेशन' जोड़ा गया। यह ठीक काम करता है क्योंकि ज़ेंड लोडर PHP 5.3 नेमस्पेस के साथ काम करने में सक्षम प्रतीत होता है, हालांकि मैं इसे 'include_path' के बाहर कहीं से कक्षाओं को लोड करने के लिए नहीं प्राप्त कर सकता। यह जानना अच्छा होगा कि मैं इसे डॉक्टर क्लास लोडर और ज़ेंड के साथ कैसे कर सकता हूं (फ़ाइलों को खोजने के लिए एक कस्टम स्थान निर्दिष्ट करना) –

+0

मैनुअल के इस अनुभाग को देखें: http://www.doctrine-project.org/projects/orm/ 2.0/डॉक्स/संदर्भ/कॉन्फ़िगरेशन/एन # बूटस्ट्रैपिंग: क्लास-लोडिंग: गिट मूल रूप से, आप किसी भी PHP 5.3 नेमस्पेस को लोड करने के लिए सिद्धांत के क्लासलोडर का उपयोग कर सकते हैं। बस बेस नेमस्पेस (जैसे 'सिद्धांत' या 'माईएप', और फ़ोल्डर के लिए पथ का नाम प्रदान करें। फिर आप 'उपयोग' कीवर्ड के साथ किसी भी नामस्थान वर्ग आयात कर सकते हैं। –

+0

मुझे पता है, अब मेरा प्रश्न है कि मैं कैसे मेरे ज़ेंड एप्लिकेशन में क्लास लोडर के रूप में डॉक्टर क्लास लोडर जोड़ें? –

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