YII Framework Autoloader Kütüphanesini Ezerek PSR-0 a Uygun Hale Getirmek

Share Button

Birkaç gün önce evde zaman geçirmek için başladığım PHP projesinde hafifliği nedeniyle YII framework tercih ettim. Ancak framework ün mevcut autoloader kütüphanesinin PSR-0 standartları na uygun çalışmaması nedeniyle mevcut kütüphaneyi ezip farklı bir autoloader kütüphanesi kullanmak için farklı denemeler yaptım ve sonuçta aşağıda adım adım açıkladığım çözümü buldum. Ben autoloader kütüphanesi olarak Zend in autoloader kütüphanesini tercih ettim.

YII framework ün autoloader kütüphanesini ezerek Zend in autoloader kütüphanesini kullanmak için aşağıdaki adımları gerçekleştirmeniz gerekiyor.

1-) Projenizin protected dizini altında vendors ve vendors/Zend isimli dizinleri oluşturun.

2-) Zend framework ün aşağıdaki kütüphanelerini oluşturduğunuz dizinin altına kopyalayın.

Zend/Exception.php
Zend/Loader.php
Zend/Loader/Autoloader.php
Zend/Loader/Autoloader/Interface.php

3-) protected/vendors/Zend/Loader.php dosyasında require komutu ile script e dosya dahil eden satırları commentout edin.

 52     public static function loadClass($class, $dirs = null)                                                              
 53     {                                                                                                                   
 54         if (class_exists($class, false) || interface_exists($class, false)) {                                           
 55             return;                                                                                                     
 56         }                                                                                                               
 57                                                                                                                         
 58         if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {                                                
 59             //require_once 'Zend/Exception.php';                                                                        
 60             throw new Zend_Exception('Directory argument must be a string or an array');                                
 61         }                                                                                                               
 62                                                                                                                         
 63         // Autodiscover the path from the class name                                                                    
 64         // Implementation is PHP namespace-aware, and based on  
///
 95         }                                                                                                               
 96                                                                                                                         
 97         if (!class_exists($class, false) && !interface_exists($class, false)) {                                         
 98             //require_once 'Zend/Exception.php';                                                                        
 99             throw new Zend_Exception("File \"$file\" does not exist or class \"$class\" was not found in the file");    
100         }                  
///
264     public static function registerAutoload($class = 'Zend_Loader', $enabled = true)                                    
265     {                                                                                                                   
266         trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead', E_USER_NOTICE);
267         //require_once 'Zend/Loader/Autoloader.php';                                                                    
268         $autoloader = Zend_Loader_Autoloader::getInstance();                                                            
269         $autoloader->setFallbackAutoloader(true);    
///
272             self::loadClass($class);                                                                                    
273             $methods = get_class_methods($class);                                                                       
274             if (!in_array('autoload', (array) $methods)) {                                                              
275                 //require_once 'Zend/Exception.php';                                                                    
276                 throw new Zend_Exception("The class \"$class\" does not have an autoload() method");                    
277             }         
///
272             self::loadClass($class);                                                                                    
273             $methods = get_class_methods($class);                                                                       
274             if (!in_array('autoload', (array) $methods)) {                                                              
275                 //require_once 'Zend/Exception.php';                                                                    
276                 throw new Zend_Exception("The class \"$class\" does not have an autoload() method");                    
277             }          

4-) protected/vendors/Zend/Loader/Autoloader.php dosyasında require komutu ile script e dosya dahil eden satırları commentout edin.

 22                                                                                                                         
 23 /** Zend_Loader */                                                                                                      
 24 //require_once 'Zend/Loader.php';                                                                                       
 25                                                                                                                                        

5-) Aşağıdaki sınıf kodunu projenizin protected/components dizini altına ResourceLoader.php olarak kayıt edin.

<?php                                                                                                                   
class ResourceLoader extends CApplicationComponent                                                                      
{                                                                                                                       
    public function init()                                                                                              
    {                                                                                                                   
        try {                                                                                                           
            Yii::import('application.vendors.Zend.Loader', true);                                                       
            Yii::registerAutoloader(array('Zend_loader', 'loadClass'), true);                                           
        } catch(Exception $e) {                                                                                         
            echo $e->getMessage();                                                                                      
        }                                                                                                               
    }                                                                                                                   
}                      

6-) Framework konfigürasyonunuzda components bölümüne ResourceLoader bileşenini tanımlayın.

return array(
 //
 'components' => array('resourceLoader' => array('class' => 'ResourceLoader'))
);

7-) Yine konfigürasyonda preload bölümüne bileşeninizi tanımlarken kullandığınız alias ı ekleyin.

return array(
  //
  'preload' => array(
    //
    'resourceLoader'
  )
);

Hepsi bu kadar. İyi eğlenceler :)

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır. Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir. Halen Markafoni back end geliştirici olarak çalışmaktadır.

3 Comments

  • Ocak 13, 2013 - 11:03 pm | Permalink

    İbo Yii mail grubuna da yaz, belki yeni sürüme alırlar. Eline Sağlık

  • Gurel Kaynak
    Ocak 14, 2013 - 8:02 am | Permalink

    eline sağlık ibo dayı!

  • Ocak 18, 2013 - 12:52 pm | Permalink

    Aslında YII de module kavramı var. Bu kavram olup da PSR-0 a uygun çalışmaması biraz saçma. Muhtemelen ben birşeyleri becerememiş olabilirim diye düşündüm ama YII source unda YIIBasedeki autoload metodu böyle çalışmıyor gibi görünüyor.

  • Bir Cevap Yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir