Tamamen PHP Odaklı çerçeve Nesne

12 Cevap php

Ben hiçbir usuli tüm programlama, ve burada her şey bir nesnedir PHP ile% 100 nesne yönelimli bir çerçeve oluşturmak istiyorum. Bunun dışında Java gibi çok PHP yapılacaktır.

Bu şey olmalıdır özellikleri ne de herhangi bir işaretçiler, böyle MVC gibi mevcut tasarım desenleri herhangi birini kullanmak gerekir? Nasıl veritabanındaki her tablo için nesneleri oluşturmak mümkün olacaktır, ve vb HTML şablonları görüntüleme nasıl yapılabilir ki?

Ben esas olarak bir öğrenme excercise olarak kendi başıma yapmak istiyorum çünkü varolan çerçeve bağlantı yoktur. Sen will cevap olarak varolan bir çerçeveye bağlayan ve 'bu ne istediğinizi yapar' diyerek için downvoted edilebilir.

Ben istiyorum bazı özellikleri şunlardır:

  • Çok kolay CRUD sayfası oluşturma
  • AJAX tabanlı pagination
  • Ajax tabanlı form doğrulama mümkünse, ya da çok kolay form doğrulama
  • Sortable masalar
  • PHP kullanarak HTML şablonları düzenlemek için yeteneği

12 Cevap

Ben listenizde sorunların çoğunu geçirdiği, bu yüzden bana ben hallederim nasıl spec izin verdim. Ben de bağımlı OOP ve (doğru yapılırsa) henüz zarif nesne teknikleri son derece esnek ve güçlü buluyorum duyuyorum.

MVC - Evet, eller aşağı, MVC web uygulamaları için bir standarttır. Bu iyi belgelenmiş ve anlaşılabilir modelidir. Ayrıca, bu sınıf düzeyinde yapar, yani, o ayrı şeyler tutar ne cepten uygulama düzeyinde yapar. MVC güzel ek Intercepting Filter modelidir. Öncesi ve sonrası işleme isteği ve yanıtı için filtreler eklemek için yardımcı olur. Ortak kullanım istekleri, kıyaslama vb erişim denetimi, önbelleğe alma, oturum açıyor

OOP representation veritabanı tabloları / satır da mümkündür. I günlük olarak DAO ya da ActiveRecord kullanın. ORM sorunlara yönelik bir diğer yaklaşım Row Data Gateway ve Table Data Gateway olduğunu. İşte example implementation TDG ArrayAccess arabirimini kullanan bulunuyor.

HTML templates, aynı zamanda bir nesne olarak temsil edilebilir. Ben Smarty şablon motoru ile birlikte Görüntüle nesneleri kullanın. Ben bu teknik son derece esnek, hızlı ve kullanımı kolay bulacaksınız. Görüşünü temsil Object __set yöntem çok her özellik Smarty şablon içine yayılır alır uygulamalıdır. Ayrıca __toString yöntemi yuvalama görüşlerini desteklemek için uygulanmalıdır. Örneğe bakın:

$s = new View();
$s->template = 'view/status-bar.tpl';
$s->username = "John Doe";
$page = new View();
$page->template = 'view/page.tpl';
$page->statusBar = $s;
echo $page;

İçeriği view/status-bar.tpl:

<div id="status-bar"> Hello {$username} </div>

İçeriği view/page.tpl:

<html>
<head>....</head>
<body>
    <ul id="main-menu">.....</ul>
    {$statusBar}
    ... rest of the page ...
</body>
</html>

Sadece echo $page ve iç görünümü (durum çubuğu) gerek bu şekilde otomatik olarak HTML dönüşecek. complete implementation here bak. Bu arada, HTML altbilgi ve üstbilgi ile döndü görünümü sarabileceğiniz Filtreler Intercepting birini kullanarak, böylece denetleyicisi tam sayfa döndürme hakkında endişelenmenize gerek yok.

