Phalcon Framework Dersleri – 6 / Modeller ile Çalışmak

Modeller, MVC’de projenin iş mantığının (business logic) oluşturulduğu veritabanı işlemleri için kullanılan katmandır. İş mantığıyla beraber doğrulama (validation) ve veri erişim (data access) işlemleri de bu bölümde gerçekleştirilmektedir. Veritabanının da ki tablolarımızın karşılığı model katmanında sınıflar ile temsil edilir. Model tek katmandan oluşabileceği gibi kendi içinde birden fazla katmandan da oluşabilir.  Phalcon’da tüm modeller Phalcon\Mvc\Model ‘inden oluşturulur.

Model Oluşturmak

Bir model Phalcon\Mvc\Model‘den extends edilir demiştik. Oluşturacağımız model sınıfı models klasörü altında olmalı. Bir Model dosyası tek bir sınıf içermelidir; class isimleri ise camel case formatında yazılmalıdır.

<?php

class Haberler extends \Phalcon\Mvc\Model
{

}

Yukarıda ki örnekte “Haberler” isminde bir model dosyası oluşturduk. Haberler sınıfının Phalcon\Mvc\Model’inden kalıtıldığını unutmayın. Bu, CRUD yani Okuma, Yazma, Güncelleme, Silme işlemleri, veri doğrulama’nın yanı sıra gelişmiş arama desteği ile birlikte birbirleri ile ilişki kurma yeteneği dahil olmak üzere işlevsellik sağlar.

Varsayılan olarak, “Haberler” modeli veritabanında “haberler” tablosuna işaret edecektir. Eğer veritabanınzda tablonun ismini farklı bir isim ile belirtmek istiyorsanız ve bu isimde model isminde kullanmak istemiyorsanız getSource() metodunu kullanabilirsiniz. Örneğin; veritabanında “prefix_haberler” diye tablomuz olsun, model ismi ise Haberler olsun;

<?php

class Haberler extends \Phalcon\Mvc\Model
{

    public function getSource()
    {
        return "prefix_haberler";
    }

}

Gördüğünüz gibi Haberler modeli “prefix_haberler” tablosuna map edildi yani eşlendi. Bunu initialize() metodu ile de yapabilirsiniz. initialize metodu istek geldiğinde ait olduğu sınıf çağrıldığında çalıştırılır.

<?php
class Haberler extends \Phalcon\Mvc\Model {
     
    public function initialize(){         
        $this->setSource("prefix_haberler");
    }

}

initialize() metodu istek sırasında yanlızca bir kez çalıştırılır demiştik, eğer her örneklemede metodu çalıştırmak istiyorsanız onConstruct metodunu kullanabilirsiniz;

<?php

class Haberler extends \Phalcon\Mvc\Model
{

    public function onConstruct()
    {
        //...
    }

}

Public özellikler ve Setters/Getters

Sınıfın içerisindeki tüm özelliklere/alanlara erişilmesinin istemeyebilirsiniz, bu durumda içeride tanımlı alanı dışarıya kapatmak için “private” deyimini alan özelliğin başına yazmalısınız. Sınıf içindeki bir alanın sınıftan üretilen obje tarafında kullanılmaması işlemine kapsülleme denir. private tanımladığınız özelliğe sınıftan üretilen nesne erişemeyecektir, fakat siz bu özelliğin sınıftan oluşturulan nesne tarafından işlenebilir fakat okunamaz olmasını isterseniz setter, okunabilir fakat işlenemez olmasını istiyorsanız getter metodunu oluşturmanız gerekmektedir. Setter / Getter’in diğer güzel özelliği ise ilgili alanlar için rahat bir şekilde validation / doğrulama yapabilirsiniz.

<?php
    class Haberler extends \Phalcon\Mvc\Model {     
        
        protected $id;     
        protected $baslik;     
        protected $tarih; 
    
        public function getId(){         
            return $this->id;
        }

       public function setBaslik($baslik){
            // Başlık Kısa 10 karakterden kısa olmasın
            if (strlen($name) < 10) {             
                throw new \InvalidArgumentException('Başlık çok kısa');         
            }              
           $this->baslik = $baslik ;
        }

       public function getBaslik(){
            return $this->baslik;
       }

       public function setTarih($tarih){   
           $this->tarih = $tarih;
       }

       public function getTarih(){
          return $this->tarih;
       }
}

Geliştirme sırasında public özellikler daha az karmaşıklık sağlar. Ancak getter ve setter uygulamanız için test edilebilirlik, genişletilebilirli ve sürdürebiliriği sağlar. Phalconun ORM’si her iki kullanıma da uygundur.

Model içerisinde Namespace kullanımı

Namespace kullanımı aynı sınıf isimlerinin çakışmasını önler.

<?php

namespace Backend\Tables;

class Haberler extends \Phalcon\Mvc\Model
{

}

Sütunlara Nesne Olarak Erişmek

Model’in her örneği veritabanında ait olduğu tabloda birer satır olarak temsil edilir. Tablo’da ki verilere kolayca nesne olarak erişim sağlayabilirsiniz. Örnek verecek olursak ;

haberler adında aşağıdaki şekilde bir tablomuz olsun;

mysql> select * from haberler;
+----+------------+------------+------+
| id | baslik     | kategori   | durum|
+----+------------+------------+------+
|  1 | Ekonomi    | ekonomi    | 1    |
|  2 | Dolar      | ekonomi    | 1    |
|  3 | Enflasyon  | ekonomi    | 1    |
+----+------------+------------+------+

haberler tablosunda id’si 2 olan dolar başlıklı haberi çekmek istiyorum;

<?php
  $haber = Haberler::findFirst(2); 
   echo $robot->baslik; // Ekrana Dolar başlığını yazdıracak.

Eğer id’si 2 olan haberin başlığını değiştirmek/güncellemek istersek;

<?php
    $haber = Haberler::findFirst(2); 
    $haber--->name = "Gayrimenkul";
    $haber->save();

Gördüğünüz gibi hiçbir sql kodu yazmadan tablodaki satırlara nesne olarak erişerek işlemlerimizi kolay bir şekilde gerçekleştirdik. Phalcon\Mvc\Modeli web uygulamaları için veritabanını soyutlamayı sağlar.

Bu kadar temel bilgilerden sonra bir sonraki makalemde Model konusunda örnekler vererek derslere devam edeceğim.