Monthly Archives: Ocak 2013

Programa Dilleri ve Çatıları

YII Framework Modülleri Arasında Model Erişimi

Hobi için uğraştığım proje anlaşılan bu ara epey blog yazısı yazmama vesile olacak.

YII framework de modüler bir proje geliştiriyorsanız projenin herhangibir yerinden modül içerisindeki bir modüle ulaşmak için aşağıdaki yolu izleyebilirsiniz.

1- Framework ün yardımcısını kullanarak veya manuel olarak aşağıdaki klasör yapısını oluşturmak suretiyle yeni bir modül oluşturun.

protected/
  modules/
    blog/
      components/
      models/
      views/
      controllers/

2- Güzel… Şimdi konfigürasyon dosyasına (protected/config/main.php) oluşturduğumuz modülü tanımlayalım.

  array('modules' => array(
    ---
    'blog'
  ));

3- Post isimli yeni bir model oluşturun ve bu modeli yeni oluşturduğunuz modülün model klasörüne (protected/modules/blog/model/) Post.php olarak kayıt edin.

class Post
{
  public function newPost()
  {
    ...
  }
}

4- Şimdi de modül sınıfımızı oluşturalım. Bu modülün içine ekleyeceğimiz getPost metodu az önce oluşturduğumuz modele başka modüllerden erişebilme imkanını sağlayacak. Bu sınıfı yeni oluşturduğunuz modül klasörüne BlogModule.php olarak kayıt edin.

class BlogModule extends CModule
{
  public function init()
  {
    $this->setImport(array('blog.models.*',
                           'blog.components.*'));
  }
  
  public function getPost()
  {
    return new Post();
  }
}

Oluşturduğumuz blog modülü dışında, projenin herhangibir yerinde Post modeline ulaşmamız gerektiğinde aşağıdaki şekilde ulaşabiliriz.

$post = Yii::app()->getModule('blog')->getPost();

Hepsi bu. İyi eğlenceler :) .

Programa Dilleri ve Çatıları

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

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 :)