Ajax kullanmak veya isteyip soru da tasarım zaman önemli olmamalı. Çerçeve doğal Ajax desteklemek için yeterince esnek olmalıdır.

Form validation Kesinlikle OO şekilde yapılabilir bir şeydir. Kullanarak karmaşık doğrulayıcı nesne oluşturmak Composite pattern. Kompozit doğrulayıcı form alanları ve atanan basit doğrulayıcılarıyla yineleme ve size Evet / Hayır cevabını vermelidir. Eğer formu güncelleme böylece O da (Ajax veya sayfayı yeniden yoluyla) hata iletileri dönmelidir.

Başka bir kullanışlı unsur kullanıcı arayüzü uygun olması için db verileri değiştirmek için otomatik çeviri sınıftır. Örneğin, sen sadece başka içine bir atanamıyor boş dize veya "on" _POST veya _GET dizide sonuçları HTML Boole devlet ve kullanımı onay kutusunu temsil db INT (1) alan varsa. Veri Görünümü veya db için uygun olması değiştirir çeviri hizmeti olan veri sanitasyon temiz bir yoludur. Ayrıca, çeviri sınıfının karmaşıklığı bile (HTML içine the one converting Wiki syntax gibi) çok karmaşık dönüşümler sırasında çöp senin denetleyicisi kod yok.

Ayrıca i18n sorunlar nesne yönelimli teknikleri kullanılarak çözülebilir. Ben lokalize iletileri almak için __ fonksiyonunu (çift çizgi) kullanarak gibi. Yerine bir arama yapmak ve mesaj dönen fonksiyonu bana daha sonra arama için Proxy nesne ve ön kayıtları mesajı verir. Vekil nesne görüntüle içine itilir VE Görünümü HTML dönüştürülür ediliyor kez, i18n backend tüm önceden kayıtlı mesajları için görünüyor. Döndüren tek bir sorgu çalıştırdığınızda bu şekilde tüm iletileri istedi.

Access controll konular İş Delege desen kullanılarak ele alınabilir. Benim other Stackoverflow answer olarak nitelendirdi.

Tam odaklı nesne olduğu mevcut kodu ile oynamak isterim Son olarak, Tigermouse framework bakmak alır. Işlerin nasıl anlamanıza yardımcı olabilir sayfasında bazı UML diyagramlar vardır. Ben bunun üzerinde çalışmak için daha fazla zaman var gibi, bu projenin daha da geliştirilmesi devralmak için çekinmeyin.

Güzel bir hack var!

Şimdi kendi çerçevesi gelişmekte olan birisi aynı zamanda ederken, downvoted olma riski, en azından mevcut çerçeveler kullanarak bazı deneyimi almak için söylemek zorunda hissediyorum. Bu belki popüler olanların her biri için bazı acemi eğitimlerini yapmak deneyim büyük bir miktar olmak zorunda değildir.

, Iyi bir çerçeve oluşturmak için gereken süreyi göz önüne alındığında ne gibi içine bakmak ve mevcut çözümleri hakkında nefret zaman ayırdığınız karşılaştırıldığında soluk. Hatta sadece php çerçeveler bakmak gerekmez. Raylar, Django vb tüm bir nedeni popüler.

Bir çerçeve inşa ödüllendirici olduğunu, ancak araştırma içeri giriyor elinizde net bir plan ve görev anlayışı, ihtiyaç

Lütfen sorulara bazı yanıtlar:

  • Model View Controller paradigma web uygulamaları dünyasına iyi çevirir gibi Evet, muhtemelen MVC kullanmalısınız.
  • Lütfen veritabanı tabloları kayıtlarından modelleri oluşturmak için, ORM en ve Active Record desen içine bakmak. Ben biliyorum araştırma mevcut uygulamaları Doktrini, daha fazla burada arayarak bulunabilir içerir.
  • Şey için AJAX ben kalkmak için AJAX çok kolay yapar gibi bir başlangıç ​​noktası olarak jQuery kullanarak ve çalıştırmanızı öneririz ilgili.

