Yii ile Uygulama Geliştirme #2

Y

Yii Framework ile uygulama geliştirmeye kaldığımız yerden devam ediyoruz (Serinin tüm yazıları). Bu yazıda, oluşturduğumuz modelları inceleyeceğiz.

Öncelikle projenin varsayılan controller ayarını faculty olarak değiştirelim. Bunun için /protected/config/main.php içerisinde defaultController değerindeki site yerine, faculty yazmak yeterli. Eğer “defaultController” değeri oluşturulmamışsa “basePath” altına manuel olarak oluşturun.

Bu değişikliğin ardından uygulama direkt olarak facultyController üzerinden açılacaktır. Faculty model ile devam edelim. Daha önce de bahsettiğimiz gibi, Yii Framework’te model dosyaları /protected/models dizini altında tutuluyor. Burada şimdilik 3 tane model mevcut: Faculty, LoginForm, Department.

Bu modelları Gii Tool üzerinden oluşturabileceğimiz gibi, sınıfı kendimiz de extend edip kullanabiliriz.

Faculty sınıfı, Ruby on Rails kullananların aşina olduğu ActiveRecord tasarım şablonunun Yii’deki karşılığı olan CActiveRecord’tan extend edilmiştir. Dolasıyla sınıf içerisinde herhangi bir insert ve update metodu görmezseniz bu süpriz olmayacaktır. Sebebi bu metodların kalıtım ile CActiveRecord üzerinde bulunmasındandır. Sınıfı aşağıdaki gibidir:

[code lang=”php”]

class Faculty extends CActiveRecord
{

public static function model($className=__CLASS__)
{
return parent::model($className);
}

public function tableName()
{
return ‘faculty’;
}

/**
* @return array validation rules for model attributes.
*/
public function rules()
{
return array(
array(‘name’, ‘required’),
array(‘name’, ‘length’, ‘max’=>50),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array(‘id, name’, ‘safe’, ‘on’=>’search’),
);
}

public function relations()
{
return array(
‘department’ => array(self::HAS_ONE, ‘Department’, ‘id’),
);
}

public function attributeLabels()
{
return array(
‘id’ => ‘ID’,
‘name’ => ‘Name’,
);
}

public function search()
{
// Search
}
}

[/code]

Daha rahat okunması için sınıfı biraz sadeleştirdim.

Model içerisindeki en önemli metodlardan bir tanesi rules() metodudur. Bu metod, veritabanı üzerindeki tasarımın model üzerindeki karşılığıdır. Kolonların tipleri, uzunlukları, gereklilikleri gibi birçok şartı, kolon bazlı ve toplamda array olarak bulundururlar. Bu şekilde, model validate ederken yapılacak işler kısa ve kolay olur.

Şimdi rules() metoduna biraz yakından bakalım:

[code lang=”php”]

return array(
array(‘name’, ‘required’),
array(‘name’, ‘length’, ‘max’=>50),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array(‘id, name’, ‘safe’, ‘on’=>’search’),
);

[/code]

Önceki yazıda oluşturduğumuz alanların doğrulanmasını içeren çeşitli kuralları görüyoruz. Örneğin; “name” alanını “not null” ve varchar(50) olarak tanımladığımız için, bu kurallar aynen model içerisine yansıdı. Veritabanındaki alanlara daha fazla kıstas eklersek, Gii Tool aracılığıyla bunların da karşılıklarını görebiliriz.

Fakat bazen veritabanında karşılığı olmayan kurallara ihtiyacımız olabilir; örneğin parola için minimum ve maksimum uzunluk kontrolü gibi. Yi Framework bu ve benzeri durumlarda ayrı metodlar tanımlamak yerine, aynı array içerisinde farklı bir kural tanımlamaya olanak sağlıyor. Adı password olan bir alan için bu kuralı oluşturalım:

[code lang=”php”] array(‘password’, ‘length’, ‘min’=>6, ‘max’=>12),
[/code]

Böylece password alanı için minimum 6 ve maksimum 12 karakter kuralı tanımladık. Artık validation işlemi sırasında bu kuralın da doğrulanması gerekecek. Doğrulama olmaz ise hata verilecektir.

Yii’nin çok sayıda kural kıstası mevcuttur, bu kurallar RegEx’i de desteklediğinden, kural olarak neredeyse her şeyi ekleyip kullanabilirsiniz.

Örneğin kayıt işlemleri sırasında parolaların iki kez girilmesi güvenlik açısından önemlidir. Yii Framework bunu da düşünmüş:

[code lang=”php”] array(‘password’, ‘compare’, ‘compareAttribute’=>’password2’, ‘on’=>’register’),
[/code]

Register işlemi sırasında password ile password2 girişleri karşılaştırılır, eğer aynı değer girilmemişse hata verilecektir.

Faculty sınıfının rules metodunda ‘safe‘ isimli; id ve name’e atanmış bir kural daha görüyoruz. Tahmin edeceğiniz gibi, bu kural belirtilen alanlar için yapılan girişlerin yapısını kontrol eder.

Rules metodunun hemen altında relations() metodu bulunmaktadır. Bu metod ise, veritabanı tasarlarken eklenen tablo ilişkilerini göstermektedir. Örnek uygulamada, faculty-department tabloları arasında bir foreing key ilişkisini göstermektedir. Bu ilişkiler de tıpkı rules için olduğu gibi manuel olarak arttırılabilir.

[code lang=”php”]</pre>
return array(
‘department’ => array(self::HAS_ONE, ‘Department’, ‘id’),
);
<pre>[/code]

Bahsettiğimiz ilişki mantıksal olduğu kadar fizikseldir de. Faculty modelından alınan bir örnek -instance- üzerinden departmanlara ait bir array çağırılabilir:

[code lang=”php”] $model -> department; // returns an array
[/code]

Sonraki metod attributeLabels() ise tablodaki alanların view katmanında kullanılacak isimlerini array olarak return etmektedir. Değerleri değiştirebilirsiniz. Sonuçlarını görmek için ‘Name’ yerine ‘Fakülte Adı‘ yazalım.

Metodların sonucusu olarak search() geliyor. Metod içerisinde yeni bir Criteria (kriter) oluşturulup arama yapılmaktadır. Özelleştirilebilir.

Ayrıca modelları özelleştirmek için daha fazla action kullanılabilir. Bunlar arasında en sık kullanılanlar beforeSave() ve beforeValidation() metodlarıdır. Kayıt ve validate öncesi yapılacak işlemleri bu metodlar altında yapabilirsiniz. Eğer metodlar override edilmezse çağırılmayacaktır.

Projenin model tarafı için söyleyeceklerim bu kadar. Faculty model için söylenenler doğrultusunda, benzeri olan Department’ı inceleyebilirsiniz.

Bir sonraki yazıda projenin Controller yapısı üzerinde duracağım.

3 Yorum

Oğulcan

Arşivler

Kategoriler