2013-11-27 4 views
5

मेरे पास विरासत परियोजना है जिसमें विभिन्न मामलों में घोषणाएं और कक्षा के उपयोग हैं।संगीतकार जेनरेट क्लासमैप का उपयोग कर केस असंवेदनशील ऑटोलोडिंग कैसे जोड़ें?

मैं स्रोत को आधुनिक राज्य में अपग्रेड करना चाहता हूं। सबसे पहले मैं संगीतकार ऑटोलोडिंग द्वारा विरासत ऑटोलोडिंग को प्रतिस्थापित करना चाहता हूं। लेकिन संगीतकार case insensitive autoloading प्रदान नहीं करता है।

संगीतकार क्लासमैप और असंवेदनशील ऑटोलोड का उपयोग कैसे करें?

उत्तर

4

classmapcomposer.json जोड़ें।

"autoload": { 
    "classmap": ["folder1/", "folder2/"] 
}, 

फिर composer.phar dumpautoload चलाने composer/autoload_classmap.php बनाने के लिए।

अपना कोड बदलें।

require VENDOR_PATH . '/autoload.php'; 

के बाद जोड़े

$class_map = require VENDOR_PATH . '/composer/autoload_classmap.php'; 
$new_class_map = array(); 
foreach ($class_map as $class => $file) 
    $new_class_map [strtolower($class)] = $file; 
unset($class_map); 
spl_autoload_register(function ($class)use($new_class_map) 
     { 
     $class = strtolower($class); 
     if (isset($new_class_map[$class])) 
      { 
      require_once $new_class_map[$class]; 
      return true; 
      } 
     else 
      return false; 
     }, true, false); 
unset($new_class_map); 

यह सबसे आसान तरीका मैं पाया है है।

2

आप संगीतकार के साथ नहीं करते हैं।

कोड को ठीक करें। अर्थात। अपने वर्गों का एक वर्गीकरण बनाने के लिए संगीतकार का उपयोग करें, फिर इन सभी वर्ग नामों के लिए केस असंवेदनशील खोज करें, और उन्हें क्लासमैप से सही केस संवेदनशील संस्करण के साथ बदलें।

या अपना खुद का केस-असंवेदनशील क्लासमैप लोडर बनाएं जो स्वचालित रूप से शिकायत करता है कि यह गलत मामलों के साथ क्लासनाम पर स्टंप करता है और आपको सॉफ़्टवेयर को एक-एक करके ठीक करता है - कुछ मामलों को याद करने के खतरे के साथ जो कोड के बाद ही पता लगाया जाएगा परिवर्तन ऑटोलोडेड वर्गों के क्रम को पुनर्व्यवस्थित करते हैं।

+3

यह एक ही बार में पूरे कोड को फिर से लिखने के लिए अच्छा समाधान है। लेकिन मुझे छोटे काम करने योग्य बदलाव पसंद हैं। – sectus

+0

एक समय में कक्षा नामों का उपयोग लगातार बनाते हैं। संगीतकार आपको यह जानने में मदद करेगा कि किस नाम का उपयोग करना है। – Sven

+1

मैं इसे करूँगा। लेकिन विरासत कोड में समस्याएं हो सकती हैं: जेनरेट किए गए क्लास नाम, जिन्हें अभी नामित नहीं किया जा सकता है। – sectus

0

यदि आपका उत्पादन सेटअप spl_autoload_register (5.1.2 से शुरू) का समर्थन करता है - तो आप संगीतकार के साथ ऑटोलोड का अपना कार्यान्वयन जोड़ सकते हैं। मेरा यहाँ कैसे किया जाता है (यह भी नाम रिक्ति पर निर्भर करता है):

autoload.php 

<?php 
spl_autoload_register('classLoader'); 

function classLoader($className, $prefix = '') { 
    $pathParts = explode('\\', $className); 
    $newPathParts = array_map('strtolower', $pathParts); 
    $classPath = $prefix . implode(DIRECTORY_SEPARATOR, $newPathParts) . '.php'; 

    if (file_exists($classPath)) { 
    require_once $classPath; 
    } 
} 

?> 

और अपनी फाइलों में आप अपने मामले जो कुछ भी आप की तरह मिश्रण कर सकते हैं।

$obj = new View\Home\Home(); 

समान है करने के लिए:

$obj = new vIEw\home\homE(); 
संबंधित मुद्दे