İşte benim öneri:

  1. Ne yaptığınızı durdurmak.
  2. Zaten ölüm bitmiş oldu.
  3. Bu Zend Framework veya CakePHP ya da belki de bu Recess Framework tıklayın.

Şimdi, benim nedenleri:

... Eğer tüm geliştiricileri ile çalıştık, sen sebepsiz tekerleği yeniden aşk geliştiricileri ile çalıştık. Bu çok, çok yaygın bir başarısızlık modelidir.

... Onlar gidiyor ve belki düşünebiliriz crappiest dillerden yüzlerce ve binlerce yazardı ...

... "Oh, ben, bana ait her şeyi yaratmak, kendi çerçevesi oluşturmak değilim" ve hepsi olacak sadece dışarı çıkmak ve alabilir şeyler daha crappier olmalı ...

dan StackOverflow Podcast # 3.

Yani, kendinize biraz zaman kazanmak ve onların kedinin çöp kutusu temizlenmeye ihtiyacı olduğunda insanlar otomatik olarak Twitter güncellenmesine olanak sağlayan bir web uygulaması gibi insanlar için bir sorun çözen bir şey üzerinde çalışmak. "Object Oriented PHP Çerçevesi" problemi yapılır. Birlikte tokat neyse çerçevesi olarak güvenilir ya da yararlı olabilir ya da mevcut serbestçe kullanılabilir, tam olarak desteklenen çerçeveler herhangi zengin özellik asla TODAY.

Bu bir öğrenme deneyimi olamaz demek değil, neden zaman göstermek için bir şey olmadan bırakarak, kod işe yaramaz bir blob içine büyüyecek bir çerçeve oluşturarak, karanlıkta mı? , Insanların kullanımı ve zevk için bir şey bir web uygulaması geliştirmek, ben inanılmaz derecede ödüllendirici ve EDUCATIONAL deneyim bulacaksınız düşünüyorum.

Kendi çerçevesi oluşturma diğer çerçeveler başlık Üner gidiyor olabilir bazı şeyler için bir takdir kazanmak için iyi bir yoldur. Lütfen bir mükemmeliyetçi benim gibi, bu size (ben bunun için statik bir yöntem veya bir örnek yöntemi kullanmanız gerekir, örneğin bu nesne, X veya Y aranmalıdır), her küçük detay üzerinde işkence için iyi bir bahane verir eğer.

Ben (bir süre önce neredeyse tamamen OO framework) benim kendi yazdı, işte benim tavsiyem:

  • Daha önce diğer çerçeveler ile çalıştı ettiyseniz, sizin tam olarak ne istediğinizi size verir 't gibi ve emin olun yapmadım / sevdim düşünün.
  • Şahsen MVC deseni seviyorum, ben onsuz bir proje yapmanın hayal olmaz. Eğer MVC gibi Eğer zahmet etmeyin yoksa, bunu.
  • Javascript / Ajax şeyler yapmak istiyorsanız, bir Javascript kütüphanesi kullanırım. Sıfırdan tüm kendi Javascript kodlama size genel DOM ve Javascript hakkında biraz öğretir, ama sonuçta zaman onun bir atık, daha iyi yerine app / çerçeve yapma odaklanmak.
  • Başka bir çerçeve toptan kabul etmek istemiyorsanız, orada sizin gibi diğer açık kaynak bileşenleri ve {gibi Propel, Smarty olarak, kullanmak isteyebilirsiniz isteyip bakmak [(2)]} ya da PEAR components. Kendi çerçevenin yazılması mutlaka sıfırdan her şeyi yazmaya anlamına gelmez.
  • Onlar (belki de veritabanı erişimi için örneğin singletons) mantıklı, ama onların üzerinde takıntısı olmayan yerlerde tasarım desenleri kullanın. Sonuçta etkileyicisi kodu üretir düşünüyorum ne yapmak.
  • Son olarak, ben biraz içine inerek bir şey öğrendim Ruby on Rails philosophy, Sen RoR (ben yaptım) kullanmak asla olabilir, ancak bazı kavramları (Yapılandırma üzerinden özellikle Convention), gerçekten benimle rezonansa ve gerçekten etkiledi benim düşünce.

