Salı, 27 Ekim 2009

CodeIgniter Kütüphanelerini Genişletmek

 

CodeIgniter, kendi kütüphaneleri üzerinde oynama izni veren elastik bir yapıya sahip bir MVC çatısıdır. Bu yazıda model kütüphanesi üzerinde en sık kullandığımız fonksiyonları ekleyerek nasıl genişleteceğimizi anlatacağım.

Model kütüphaneleri, veritabanı ile Controller dosyaları arasında bağlantı sağlayan elemanlardır. Controller dosyasından Model dosyasına aktarılan bilgilerle veritabanı üzerinden bilgi çekimi, eklenmesi, silinmesi vb. gibi işlemler yapılır. Genellikle kullanım şekli her Controller dosyası için özel hazırlanmış bir Model dosyası şeklindedir. Ancak bir çok farklı isimdeki Model dosyasının içeriği benzerdir.

Bu benzerlikleri tekrar tekrar yazmamak için Model kütüphanesini genişletmemiz gerekir. Tüm farklı Model dosyalarında eklme, sorulama, silme ve yenileme işlemleri yaptığımız için bu işlemleri içerecek şekilde Model kütüphanesini genişletelim. Öncelikle application/libraries dizini altına MY_Model.php isimli bir dosya yaratalım. MY_Model.php dosyamızın içeriği aşağıdadır:

<?php  
if (!defined('BASEPATH')) exit('No direct script access allowed');


class MY_Model extends Model {
 
 function MY_Model() {
  parent::Model();
 }

 function ekle($tablo, $dizi) {
  $this->db->insert($tablo,$dizi);
  if ($this->db->insert_id() > 0) return TRUE;
  else return FALSE;
 }
 
 function oku($tablo,$dizi) {
  $this->db->get_where($tablo,$dizi);
  if($query->num_rows() > 0) return $query->result_array();
  else return FALSE;  
 }
 
 function yenile($tablo,$dizi,$id) {
  if($this->db->update($tablo,$dizi,array('id' => $id))) return TRUE;
  else return FALSE;
 }
 
 function sil($tablo,$id) {
  if($this->db->delete($tablo,array('id' => $id))) return TRUE;
  else return FALSE;
 }
}


Yukarıdaki kodlardan da takip edileceği üzere her Model dosyasında tekrar tekrar yazmamızı önleyen minimum kodları eklemiş olduk. Bundan sonra veritabanına bilgi eklemek istersek, kendi model dosyamızdan buradaki fonksiyona ilgili değişkenleri göndermemiz yetecektir. MY_Model.php dosyamızı kullanırken, yine her Controller dosyasına özel hazırlayacağımız Model dosyasındaki kullanımı şöyle olacaktır:

Üyeler hakkında çalışma yaptığımız bir Model dosyamız olduğunu farz edelim. Bu dosyamız application/models dizini altında bulunan uye_model.php isimli dosyamız olsun. Dosyanın içeriği aşağıdadır:

<?php  
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Uye_model extends MY_Model {
 
    function uye_model()
    {
        parent::MY_Model();
    }
 
 function uye_ekle($dizi)
 {
  if($this->ekle('uye',$dizi)) return TRUE;
  else return FALSE;
 }
 
 function uye_oku($id)
 {
  $db_oku = $this->oku('uye',array('id' => $id));
  if(is_array($db_oku)) return $db_oku;
  else return FALSE;
 }
 
 function uye_yenile($dizi)
 {
  if($this->yenile('uye',$dizi, array('id' => $dizi['id']))) return TRUE;
  else return FALSE;
 }

 function uye_sil($id)
 {
  if($this->sil('uye',array('id' => $id))) return TRUE;
  else return FALSE;
 }
 
}

Yukarıdaki kodlarda dikkat etmemiz gereken en önemli konu Uye_model sınıfının Model sınıfının değil de MY_Model sınıfının genişletilmiş hali olduğu konusudur. Böylelikle en başta anlattığımız ekle(), oku(), sil() ve yenile() fonksiyonlarını kullanabilir hale geliriz. Benzer şekilde makale isimli bir modelimiz olsa, onun için sadece uye_model.php dosyamızın içeriğini uygun şekilde değiştirerek kullanabiliriz.

Bu yazı, kütüphane genişletme mantığının nasıl çalıştığını ve hangi hallerde kullanılmasının faydalı olacağını anlatmak için hazırlanmıştır. Uygulama yaparken kendi amacınıza uygun olarak sürekli tekrarlanan fonksiyonlarınızı belirleyip, ilgili CodeIGniter kütüphanesini genişleterek kullanmak sizlerin insiyatifindedir.

20 Mart 2010: @Erhan`ın yorumunda belirttiği şekilde kodlardaki hatayı düzelttim.

Yorumlar

Makaleniz için teşekkür ederim çok faydalı oldu :) bende yeni başladım oop ve framework a. Bir iki şey ilişti gözüme ama belki yanlış söylüyorumdur.

1. uye_model ' de fonksiyon çıktılarında False lerin önüne return yazılmamış.
2. si aynı dosyada uye_oku fonksiyonunda dönüş gene boolean verilmiş yerine şöle yapmak gerekmezmiydi
function uye_oku($id)
{
 $db_oku = $this->oku('uye',array('id' => $id));
 if($db_oku) 
return $db_oku;
 else 
return FALSE;
}

@Erhan: Dikkatin için teşekkür ederim. kodları belirttiğin gibi düzelttim.

Yorum Ekle