WordPress Bölüm 8 için Devam OOP: Test tabanlı geliştirme kullanılarak genişletilebilen WordPress eklentileri için yeni özellikler geliştirme
Bu serideki son yazımda, WordPress’in geliştirilmesi için gelişmiş PHP nesnesi yönelimli programlama hakkında, bir eklentinin düşük seviyeli bir API yeniden düzenlemesinden geçtim, işlemi yönlendirmek ve her şeyin doğru çalışmasını sağlamak için bir test kullanarak. “Düşük seviyeli ateş” diyorum çünkü odak noktası sistemin nasıl çalışacağı konusunda iç. Birlikte çok fazla kablo işi tartışmıyorum. Bu makalede, bu yazı burada alındı. Bir sonraki adım, bir yangın dinlenme eklemek için argüman argümanları ve filtreyi otomatik olarak bağlayan yazı tipi yazısı yapmaktır.
Test odaklı geliştirme (TDD), gerçekten değişiklik yazmadan önce kod tabanındaki değişiklikler için testler yazma uygulamasıdır. Bunu, yeni özelliklerin/ hatanın/ işleyicinin çalışıp çalışmadığını belirleyen özelliklere dönüştürmek için yapmak. Mevcut test aynı zamanda yeni özelliklerin/ hata onarımının/ regresyon hataları yapıp yapamayacağını belirler. Mevcut kod tabanında TDD’ye dönmek kolay değildir. Nasıl çalıştığını görmek için bu mevcut eklentiyi kullanalım. İlk testi değerlendirin, testin ne yaptığını görmek önemlidir. Şu anda, özellikle wp_posts dizisi şeklinde sorgu biçimini içeren testlerimiz var. Benzer testler, API’nın yanıt geri kalanının doğru şekle sahip olmasını sağlar.
Her şey yolunda ama hiçbir şey WP_Posts içeriğini kapsamaz. Şimdi test serimizde neyin kaybedildiğini belirledik. Şimdi testi yazmaya hazırız. Sahte girişten başlayarak, bu fabrika sınıfından bir girdi olarak istediğimden bir dizi yaparak başlıyorum. Diziyi fabrika için bir testte yazdım. Şimdi, çalışmayan bir fabrika sürümü yapacağım ve temel işlevselliğini kontrol eden bir test yapacağım. Aşağıda, iki arayüz kullanan ve alıcı işlevine sahip olan arama sınıflarının bir taslağıdır:
Fabrikam bunu yapacak. Eklemek için bir argüman ve bir arama eklemek ve yaymak için yayın türü alan bir yöntemi ile bir fabrikaya başlayalım:
Şimdi, belirtilen genel yöntemlerin her birinin geri dönüş türünü kapsayacak kadar yazacak kadar var:
Bu geçmeyecek – bu, içeriğinde yazmadığımız yöntemi çağırıyor. Vücudu bu yönteme ekledikten sonra, zaten çalışıp çalışmadıklarını ölçmek için bir yolumuz var. Ama bu bizden önce geliyor. İlk olarak, arama sınıfını her şeyi ayarlamalıyız. Bundan önce, işlevinin ne olduğunu bilmemiz gerekir. Arama sistemi yapıştırma sorumluluğuna sahiptir. Bu nedenle birkaç görev yaptı, ancak başka bir sistemde belirtilen mantığa dayanarak başka bir sistem gönderen bir denetleyici olarak hareket ettiği sürece, hala sadece bir sorumluluğu var.
Gönderilecek görevleri listeleyelim:
Belirli dinlenme yolu şemasını değiştirmek ve hangi yolların değiştirileceğini bilmek için <e modifyschemacontract arabirimini uygulayan nesnelerin kullanılması gerekir. Kueri gereklidir.
Bu değişikliği yapmak için WordPress Eklentileri API’sine (Hook) bağlanması gerekir.
Sonuncusu ile başlayalım – yangın eklentilerine bağlanma. En azından kontrol ettiğimiz ve ne yapmamız gerektiğini belirliyoruz. Tüm doğru bağımlı nesnelerin nasıl elde edileceğine dair endişelerimin çoğu – WP_QUERY ve WP_REST_REQUEST çekirdeğinden, eklenti yangın besleme verilerini izin vererek kayboluyor.
Aramanın kancalar eklemesi gerekiyor, ne silmek istediğimiz. Bunun için deseni resmileştirmek için arayüzü ekledim çünkü yeniden kullanılması muhtemeldi.
Amacım, son arayüz kümesiyle filtrelerchema () ve filtrequeReargs () yöntemlerini ortadan kaldırmak olduğundan, arama için yöntemi ekleyeceğim. Filtreye hangi argümanların verildiğini ve her uygulama için bu görevi yerine getiren bir yere sahip olmak için bir filtrenin uygulanıp uygulanmayacağını belirleyen iki arayüz yöntemini kullanabilmeliyim. Bedenleri olmayan bir yöntem olmadığı sürece bunu yapabilecek sınıflar aşağıdadır:
Ancak, yöntemin çalışma şeklini göstermek için testler yazabiliriz. Zaten sahip olduğum testin yanı sıra, arg sorgusu sınıfı ve arg değiştirici şemasının ayarlanıp ayarlanmadığını test etmek için bunu ekleyeceğim. Bu, yöntemi içerir ve diğer yöntemlerde kullanımı güvenli hale getirir:
Bu, kancanın çalışıp çalışmadığını ve kancanın düzgün olup olmadığını içermez. Bunlar iki ana gereksinim, dördü gerçekten kanca yapmamız gerekiyor. Aşağıda, Arg beyaz liste sorgularının modifikasyonunu kanıtlamak için bir testtir: Ayrıca şema argümanının değiştirilmesi için bir test yapmalıyız. Bu, evde birlikte oynamak ve öğrendiklerinizi denemek için iyi bir fırsattır. Çekme isteklerine girin, maksimum eğitim avantajlarına aktif olarak katılın.
Tamam bir fabrika tasarlarken, şimdi bunu fabrikamızda derlemeye başlayalım. Fabrika, nesnelerin birleştirildiği yerdir. Soyutlama fabrikayı daha verimli hale getirir, çünkü aynı araç farklı ürünler yapabilir, ancak aynı arayüzün kullanımı sayesinde benzerdir. Bu nedenle, arg sorgusu dönüştürücü ve arg şemasının çok fazla uygulanmasını miras aldıkları soyut sınıfa taşıma fırsatını görüyorum, böylece bu mantığı fabrikada yeniden kullanabilirim. Onsuz, bu mantığı yeniden kullanmak için kesme ve yapıştırma veya belki bir özellik kullanmalıyım. Kalıtım en basit çözümdür. Mantıklı, aynı arayüzü uygulayan ve temel olarak farklı uygulama detayları ile aynı şeyi yapan bir veya daha fazla sınıf istiyorum. Sınıf mirasının kullanımı budur.
Bu benim soyut sorgum Arg dönüştürücü sınıfı:
Ve bu Arg Modelleme sınıfı soyut şeması:
Sınıfın yalnızca arayüzü uyguladığını fark edebilirsiniz. Yapabileceğim tek şey bu aşamada tekrar kullanılabilir, bu yüzden öyle. Boş soyut sınıflar zaman zaman yeniden kullanılabilecek yöntemleri biriktirme eğilimindedir. Şimdi bu iki sınıfımız var, fabrikamızda genişletebiliriz. İki sınıfı genişleten anonim sınıfı kullanmayı seçtim. Bu, tüm fabrika mantığını fabrikada saklamamı sağlıyor. Anonim işlevler gibi anonim sınıflar, adı yoktur ve gerektiği gibi tanımlanırlar. Anonim sınıflar diğer sınıfları genişletebilir, arayüzleri uygulayabilir ve doğayı kullanabilir. Kapsamlarını özel $ THICE değişkeninde temsil ederler ve Magic __Construct () yöntemi aracılığıyla argüman alabilirler. Tıpkı sınıf gibi. Örneğin, bu anonim sınıf WP_Query’yi genişletir ve kuyruk yöntemini yeniden tanımlar:
Factory :: Search () girecek anonim sınıfımız şöyle görünmeye başlar:
Her ikisi de, inşaatçı bağımlılıkları olarak oldukları yönteme iletilen $ PostTypestoSupport dizisini alacaktır. Yapıcı miras aldıkları sınıfta değildir, bu nedenle anonim sınıfın yapıcıyı beyan etmesi gerekir.
Bu yöntem bir dizi argümandan geçtiğinden, görevi verileri sağlamak için WordPress filtrelerini kullanmaktan sorumlu iki nesnede düzgün bir şekilde tekrarlamak ve toplamaktır. Bu daire:
Şimdi kesimin daha net bir şekilde yapışması gereken yuvanın şeklinden sonra, bu fabrika tarafından yapılan bir nesne arama sınıfı oluşturmaya başlayalım.
Bu tam bir uygulama değil, ancak kancalarımızı iki geri çağrıya genişletiyor.Her iki durumda da arama, filtrenin boolean sağını veya yanlışlığı geri yüklemek için gereken arayüzde belirlenen bir yöntemin olup olmadığına bağlı olarak gerçekleşmesi gerekip gerekmediğini öğrenebilir.Arayüzde belirtilen yöntem ve diziyi geri yüklemek için gereken yöntem kullanarak filtreye bir dizi verisinin eklenmesini sağlayabilir.Bu, daha önce gösterdiğim iki arayüz için ikinci bir refactor gerektiriyor ve tekrar ziyaret etmemiz gerektiğini söylemeye devam ediyor.Şimdi ikinci refactor zamanı.Aşağıdakiler perde argümanını filtrelemek için yeni bir arayüzdür: ve bu, şemanın argümanını filtrelemek için yeni bir arayüzdür:
Bu yeniden düzenleyici, bu sınıfların WordPress eklentisi yangına tamamen bağlı olması için ihtiyaçlarını ortadan kaldırır. Hepsi şimdi arama sınıfı tarafından ele alındı. Ayrıca, worsFilter () yöntemi her ikisinde de aynı imzaya sahiptir. Arayüz diğer arayüzleri devralabildiğinden, yöntemi bu iki arayüz tarafından devralınan kendi arayüzüne taşıyabiliriz. Bunu yapmak, her arayüzün sadece arayüz ayrımı prensibi tarafından sipariş edilen bir gereksinim yarattığı anlamına gelir. Bunun yerine, sadece bunun yanlış olduğunu söyleyeceğim, böylece düzeltebilir ve gerilme isteği gönderebilirsiniz. Bunun hakkında bir blog yazısı yazın ve @ Twitter’dayım. Bu fabrikanın bağımlılığını yakalamak için bir eklenti yangını kullanmak, giriş yönteminin filtrelenmesini düzenleyebilir, ancak aslında sorgunun sonuçlarını değiştirmek için kullandığımız filtreyi değil. Daha önce Tonya ve ben sonuç vermekten sorumlu sınıfların en az WP_Query ve belki de wp_rest_request’e dikkat etmelerine karar verdik. Bunu yapmak için şu anda wp_rest_request’e bir referansa ihtiyacım var. WordPress’in çözümümden isteyecek bir servis kapsayıcısı olmadığından, bu taahhütte görebileceğiniz şey, geçerli isteği yakalamaktır, böylece REST_PRE_SERERVE_REQUEST filtresini kullanarak içeriğe enjekte edilebilir. Bunu FilterWpQuery sınıfında yaptım. GetPosts () yönteminde wp_rest_request’e ihtiyacım var. Bir istekte bulunmak için yeni bir CaptureQuest yöntemi ekledim, GetPosts’ta () kullanabileceğim statik bir değişkene koydum ()
Bunu yine de birim testi ile test edebilirim, eklenti yangını taklitimle değiştirebilirim ve diğer testim hala geçerli. Bir sonraki makalemin bu sistemin yapılması hakkındaki genişletilebilirliğinden başlayarak FilterWpQuery tarafından genişletilebilir. Şu anda bir init () var. Bu şekilde GetPosts (), Contentterter tarafından kazanılan son set operatör memuru olarak görev yapar. Umarım bu yönlendirici daha soyuttur, örneğin, türden tip başına farklı uygulama. Mevcut sınıf ekranı: Şimdi eklentimizde farklı arama uygulaması için alışverişi yapmamız gereken her şey değiştirilebilir ve yönetecek bir fabrikamız var. Bir sonraki makalede inşa edeceğim. Bu makaledeki tüm kodlar ve önceki makaleler bu gerilme isteği ile örnek eklentisine eklenmiştir. Bu makalede tartıştığımdan daha fazla test var. Bir kez daha, bu eklentinin% 100 test kapsamı yok ve yapılması gerekenleri yapmadı. Tonya ve ben yazdığımızda artıracağız, katılmaya davetlisiniz. Bu eklentiye katkıda bulunmanın öğrendiklerinizi uygulamanın iyi bir yolu olacağını düşünüyorum.