Ihtiyaçlarınız özel sürece onlar varolan bir çerçeveyi kabul eğer sonuçta, çoğu insan daha verimli olacaktır. Ancak, reinventing the wheel does teach you more about wheels.

Glib sondaj riski az, bu anlamda, başka bir yazılım projesi gibi geliyor bana:

Sen motivasyon ve öncelikleri de dahil olmak üzere, açıkça gereksinimlerini tanımlamak gerekir:

  • NEDEN bu do? Eğer gerçekleştirmek için umut önemli faydaları nelerdir? Cevap "hız" ise bunun "öğrenme deneyimi" eğer bir thid yapabilir, başka ne olabilir "kodlama kolaylığı" eğer, bir şey yapabilir

  • Eğer çözmeye çalışıyoruz başlıca sorunlar nelerdir? Ve hangi en önemli? Güvenlik mi? Kolay UI nesil? Ölçeklenebilirlik?

Gerçekten yukarıdaki bu gibi soruların cevabını bağlıdır "özellikleri ne olmalıdır" cevabı.

Ben başlangıçta kendi benzer idealleri ile kendi çerçevesini oluşturmaya başladı. Ancak, birkaç ay sonra ben defalarca yapıldığını işi yeniden yaratmak olduğunu fark etti. Sonunda kolayca genişletilebilir bir açık kaynak çerçevesi bulunan ve kendi gelişimi için bir temel olarak kullanılır.

Özellikleri kendimi hayata:

  • MVC Mimarisi
  • Kimlik doğrulaması nesne
  • Veritabanı erişim sınıfı
  • URL yeniden yapılandırma
  • Pagination sınıf
  • E-sınıfı
  • Şifreleme

Ben de baktım ve düşündüm özellikleri unutun! Ben birinin birinin üstüne inşa edeceğiz:

  • Önbellekleme sınıf
  • Form doğrulama sınıfı
  • FTP sınıf
  • Plugin-yetenek sınıfları

Tabii ki, açık kaynak seçeneklerini geride bir çerçeve yazma mümkün, ama neden rahatsız olur?

Ive got the perfect link for you my friend (please don't down vote) http://nettuts.com/tutorials/php/creating-a-php5-framework-part-1/ This is an awesome tutorial I have looked at, and its not too overwhelming. Plus look around the PHP section of that site I saw an article on CRUD. As for the ajax look elsewhere, but you have to start somewhere, and this tutorial is awesome.

Not: Bu öğretici 3 parça var ve ben ikinci taksit MVC getirir düşünüyorum, ama diğer yöntemleri kullanarak ilk bölümü başlar.

Jim OHalloran dediğim gibi, kendi çerçevesi yazarken size diğer çerçeveler şeyler yapmak nasıl içine çok iyi bir fikir verir.

Ben neredeyse tamamen herhangi bir SQL abstracted bundan önce bir veri erişim katmanı yazdım, dedi. Uygulama kodu, ilgili nesneyi talep edebilir ve soyutlama katmanı gereksiz yeniden almak, bu değiştirildi yalnızca kaydedilir ve farklı veritabanları üzerinde bazı nesneler koyarak desteklenmiyor değil, ihtiyaç, yalnızca veri getirmek için büyü çok yaptım. Ayrıca çoğaltılmış veritabanları desteklenir ve çoğaltma lag saygı, ve akıllı bir koleksiyon nesnesi vardı. Aynı zamanda son derece genişletilebilir oldu: çekirdek parametre sürüldü ve ben kod yaklaşık 15 hatları ile yepyeni bir nesne ekleyebilirsiniz - ve ücretsiz tüm büyüsü var.

Ben de bir sitenin önemli bir yüzdesi için kullanılan bir CRUD taslak motorunu yazdık. Eğer bir parametre listesi yazdı kez, her şey için liste ve sayfaları düzenlemek çalıştırabilir böylece çekirdek parametresi sürüldü. Otomatik sayfalama yaptım, tasarruf-yeni-delete yukarıda nesne katmanı yararlanarak, vs vs desteği. Bu kendi içinde ve nesne yönelimli değil, ama o kadar yapılmış olabilir.

Diğer bir deyişle, PHP bir nesne yönelimli bir çerçeve sadece mümkün değil, çok verimli olabilir. Bu MEZUNLARI, tüm PHP 4 oldu, ve ben PHP 4 kez birkaç nesneleri ile olası ne tosladı. :-)

