Nasıl PHP ORM çerçeve yapılandırılmış olacak?

6 Cevap php

Ben küçük bir ORM PHP (Object Relational Mapping) çerçeve inşa etmek istiyorum. Ben CodeIgniter tarafından kullanılan aynı kontrolörü / yöntem / değişken bir yaklaşım ile, bir MVC yaklaşımın bir karışımını yapmak istiyorum.

Orada bunu zaten orada birkaç çerçeveler vardır, fakat gibi şeyler

  • Form doğrulama
  • Sayfalara numara koyma
  • CRUD
  • Ve AJAX

Bu çerçeveler yapmak çok zordur. Sistemin işleyişi bütün nesneler kullanılarak yapılabilir olması dışında Ana amaç, prensip olarak mümkündür DRY kadar kullanmaktır. Bu özellikle form doğrulama vb CRUD için çok az tekrarlanan kod anlamına gelir

Böyle bir kayıt formu ve nasıl doğrulamak için tipik bir istek, bu çerçevede tarafından ele alınması nasıl mimarlık ne olurdu böyle bir çerçeve organize olacağını konusunda fikirler arıyor, ve ben.

Düşüncelerinizi / fikirlerinizi paylaşın lütfen. Bu, bitmiş ücretsiz bir açık kaynak çerçevesinde, olarak çıkacak.

6 Cevap

Ben muhtemelen oldukça (Zend Framework ala) formları etrafında doğrulama kuralları bina daha öneririm, sizin etki alanı nesneleri içinde doğrulama inşa etmeliyiz. Ardından doğrulama için etki alanı nesnesi doğrudan form verilerini göndermek. Ben Zend Framework kullanıyorum, ama benim doğrulama ihtiyaçları için bu temel yapısını kullanabilirsiniz:

/**
 * Contains the domain object properties.
 * @var array
 */
protected $_data = null;

/**
 * @var array
 */
protected $_filters = null;

/**
 * @var array
 */
protected $_validators = null;

public function validate($data = null)
{
	if(!$data) {
		$data = (array) $this->_data;
	} else {
		$data = array_merge((array) $this->_data, $data);
	}

	$this->_input = new Zend_Filter_Input($this->_filters, $this->_validators, $data, $options);
	$this->_input->addValidatorPrefixPath('LP_Validate_', 'LP/Validate/');
	$this->_input->addFilterPrefixPath('LP_Filter_', 'LP/Filter/');

	if($this->_input->isValid()) {
		$this->_data = (object) $this->_input->getEscaped();
		return true;
	} else {
		$this->_data = (object) $data;
		return false;
	}
}

Doğrulama ile benim şimdiki yaklaşımla bazı sınırlamaları ben nesne özellikleri ve doğrulama işlevini çalıştırdıktan sonra mevcut nesne için orijinal verileri tutmak için bir yol anlamaya ihtiyacımız olduğu gerçeğine gerekli özel belirleyiciler arayamam ki . Ama aksi takdirde şimdiye kadar iyi çalıştı.

Bildiğim kadarıyla CRUD ilgili olarak, cevap size hitap etmek istiyorum ve kısmen ne desen size aşina ve t uygulamak denemek istiyorum '/ don yok gibi t ve' / don yok sorunların karmaşıklığı kısmen bağlıdır .

Açıkçası uygulamak için en sağlam tasarım ayrı Alan Nesne üstüne oturan Veri Eşleyicisi'ne kullanmaktır. Ancak, çoğu durumda bu overkill olduğunu ve bu nedenle sadece Active Record desen kötülenen (uygunsuz) çok kullanabilirsiniz. Bu CodeIgniter ve Zend Framework sağladıkları ne yaptıklarını temelde.

Benim tasarım ve çalıştı oldukça kaygan Veraset Haritalama davalarını gerekli çünkü Veri Mapper deseni kullanan özel bir ORM katmanı oluşturmak zorunda sona erdi ama ben tablo ile birlikte meta haritalama işlevsellik kaybetme pişman ve Satır Geçidi yok Zend Framework uygulamaları. (Etkili ben bunu nasıl yaptığını bana göstermek istediğiniz veri Mappers kullanarak meta eşlemesi oluşturmak için bir yol bulabilirsek:. P). Kendi inşa etmek için çalışıyoruz olsa da, bunu ben gördüm iyi PHP kod bazı vardır ve çok yakından standart tasarım desenleri aşağıdaki gibi Zend Framework bakarak düşünebilirsiniz.

Bir Numaralandırma sınıfta görmek güzel olurdu bir şey limiti fıkra sayfa göstermesi gerekir değerlerin ne aralığına dayalı sorguya uygulanabilir şekilde bir veritabanı nesnesine doğrudan kravat yeteneği olacaktır. Aksi takdirde, pagination ile anahtar bileşenleri geçerli sayfanın takip, sayfa başına görüntülenecek kayıt sayısını ve iterated için değerleri içeren koleksiyon nesne çeşit tutmak için vardır.

