2012-11-01 7 views
6

मैंने अपने ज़ेंड फ्रेमवर्क 2 एप्लिकेशन पर मॉड्यूल ZfcUser जोड़ा है। लेकिन मुझे मौजूदा डेटाबेस तालिका, का उपयोग करना है जिसमें ZfcUser के लिए डिफ़ॉल्ट तालिका संरचना से थोड़ा अलग कॉलम नाम हैं।ZF2: ZfcUser मॉड्यूल के लिए कस्टम उपयोगकर्ता मैपर

ZfcUser wiki page में यह कहता है कि यदि मेरा मॉडल प्रदान किए गए इंटरफ़ेस के अनुरूप नहीं है तो कस्टम मैपर का उपयोग करना संभव है। और चूंकि मेरी डेटाबेस तालिका डिफ़ॉल्ट से अलग है, इसलिए मेरी उपयोगकर्ता इकाई वर्ग मानक ZfcUser \ Entity \ उपयोगकर्ता से भी अलग है। लेकिन मैं ZfcUser बता फ़ाइल config/autoload में स्थापित करने/zfcuser.global.php अधिभावी द्वारा आसानी से अपने ही वर्ग के साथ काम करने के लिए कर सकते हैं:

'user_entity_class' => 'MyApp\Entity\MyUser', 

