Akışın Modellemesi


    × Bunları biliyor muydunuz?
"Kontrolcü yöntemlerine parametre olarak enjekte edilen sınıfların örneklerine aynı zamanda görünmlerinden de erişebilirsiniz."


Modeller genellikle MVC mimarisinin en karmaşık kısmıdır. Kod yoğunluğunun en fazla olduğu ve görünümlere gönderilmek üzere verilerin depolandığı bölümdür. Gerek PHP kodları gerekse de Database komutları bu yapılar üzerinde tasarlanır. Genellikle kullanıcıların en çok yaptığı hata bir modelin alması gereken sorumluluğu kontrolcüye vermeleridir. Bir kontrolcü sadece kullanıcı girdilerine göre süreci yönlendirmek gibi basit kodların yer aldığı bölüm olmalıdır. Bunların dışında kalan tüm kodsal işlemler model içerisinde yer alır. 

Model dosyaları Models/ dizini içerisinde oluşturulur.

 

 

# Bölüm Başlıkları


# Model Dosyası Oluşturmak

# Modelin Kontrolcüye Dahili

# Internal Model Tasarımı
# Dev Model Genişletmesi
# İlgi Model Genişletmesi

 

 

# Model Dosyası Oluşturmak


Aşağıdaki gibi örnek bir model dosyası oluşturabilirsiniz.

File: Projects/Frontend/Models/UsersModel.php
<?php 
class UsersModel extends ZN\Model
{
    public static function rowId(Int $id)
    {
         return DB::whereId($id)->users()->row();
    }
}
Modelin Kontrolcüye Dahili

Tek yapmanız gereken modelinizi kontrolcü içinde çağırmaktır. Eğer model ile kontrolcü adı aynı olursa model sınıfınızı kontrolcüde takma isimle kullanmanız gerekmektedir. Bu durum zaten Nesne Yönelimli Programlamanın bir kuralıdır. 

File: Projects/Frontend/Controllers/Users.php
<?php namespace Project\Controllers;

use UsersModel;

class Users extends Controller
{
    public function main()
    {
         output( UsersModel::rowId(5) );
    }
}

 

 

# Internal Model Tasarımı


Oluşturacağınız dinamik model sınıflarınızı Model::method() formunda kullanmak için class adının başına Internal ön getirerek tanımlayınız. Normal şartlarda sınıf yöntemi statik değilse yukarıdaki formda erişilemez. Ancak statik tanımlamalar bazı kullanımları kısıtladığı için sınıf tasarımları dinamik formda gerçekleştirilir. Bu dinamik tanımlamalara rağmen yöntemlere statik erişmeniz bu ön ek sayesinde mümkündür.

<?php
class InternalUsersModel extends ZN\Model
{
    public function rowId(Int $id)
    {
        return DB::whereId($id)->users()->row();
    }
}

Yukarıdaki tanımlamadan sonra model dosyasını aşağıdaki gibi kullanabilirsiniz.

output( UsersModel::rowId(1) );

Yukarıdaki tanımlamadan sonra model dosyasını aşağıdaki gibi kullanabilirsiniz.

File: Projects/Frontend/Controllers/Users.php
<?php namespace Project\Controllers;

use UsersModel;

class Users extends Controller
{
    public function main()
    {
         output( UsersModel::rowId(5) );
    }
}

 

 

# Dev Model Genişletmesi


Grand Model genişletmesi veritabanı yöntemlerini daha kullanışlı ve pratik hale getirmek için tasarlanmıştır. Konunun devamı için tıklayınız. Yinede örnek vermek gerekirse yukarıda rowId() için yaptığımız tanımlamara gerek kalmıyor bu genişletme ile.

<?php
class InternalUsersGrand extends GrandModel
{
    
}

Yukarıdaki tanımlamadan sonra model dosyasını aşağıdaki gibi kullanabilirsiniz.

output( UsersGrand::rowId(1) );

Görüldüğü gibi içi boş olmasına rağmen yukarıdaki gibi bir kullanım gerçekleştirdir.

GrandModel genişletmesinin getirdiği bir sürü kullanışlı ve basit yöntemler vardır. Bu yöntemlere yukarıda verilen bağlantıdan ulaşabilirsiniz.

 

 

# İlgi Model Genişletmesi


Birden fazla tablo birleştirme için tasarlanmış modeldir. Belirli tablolar arasında ilişki kurar. Bu ilişki sayesinde ortak veri çekme, güncelleme, silme gibi işlemler ilişkili tablolarda ortak gerçekleşir. Bir nevi join işleminin modelleştirilmiş halidir. Konunun devamı için tıklayınız.

<?php

class InternalBlogCat extends RelevanceModel
{
    const relevance = 
    [
        'blog.category_id:category.id'
    ];
}