Ben kadar nesneleri olarak adlandırılan merkezi sevkiyat gibi asla, ama ben çok uzakta değildi. Ama, bunu çeşitli çerçeveler ile çalıştık ve dosya düzenini hızla tüylü alabilirsiniz. Bu nedenle, ben o artık olması ve ihtiyacı olarak sadece karmaşık bir sevk sistemi için giderdim. (Zaten neredeyse MVC olduğu) basit bir eylem / görünüm size çok daha yeterli almak gerekir.

Bazı geliştiriciler iyi bir neden için tekerleği yeniden icat doğrudur. Zaten vardır çünkü ama iyi çerçeveler çevresindeki tek kendin yapmanın zaman kaybı olduğu anlamına gelmez. Ben bir egzersiz daha fazla şey için kullanma niyeti ile bir süre önce birine başladı. Ben çok yapıyor tavsiye ederim.

Sorduğun için teşekkürler.

Ben yeni bir çerçevede bakmak istiyorum, bir, büyük satış noktası testable kod kolay yazma yapmak olduğunu ifade etti.

Biz genellikle Zend Framework ile çalışmak, ve çoğunlukla harika, ama birim test / test drive ZF-tabanlı kod çalışıyor mazoşizm kadar kısa değil.

Bize hala bize ZF kütüphane parçalarını kullanmak için izin iken, test edilebilir kod yazmak için izin verir bir şey ile ZF MVC parçaları yerine bir çerçeve sağlayabilir, ben olacak - kelimenin tam anlamıyla - sana bir bira ısmarlayayım.

Eğer Ajax hendek eğer [Düzenle] sana iki bira ısmarlayayım. OO PHP çerçevesinde ve bir Javascript çerçevesinde arasında büyük bir uçurum var.

Ben birkaç yıl boyunca üzerinde çalıştığım tam olarak aynı şeyi inşa etmek için arıyor ve sonuç Çevik Toolkit.

Very easy CRUD page generation

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

AJAX based pagination

Tüm sayfalama ve diğer pek çok şey AJAX ve Nesne Reloading için doğal destek yoluyla uygulanmaktadır. Aşağıdaki kodu rastgele etiket temalı bir düğme gösterir. Yeni sayısını gösteren tıklandığında ise Düğme yeniden.

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

Ajax based form validation if possible, or very easy form validation

Tüm form doğrulamaları AJAX tabanlı. Sunucu yanıtı vurgulamak ve ekran hata iletisi veya bir sonraki sayfaya yönlendirme ya da herhangi başka bir javascript eylemi gerçekleştirmek amacıyla da tarayıcı bildirir bir JavaScript zinciridir.

Sortable tables

Tablo sıralama ve sayfalama zaman gerçekten nesne tekrar yükleme üzerinde olabildiğince çok sezgisel ve basit bir uygulama vardır.

Ability to edit HTML templates using PHP

Bu yer ve yapmak için yanlış bir şey dışında görünüyor. Şablonlar VCS daha iyi.

Benim cevabım 1 yıl sonra son ama görebilirsiniz ben bir şey yiiframework.com