लेकिन मैं `ve एक आसान तरीका करने के लिए ZfcUser बताने के लिए नहीं मिला अब तक मेरे मैपर वर्ग का उपयोग करें।

मैं केवल ने पाया है कि नक्शाकार ZfcUser \ मॉड्यूल :: getServiceConfig() द्वारा बनाई गई है जो अंदर, मैं देख सकता नक्शाकार अपने कारखाने समारोह से वापस आ गया है:

// ... 
public function getServiceConfig() 
{ 
    return array(
    // ... 
     'factories' => array(
      // ... 
      'zfcuser_user_mapper' => function ($sm) { 
       $options = $sm->get('zfcuser_module_options'); 
       $mapper = new Mapper\User(); 
       $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter')); 
       $entityClass = $options->getUserEntityClass(); 
       $mapper->setEntityPrototype(new $entityClass); 
       $mapper->setHydrator(new Mapper\UserHydrator()); 
       return $mapper; 
      }, 
      // ... 

वहाँ एक रास्ता है ZfcUser को मेरे कस्टम उपयोगकर्ता मैपर वर्ग का उपयोग करने के लिए बनाओ?

उत्तर

4

मुझे आपके जैसा ही समस्या है, लेकिन आखिरकार मेरे आवेदन में लॉग इन करने में कामयाब रहा। मैंने रोब की सलाह का पालन किया और अपने मौजूदा उपयोगकर्ता मॉड्यूल के भीतर अपना स्वयं का सेवा कारखाना बनाया। दुर्भाग्य से बर्नार्ड भी जगह पर है। आपको इसे काम करने के लिए ZfcUser स्रोत कोड में खोदना होगा। जिस परियोजना पर मैं अभी काम कर रहा हूं वह एक एमएसएसएलएल सर्वर है और मुझे यह कहना होगा कि चीजों पर एक संभाल करना मुश्किल हो गया है। लॉगिन पृष्ठ को काम करने के लिए मैंने ZfcUser स्रोत में केवल एक फ़ंक्शन को ट्विक कर दिया है।

मुझे वर्तमान एप्लिकेशन के लिए केवल लॉग इन कार्यक्षमता की आवश्यकता है, लेकिन आने वाली परियोजना बहुत अधिक भूमिका निभाई गई है। मैं ऐसा कुछ ढूंढ रहा था जो जल्दी से हुक अप करने के लिए बहुत जटिल नहीं होगा, और साथ ही भविष्य के लिए अधिक विकल्प और संभावनाएं प्रदान करेगा।

मैं अपने मौजूदा b2bUser (मेरी मॉड्यूल) फ़ोल्डर में अधिक ZfcUser निर्देशिका से इकाई और मैपर फ़ोल्डरों की नकल की:

यहाँ क्या मैं अब के लिए किया था और मैं क्या सीखा है है। सब कुछ ... यहां तक ​​कि मैपर के अंदर अपवाद फ़ोल्डर भी। यह आवश्यक नहीं हो सकता है, लेकिन मैं निर्भरताओं को समझने के मूड में नहीं था।

zfcuser.global.php फ़ाइल में, मेरा सक्रिय विन्यास इस प्रकार दिखता है:

'user_entity_class' => 'b2bUser\Entity\User', 
'enable_registration' => false, 
'enable_username' => true, 
'auth_identity_fields' => array('username'), 
'login_redirect_route' => 'home', 
'enable_user_state' => false, 

मैं डिफ़ॉल्ट पर सेटिंग्स के बाकी छोड़ दिया है। मैंने ऑथ पहचान से ईमेल विकल्प हटा दिया क्योंकि वे सिस्टम में लॉग इन करने के लिए ईमेल पते का उपयोग नहीं करेंगे। user_entity_class जिस पर मैंने प्रतिलिपि बनाई है ...

मॉड्यूल।php (b2bUser) सेवा प्रबंधक config के लिए निम्नलिखित को कॉपी किया गया:

'zfcuser_user_mapper' => function ($sm) { 
    $mapper = new Mapper\User(); 
    $mapper->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter')); 
    $mapper->setEntityPrototype(new Entity\User()); 
    $mapper->setHydrator(new Mapper\UserHydrator()); 
    return $mapper; 
}, 

बाद सेटअप किया गया था, मैं नामस्थान आदि अपने नए घर को प्रतिबिंबित करने के बदल गया है, इकाई और मैपर में फ़ाइलों की। अपनी खुद की डेटा संरचना को प्रतिबिंबित करने के लिए इकाई और इंटरफ़ेस को बदल दिया। मैंने मैपर फ़ाइलों के साथ ऐसा ही किया और सुनिश्चित किया कि हाइड्रेटर फ़ाइल में परिवर्तनीय नाम मेरे डेटाबेस कॉलम नामों के समान हैं।

मैंने सार तत्व डीबैपर फ़ाइल को छोड़ दिया जहां यह था। लेकिन यह वह फाइल है जिसे मैंने थोड़ी सी tweaked।

यह मेरी तरह दिखता है। एसक्यूएलएसआरवी चालक पोह से भरा था, पूरे ऑब्जेक्ट या स्ट्रिंग के बारे में शिकायत कर रहा था ...

protected function select(Select $select, $entityPrototype = null, HydratorInterface $hydrator = null) 
{ 
    $this->initialize(); 
    $selectString = $this->getSlaveSql()->getSqlStringForSqlObject($select); 
    $stmt = $this->getDbAdapter()->driver->createStatement($selectString); 
    $stmt->prepare(); 
    $res = $stmt->execute($stmt); 

    $resultSet = new HydratingResultSet($hydrator ?: $this->getHydrator(), 
      $entityPrototype ?: $this->getEntityPrototype()); 
    $resultSet->initialize($res); 
    return $resultSet; 
} 

और यही वह है। मुझे उम्मीद है कि यह किसी को इसे पाने और कम से कम अपने सिस्टम पर चलने में मदद करता है। मैं इस तरह अपना नहीं छोड़ूंगा, लेकिन यह काम करने के लिए एक मिशन था।

+0

पर मेरे कांटा को देखना चाहते हैं! मैं एक ही जानकारी की तलाश में था, और आपकी पोस्ट की मदद से मैंने अपने डीबी और एंटिटी की विस्तारित कार्यक्षमता के साथ उपयोग करने के लिए zfcUser की Entity और Mapper कक्षाओं को फिर से लोड करने में कामयाब रहा! – Brock

0

वर्तमान में ZfcUser स्रोत को संशोधित किए बिना तालिका संरचना को बदलने का कोई आसान तरीका नहीं लगता है। वहाँ Github पर एक पुल अनुरोध है कि इस समस्या का समाधान कर सकता है: zfcuser_user_mapper के लिए

https://github.com/ZF-Commons/ZfcUser/pull/174

3

बनाएं अपनी खुद की सेवा कारखाने और इसका इस्तेमाल किया जाएगा।

+1

हां यह वही होगा जो मैं ढूंढ रहा हूं। सवाल यह है कि यह कैसे करें। –

+1

zfcuser_user_mapper के लिए आपके Module.php में एक प्रविष्टि जोड़ें। सुनिश्चित करें कि आपका मॉड्यूल ZfcUser के बाद लोड हो गया है, यह डिफ़ॉल्ट को ओवरराइट करेगा। अब देखने के लिए zfcuser_user_mapper कॉन्फ़िगर किया गया है, ZfcUser के Module.php देखें। मुझे आश्चर्य है कि आधिकारिक कोडबेस में बदलाव किए बिना कस्टम टेबल का मुद्दा कुछ समय से बाहर रहा है। आप https://kithub.com/thoaionline/ZfcUser – thoaionline

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