Bir PHP uygulama soyut veritabanına en iyi yolu nedir?

9 Cevap php

Benim soru nasıl bir soyut bir uygulama modeli tabakasından bir veritabanı bağlantısı yok mu? Birincil endişe kolayca veritabanları farklı türde değiştirmek mümkün olmaktır. Belki düz bir dosya, virgülle ayrılmış veritabanı ile başlar. Sonra bir SQL veritabanı taşımak istiyoruz. Sonra sonra bir LDAP uygulama daha iyi olurdu karar. Nasıl bir kişinin kolayca böyle bir şey için planlayabilirsiniz?

Basit Örneğin, bir ilk adı, soyadı ve e-posta ile bir kullanıcı var diyelim. O (ortak örnek değişkenleri ile sorunları görmezden lütfen) gibi görünebilir temsil eden çok basit bir PHP sınıfı:

<?php

class User {
  public $first;
  public $last;
  public $email;
}

?>

Insanlar gibi gömülü SQL sahip bir DAO sınıf var nerede sık gördük:

<?php

class UserDAO {
  public $id;
  public $fist;
  public $last;
  public $email;

  public function create( &$db ) {
    $sql = "INSERT INTO user VALUES( '$first', '$last', '$email' )";
    $db->query( $sql );
  }
}

?>

Bu gibi stratejiler ile benim sorun sizin veritabanı değiştirmek istediğinizde, 'oluşturmak, güncellemek, yük, veritabanı yeni bir tür anlaşma fonksiyonlarını silmek her DAO sınıf değiştirmek zorunda olduğunu. Eğer (Ben özellikle bir hayranı değilim ki) onları otomatik oluşturmak için bir program olsa bile, bunu şimdi çalışması yapmak için bu programı düzenlemek zorunda kalacak.

Bu nasıl işleneceğini için önerileriniz nelerdir?

Benim şu anki fikrim, DAO için süper bir sınıf, kendi oluşturduğunuz metin nesneleri oluşturmak, silmek, güncelleme, yük fonksiyonları etmektir. Ancak, bu işlevler DAO niteliklerinden dizileri almak ve sorguyu kendisi üretecektir. Bu şekilde, tek SQL oldukça çeşitli sınıflara dağılmış olan fazla SuperDAO sınıftadır. Eğer veritabanı katmanı değiştirmek istedim sonra, sadece SuperDAO sınıf sorguları oluşturur nasıl değiştirmek gerekir. Avantajları? Dezavantajları? Öngörülebilir sorunlar? Iyi, kötü ve çirkin?

9 Cevap

Bir kullanarak ORM, genellikle veritabanı soyutlama tercih edilen yoldur. PHP uygulamalarının bir eksik listesi Wikipedia kullanılabilir.

Konu için aslında çözüm olarak "nerede veri erişim mantığı uygulamak için?" karmaşık değildir. Hatırlamak zorunda Tüm model kodu, veri erişim kodu ayrı olmasıdır.

Gibi:

Bazı iş mantığı Kanala :: isim () yöntemi ile model katman

class User 
{
  public $first;
  public $last;
  public $email;
  public function name ()
  {
      return $this->first." ".$this->last;
  }
}

Veri erişim katmanı:

class Link
{
    $this->connection;
    public function __construct ()
    {
        $this->connection = PDO_Some_Connect_Function();
    }
    public function query ($query)
    {
        PDO_Some_Query ($this->connection, $query);
    }

}

class Database
{
    public $link;
    public function __construct ()
    {
        $this->link = new Link();
    }
    public function query ($query)
    {
        $this->link->query ($query);
    }
}

class Users
{
    public $database;
    public function __construct (&$database)
    {
         $this->database = &$database;
    } 
    public save ($user)
    {
        $this->database->link->query ("INSERT INTO user VALUES( '$user->first', '$user->last', '$user->email' ))";
    }

Kullanımı:

$database = new Database();

$users = new Users();

$users->save (new User());

Bu örnekte her zaman (Bu bağlantıyı değiştirmek gibi herhangi bir sunucu üzerinde kullanıcıların tasarruf anlamına gelir) ne olursa olsun sorguları çalıştırmak olacak veri erişim sınıfı Linki değiştirebilirsiniz açıktır.

Aynı zamanda bağımsız yaşıyor ve ve nesneleri tasarrufu hiçbir fikri vardır temiz modeli katman kodu var.

Ayrıca burada Veritabanı sınıf gereksiz görünüyor ama aslında o bir projede birçok db bağlantıları için birçok bağlantıları bir örneğini toplama gibi büyük fikirlere doğum verebilir.

Ayrıca tek bir dosya olduğunu ve basit denilen yüce çerçeve db.php (http://dbphp.net) burada anlatılan desen üzerine inşa ve hatta tamamen standart sql alanını kontrol etme yeteneği ile otomatik olarak tabloları oluşturur ki / tablo ayarları ve modeline istediğiniz her zaman için senkronizasyon veritabanı yapısı.

Bu tür PDO, PEAR :: mdb2 veya Zend_Db'nin gibi çeşitli çerçeveler kullanabilirsiniz, ancak PHP gelişme 12 yıl içinde dürüst olmak gerekirse, ben başka bir veri depolama altyapısı türünden diğerine geçiş hiç ettik.

Onun bile MySQL SQLite gibi oldukça benzer bir şey, gitmek son derece nadirdir. Bundan daha fazlasını yaptım, yine çok büyük sorun olurdu.

Sen PDO library. içine bakmalı

PDO kullandığınız olursa olsun, hangi veritabanı, sorguları çalıştırmak ve veri almak için aynı işlevleri kullanmak, yani, bir veri erişim soyutlama katmanı sağlar.

PDO bir veritabanı soyutlaması sağlamaz; Bu SQL yeniden yazabilir veya eksik özellikleri taklit etmez. Eğer bu tesis gerekiyorsa tam teşekküllü bir soyutlama katmanı kullanmak gerekir.

PHP için ORMs yaklaşık Konuyu Ödeme: http://stackoverflow.com/questions/108699/good-php-orm-library

Bu teoride kulağa hoş geliyor ama tüm olasılığına yılında YAGNI.

Bu tür PDO gibi bir SQL kitaplığı kullanarak ve oraya kadar LDAP endişesi değil, daha iyi olurdu.

Ben her zaman ADODB kullanarak sevdim. O çok farklı platformlar arasında geçiş yapabilen gibi Gördüğüm kadarıyla görünüyor.

http://adodb.sf.net

Genellikle bir veritabanı kullanarak sorun için gidiyoruz eğer uygulama veritabanının bir "marka" özgü özelliklerini kullanarak yararlanacaktır, konuşma, ve bunun için daha sağlam bir uygulama olacak.

Bu başka bir veritabanı sistemi taşımak için çok nadirdir. Eğer (Zend Framework, veya Django gibi) kitle tüketimine yönelik gevşek bağlı sistem veya çerçevede çeşit yazıyorsanız eğer gerçekçi gerçekleyen aa özelliği değer düşünebilirsiniz tek zamandır.

Axon ORM otomatik kodunuzu yeniden gerektirmeden sizin şema değişiklikleri saptar.