Nooku ile PHP Geliştiricisi olarak bir RAD Çerçevesinin Mühendislik İç Parçaları

Yayınlanan: 2022-03-11

Herkesin kendi araçları vardır. Bir PHP geliştiricisi olarak favorilerimden biri “Nooku” adlı Hızlı Uygulama Geliştirme çerçevesidir. Geliştirme grubunun sözleriyle: "Nooku, bir çerçeveden çok bir web geliştirme araç takımıdır".

Eğer aşina değilseniz, bir göz atın. Kolayca genişletilebilir ve yeniden kullanılabilir (başlangıçta önde gelen Joomla! geliştiricilerinden biri tarafından oluşturulmuş) yüksek düzeyde bileşenli uygulamalar üretmek için endüstri tarafından kabul edilen tasarım modellerini yoğun şekilde kullanan açık kaynaklı bir projedir. Kutudan çıktığı gibi Nooku, projeleri daha hızlı başlatmanıza yardımcı olmak için size çok sayıda hızlı uygulama geliştirme aracı sunar. Küçük ama güçlü bir örnek:

  • Tek yapmanız gereken, düzeni yazmak olan varsayılan bir MVC uygulaması (beni bağlayan şey bu)
  • Hemen HMVC kullanılabilirliği
  • Tüm verileriniz için JSON ve XML gibi farklı çıktı biçimleri desteği (yani, API'nizi dakikalar içinde ortaya çıkarın)
  • Varsayılan yönetim ve ön uç uygulamaları

Nooku'nun kalbinde "Bileşim Üzerinden Kalıtım" tasarım ilkesi vardır (aslında bu, Nooku giriş sayfasındaki ilk kavramdır. Bir satırda: birkaç nesne oluşturmak için birden çok nesnenin işlevselliğini oluşturmayı (veya toplamayı) hedeflemelisiniz. alt sınıflamaya güvenmek yerine bir tür bileşik nesne.

PHP hızlı uygulama geliştirmede (RAD) kalıtım ilkesine göre kompozisyonun görselleştirilmesi.

Bu ilke, daha az kod yazmanıza izin verir ve genellikle oldukça zarif çözümlere yol açar. Peki tam olarak nasıl teşvik ediliyor? Kod düzeyinde, en iyi örnekler, Mixins ve Kaynak/Hizmet Tanımlayıcıların kullanımıyla ortaya çıkar. Hadi bir bakalım.

bu karışım

PHP 5.4'ten önce, dilde Özellikler kavramı yoktu. Bunlar, bir nesne tarafından 'kullanıldığında' bir tür işlevsellik sağlayan (Çoklu Kalıtım'a benzer) sınıf benzeri yapılardır. Nooku yıllardır bu sorunu (PHP 5.2'den beri) Mixin ile çözüyor.

Mixin, yalnızca nesneleri birlikte oluşturmanıza izin vermekle kalmaz, aynı zamanda her bir karma nesnenin yöntemlerini bileşik nesnenin arabirimine ekler. Karıştırmayı kullanan nesne, karışık nesnenin yöntemlerini 'miras alıyor' gibi görünüyor.

 /** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @param KMixinInterface $object An object that implements KMinxInterface * @return KObject */ public function mixin(KMixinInterface $object) { $methods = $object->getMixableMethods($this); foreach($methods as $method) { $this->_mixed_methods[$method] = $object; } // Set the mixer $object->setMixer($this); return $this; }

Nooku'daki hemen hemen tüm nesneler, mixin yöntemini tanımlayan temel sınıf KObject'i genişlettikleri için bu yeteneğe sahiptir.

Nooku'nun denetleyici mimarisindeki ana sınıflar da KObject'den türemiştir. Soyut denetleyici, KControllerAbstract sınıfıdır ve incelemeyle, Karıştırma yeteneğinden hemen yararlandığını görebilirsiniz. Bu sınıfın bir örneği oluşturulduğunda, KMixinCommand ve KMixinBehavior işlevselliği hemen arayüzüne eklenir. Sonuç olarak, Nooku'daki her denetleyici, ilgili nesneler aracılığıyla Komuta Zinciri ve Davranış yönetimi işleviyle oluşturulur.

Neden tüm sınıf isimlerinin önünde K var? Nooku'nun ana kütüphanesi “Koowa” adlı koddur.

Nooku denetleyicisine geri dönersek: KMixinBehavior sınıfı, KControllerAbstract'a çalışma zamanında belirli Davranışları yükleme yeteneği vermek için tüm parçaları tutar. Davranışsal stratejiler, ayrılabilen ve diğer sınıflar tarafından kullanılabilen bir süreci veya mantığı tanımlayan sınıflardır (örneğin, düzenlenebilir, sıralanabilir). KMixinBehavior oldukça basittir ve yalnızca dört yöntemi vardır: getBehavior, hasBehavior, addBehavior ve getBehaviors. Ve bir nesneye farklı davranış stratejilerini ele alma ve kapsülleme yeteneği vermek için ihtiyacımız olan tek şey bu.

Benzer şekilde, KMixinCommand'ın yalnızca üç yöntemi vardır: getCommandContext, getCommandChain, setCommandChain. Tahmin etmediyseniz, bu üç yöntem KControllerAbstract'a bir komut zinciri uygulama yeteneği sağlar, ancak bunu çalışma zamanında yapmasına izin verir.

Bu karıştırmayı basit bir aritmetik toplama olarak düşünebilirsiniz:

Bu hızlı uygulama geliştirme çerçevesinde Nooku'nun aritmetik ekleme olarak karıştırılmasının bir tasviri.

Bize şuna benzeyen bir arayüz verir:

Bu özel RAD çerçevesinde ortaya çıkan arayüz böyle görünüyor.

Tanım olarak, Soyut sınıfların genişletilmesi amaçlanmıştır ve dolayısıyla kalıtımın sihriyle, KControllerAbstract'ın çocukları veya örnekleri olan tüm nesneler, çalışma zamanında davranış ve komut zinciri ekleme yeteneği de kazanır.

Kulağa hoş geliyor. Ama, bu tam olarak ne demek oluyor? Kısacası, Nooku bileşenleştirilmiş işlevsellik sağlar; yani Nooku, çalışma zamanında işlevselliğinizi modülerleştirmenize ve modüller arasında işlevsellikler oluşturmanıza olanak tanır.

Bu iki örnek, kompozisyonu göstermeye hizmet eder. Ayrıca, Nooku RAD çerçevesinin özünde daha fazla kompozisyon için desteğini göstermeye hizmet ederler. Bu önemli bir avantajdır. Yukarıda KControllerAbstract'a eklenen yöntemler, geliştiricilere bir satır kod yazılmadan önce değişenleri kapsüllemek için araçlar vererek “Strateji Tasarım Modeli”ni destekler. mixin() yönteminin her KObject uzantısının parçası olması, çalışma zamanında çoğu nesneye başka davranışsal yönetim arabirimlerini kolayca tanımlayabileceğiniz ve ekleyebileceğiniz anlamına gelir.

Hizmet ve Kaynak Tanımlayıcılar ve Konumlandırıcılar: Sınıf Adımı Nesnemden Ayırın

Nooku'daki Hizmet ve Kaynak Tanımlayıcıları ve Konumlandırıcıları da endişelerin ayrılması için güçlü destek sağlar.

Yine, KObject'e ve ayrıca KService'e tekrar bakalım. Nooku'daki çoğu şeyi bir hizmet veya kaynak olarak ele alabilir ve bu nedenle onları tam olarak aynı şekilde somutlaştırabilir ve sorgulayabiliriz.

Bir hizmeti, kaynak elde ettiğiniz bir şey olarak düşünün. Tüm hizmetler kaynaklardır, ancak tüm kaynaklar hizmet değildir

Bakkala gittiğinizde ve bir ürün satın aldığınızda, mağazayı Hizmet olarak düşünün, yani göz atabileceğiniz bir ürün koleksiyonu; ve Kaynak olarak ürün, yani şunlar olabilen tek bir öğe/çözüm mantığı:


  • özellikle baktı ( Oku ) (örneğin, bir kutu domates çorbasına bakarak)
  • mağazanın etrafında dolaştı (Düzenlendi) (örneğin, çorbayı ürün reyonuna taşıyın)
  • mağazanın envanterine eklenen veya envanterden çıkarılan ( A dd ve D elete) (örneğin, yeni bir tür çorba ekleyip domatesten kurtulun)

Bu örneği daha da ileri götürerek, bakkalın bir franchise departmanı olduğunu ve iş yapmak istediğinizi hayal edin. Bu durumda Hizmet, franchise departmanıdır ve kaynak, satın aldığınız bakkaldır. Bu çok bağlamsal bir sınıflandırmadır. Bir bütün olarak, bu EKMEK eylem modeli olarak bilinir (Bunların her birinin KControllerService ve KControllerResource arasında '_action', yani _actionRead() ile gösterildiğini göreceksiniz).

Bir model bir hizmet olabilir, bir tablo nesnesi bir hizmet olarak düşünülebilir, belirli bir MVC üçlüsü bir kaynak veya hizmet olarak somutlaştırılırken, hizmetin sorgulanmasından kaynaklanan belirli bir kayıt bir kaynak olarak düşünülebilir.

Nooku'daki her nesne, her birinin bir 'hizmet kapsayıcısında' tüm uygulamanın somutlaştırılmış hizmetlerine bir referans ve getService() adlı hizmetlere erişmek için bir yöntem içerdiği bir nesne bileşimidir. KObject::getService() yönteminin gerektirdiği tek şey, geçerli bir kaynak tanımlayıcısı iletmemiz ve bunun kullanıma hazır bir örneklenmiş hizmet döndürmesidir.

PHP hızlı uygulama geliştirmede, Kaynak Tanımlayıcılar bize bir nesnenin örneklemesini sınıf adından ayırmanın güçlü bir yolunu sunar ve böylece bu tanımlama için takma adlar sağlar. Bunun bir uygulamanın sürdürülebilirliği üzerinde önemli etkileri vardır. Takma ad kullanarak bir geliştirici, KService::addAlias() ile bir kod satırı ekleyerek belirli bir tanımlayıcıyla örneklenen her nesne tarafından kullanılan sınıfı değiştirebilir.

Aşina olduğumuz bir kaynak tanımlayıcı örneği, URI veya Tekdüzen Kaynak Tanımlayıcıdır:

Bu Nooku RAD çerçeve eğitiminde örnek bir kaynak tanımlayıcı.

Bu, KService'in uygun sınıfı bulması ve yüklemesi için gerekli olan tüm bilgilerdir. Bu parçalar, Nooku'nun yerleştirme ve somutlaştırmanın tahmin edilebilirliğini sağlayan sınıf adlandırma ve yerleştirme kurallarıyla eşleşir. Yukarıdaki tanımlayıcı örneği (com://site/user.database.table.user), ComUserDatabaseTableUser sınıf adına sahip /components/com_user/databases/tables/user.php dosyasını yüklemeye çalışır. Bu arada, dosya yoksa, çerçeve size varsayılan bir tablo nesnesi verecek ve onu veritabanı adlandırma ve kimlik şeması kurallarına göre oluşturacaktır (bu beni biraz daha bağladı). Daha önce de belirtildiği gibi, KService, tanımlayıcılarınız için takma adlar belirlemenize de olanak tanır. KService::setAlias('maindbaseadapter','com://admin/default.database.adapter.mysqli') ; KService::getService('maindbaseadapter') ile bir db nesnesi yüklememize izin veriyor.

Bu bize bahsettiğimiz ayrıştırmayı sağlar ve uygulamalarımızın bakımında ve genişletilmesinde belirgin bir avantaj sağlar. Gerekirse 'site' ve 'yönetici' dışında uygulamalar oluşturmakta özgürüz ve burada açıklanan tanımlayıcılar aracılığıyla çözümlerimizin gereksinimlerini karşılamasına yardımcı olmak için diğer uygulamalarda bulunan hizmetleri kolayca kullanabiliriz. Yine, bu Nooku'nun PHP ve RAD geliştiricilerine ve ekiplerine yalnızca tek sınıf nesnelerinin değil, tüm hizmetlerin ve uygulamaların oluşturulması için ücretsiz olarak nasıl destek sağladığının bir başka örneğidir.

Özetliyor

Kalbinde kalıtım üzerine kompozisyon ile; daha fazla amalgamları desteklemek için var olan akıllı, önceden var olan bileşimler ve yapılar; ve burada açıklanan tanımlayıcılara sahip ücretsiz hizmet odaklı mimari, Nooku, benzer PHP geliştirme araçlarından herhangi birine göre önemli bir avantaj sağlayan güçlü bir RAD çerçevesi sağlar.