Ama en azından, size tüm koleksiyonu önceden yüklemek ve daha sonra bu büyük bir performans isabet sağlayacak gibi sadece kayıt belirli bir aralık görüntü yok emin olmak istiyorum.

Bildiğim kadarıyla Ajax istekleri ile ilgili olarak, ben bir HTTP istek özellikle bu bağlamda dayanarak bunu işleme sonra bir XHR ya da değil ve olup olmadığını kontrol edebilirsiniz bağlam yardımcısı çeşit bina öneririz.

Eğer çok daha kolay ve hızlı bir şekilde sıfırdan bir yazı daha yapmak için ne arıyor başarmak orada iyi açık kaynak çerçeveler bir yeri vardır! Bana çerçeve geliştirme ve nesneye yönelik tasarım hakkında çok şey öğretti ben geliştirilmiş bir MVC framework vardı, o söyledikten sonra. Eğer çok zaman var ve (oldukça iyi bir çerçeve ile sona erebilir) bir öğrenme deney olarak bunu yapmak istiyorsanız önerilir.

Bildiğim kadarıyla bir ORM çerçeve senin fikrin olarak ... Ben ORM ne olduğu hakkında bazı karışıklıklar olabilir düşünüyorum. ORM alma ve veri depolama taşıma, ilişkisel veritabanı için nesneleri eşleştiren bir tekniktir. Genellikle geniş bir çerçeve içinde bir bileşen olduğunu ve mutlaka çerçeve kendisi karakterize etmez. Çoğu kişi bir uygulama inşa edilebilir hangi temel Model-View-Controller mimarisi, MVC çerçevesi etrafında atmak.

Bazı PHP çerçeveler out-of-böyle yapıyorsun ilgi ne gibi kutu işlevsellik, daha sağlar.

Yani, bu konuda diğer konuları var, ama zaman var ve öğrenmek istiyorsanız, kendi çerçevesi oluşturmak, söyleyebilirim. Eğer mümkün olduğunca kolay ve zaman kısa sürede bir şeyler yapmak istiyorsanız, birçok mevcut çerçevelerin birini kullanın.

Eğer kullanabilirsiniz gabriel1836 ama bir düzgün tekniği ile Büyük yazılan Matthew Weier O'Phinney o modele formu "takmak" ve girdi filtreleme ve doğrulama için kullanmak için bir tekniği gösterir nerede tarafından işaret edilir. Çok ZF özel ama kullanışlı gelebilir.

Zend ile git, sen her model nesne tabloları her "bağlantılı" böylece yapabilir, size oldukça iyi gerektiğini söyledi her şeyi kapsamaz.

Bu ile başlayan http://www.zendframeworkinaction.com/ onun iyi bir kitaba bir göz atın. Zend ile gitmeyin bile, size bu yapı nasıl bir şey öğretmek (siz de kendi, onun harika bir başlangıç ​​noktası işçiliği ile tekerlekler hakkında çok şey öğrenmek istiyorsanız karar verirseniz!) Olacak

I http://www.qcodo.com bakmak için teşvik edecek. Bu "Code Generator" ile CRUD bulunuyor inanılmaz derecede güçlü ve açıkladık ihtiyaçlarını karşılamak gibi görünüyor.

OT dediği gibi, AJAX ve Sayfalandırması esnek yeterli bir şekilde uygulamak için çok zordur. Bu ekranda ne farkında olmak çerçeve gerektirir, ancak çerçevelerin çoğu sadece HTML üretmek ve istemci tarafı sunumu konusunda kendilerini endişe etmeyin.

Web Kullanıcı Arayüzü Framework için açık bir ihtiyaç vardır.

I Agile Toolkit içine bakmak düşündüren değilim bu yüzden. Muhtemelen Aşağıdaki örnek basit entegre AJAX gücünü görmek için yapacaktır:

$b=$page->add('Button')->setLabel(rand(1,100));
$b->js('click')->reload();

Bu, bir etiket olarak rastgele bir sayı ile sayfada bir Button üretecek. Düğmesine tıklamak size yeni bir numara gösteren düğme içeriğini yeniden AJAX isteği kullanacağız.

Böyle vakıf ile çok AJAX-dostu bir şekilde bir sayfa numaralarını inşa nasıl hayal bir çırpıda. Çok kötü paginator zaten uygulanan ve araç seti ile geliyor.

Diğer konuları kapsayacak. CRUD ayrıca bir sınıf / nesnedir.

$page->add('CRUD')->setModel('User');

Ve Form doğrulama sunucu tarafında yapılır fakat hatalar güzel görüntülenir. Tüm formlar AJAX istekleri kullanılarak gönderilmektedir.