Kategoriler
Teknik

Model Katmanı ve Veritabanı İşlemlerini Kolaylaştırmak

İlk yazıda bahsettiğimiz gibi, model katmanı veritabanı işlemlerimizi düzene sokmak ve kolaylaştırmak adına ihtiyaç duyduğumuz bir katman. Bu yazıda yapacağımız MVC sisteminin model çekirdeğini kodlayacağız. Haydi başlayalım.

/app/core/model.php:

class model
{
    /**
     * Veritabanını nesnesini tutar
     * @var PDO
     */
    public $db;

    /**
     * Veritabanı nesnesini oluşturur
     */
    public function __construct()
    {
        $this->db = new PDO(DB_DSN, DB_USR, DB_PWD);
    }
}

En basit haliyle bu şekilde olan bir model katmanı bizim birçok ihtiyacımızı karşılayacaktır. Sınıf içerisinde $db değişkeni ekleyip, buna PDO nesnesi ile veritabanı bağlantığımızı bağladık. Görece bu yeterlidir, fakat ben işimizi daha da kolaylaştırmak istiyorum. Şimdi iki tane daha metod yazacağız. Bu metodlardan birisi fetch() ve fetchAll() metodları olacak. Bilindiği üzere bu metodlar PDO ile veri alışverişi yaptığımızda veri döndüren metodlardı. Haydi işimize koyulalım.

fetch() metodu

/**
 * Tek satırlık veri döndüren sorgu çalıştırır
 * @param string $query SQL sorgusu
 * @param array $params varsa parametreler
 * @return array
 */
public function fetch($query, array $params = [])
{
    $sth = $this->db->prepare($query);
    $sth->execute($params);
    return $sth->fetch();
}

Ne işimizi görecek bu metod? Bununla daha hızlı sorgular oluşturup, parametre ile beraber veriyi alabileceğiz. PDO’da fetch() metodu tekil veri döndürür. Bu metodun örnek kullanımı şu şekilde olabilir:

$post = $model->fetch('SELECT * FROM post WHERE id=:id', [':id' => 5]);

Bu satır, 5 numaralı ID’ye sahip olan veriyi döndürecektir. Aynı metodun bir de fetchAll() ile query() olanını ekleyelim:

/**
 * Birden fazla satır döndüren sorgu çalıştırır
 * @param string $query SQL sorgusu
 * @param array $params varsa parametreler
 * @return array
 */
public function fetchAll($query, array $params = [])
{
    $sth = $this->db->prepare($query);
    $sth->execute($params);
    return $sth->fetchAll();
}

/**
 * Sorgu çalıştırır
 * @param string $query SQL sorgusu
 * @param array $params varsa parametreler
 * @return array
 */
public function query($query, array $params = [])
{
    $sth = $this->db->prepare($query);
    return $sth->execute($params);
}

Bunu ise şu şekilde kullanabileceğiz:

$posts = $model->fetchAll('SELECT * FROM post WHERE draft=:draft', [':draft' => 'taslak_olmayan_gonderi']);

Bu kadar kolay. Şimdi, sınıfımızın son haline bakalım:

class model
{
    /**
     * Veritabanını nesnesini tutar
     * @var void
     */
    public $db;

    /**
     * Veritabanı nesnesini oluşturur
     */
    public function __construct()
    {
        $this->db = new PDO(DB_DSN, DB_USR, DB_PWD);
    }

    /**
     * Tek satırlık veri döndüren sorgu çalıştırır
     * @param string $query SQL sorgusu
     * @param array $params varsa parametreler
     * @return array
     */
    public function fetch($query, array $params = [])
    {
        $sth = $this->db->prepare($query);
        $sth->execute($params);
        return $sth->fetch();
    }

    /**
     * Birden fazla satır döndüren sorgu çalıştırır
     * @param string $query SQL sorgusu
     * @param array $params varsa parametreler
     * @return array
     */
    public function fetchAll($query, array $params = [])
    {
        $sth = $this->db->prepare($query);
        $sth->execute($params);
        return $sth->fetchAll();
    }

    /**
     * Sorgu çalıştırır
     * @param string $query SQL sorgusu
     * @param array $params varsa parametreler
     * @return array
     */
    public function query($query, array $params = [])
    {
        $sth = $this->db->prepare($query);
        return $sth->execute($params);
    }
}

Bu yazdığımız çekirdek sınıfı, yarattığımız bir model dosyasında veya bir controller metodunda şu şekilde kullanabileceğiz:

Model dosyasında:

class post extends model
{
    public function getAll()
    {
        return $this->fetchAll('SELECT * FROM post ORDER BY created DESC');
    }
}

Controller dosyasında:

class postController extends controller
{
    public function getAction($id)
    {
        $model = $this->model('post');
        $post = $model->fetch('SELECT * FROM post WHERE id=?', [$id]);
        var_dump($post);
    }
}

Artık, MVC sistemimiz hazır.


Adım adım:

  1. Yeni Başlayanlar İçin PHP’de MVC
  2. MVC Uygulaması İçin İlk Adımlar: App Sınıfı
  3. MVC’de Giriş Sayfası, Ayarlamalar ve İlk Controller
  4. Controller ve View Çekirdek Sınıflarını Oluşturmak
  5. Model Katmanı ve Veritabanı İşlemlerini Kolaylaştırmak (Şu an buradasınız)
  6. Proje/Uygulamanın Deposu
  7. Uygulamanın bitmiş halini indirin

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir