My CakePHP 3 İnceleme – Hala Taze, Hala Sıcak

Yayınlanan: 2022-03-11

Geçen ay, CakePHP ekibi CakePHP 3'ün alfa sürümünün piyasaya sürüldüğünü duyurdu. Cake geliştirme ekibi, sürüm 3'ün ezber bozan bir şey olduğunu düşünüyor, bu nedenle sürüm 3'ün alfa sürümü artık fırından yeni çıkmışken bu makale, PHP geliştirme için etkili bir modern çerçeve olarak CakePHP 3'e yeni bir bakış.

Bu CakePHP 3 ikramı fırından yeni çıktı.

Kısa bir tarihçe

Bu günlerde, PHP geliştirme söz konusu olduğunda çok fazla seçenek var. PHP olgunlaştıkça, geliştiricilere çok çeşitli seçenekler sunan daha fazla PHP Çerçevesi sahneye çıktı. Ama her zaman böyle olmadı.

2005 yılında, PHP 4 hala standartken, PHP çerçeveleri yoktu ve PHP'de nesne yönelimli bir kodlama yaklaşımı geliştirmek kesinlikle zordu. O zaman CakePHP ortaya çıktı – ilk PHP MVC çerçevesi. İlk piyasaya sürülmesinden bu yana geçen yaklaşık 10 yılda CakePHP, PHP geliştiricilerinin sağlıklı bir pazar payını koruyarak gelişmeye devam etti.

CakePHP çerçevesi ne kadar popüler? CakePHP Google grubunda 18.000'den fazla üye ve 32.000 konu başlığı ile yaklaşık 130.000 proje arasında GitHub'daki en popüler 4 PHP projesi arasında yer almaktadır. Koda 270 katkıda bulunan ve belgelere 320 katkıda bulunan kişi ile CakePHP'nin büyük bir takipçi kitlesine sahip olduğu inkar edilemez. CakePHP'nin mevcut yaygın ve artan popülaritesi, CakePHP'nin Cake Software Foundation için çekirdek üyesi ve topluluk yöneticisi olan ve bu makaleyi yazarken röportaj yaptığım James Watts'ın bir makalesinde iyi bir şekilde özetlenmiştir.

Çerçevenin 3. sürümüyle birlikte CakePHP'nin kesinlikle PHP dünyasında lider bir güç ve günümüzün çeşitli PHP çerçeveleri arasında önemli bir rakip olarak kalması bekleniyor.

CakePHP'nin 3. versiyonundaki yenilikler neler?

Bu inceleme, aşağıdakiler de dahil olmak üzere bir dizi yeni özellik ve geliştirme içeren CakePHP 3.0'ın alfa sürümüne dayanmaktadır:

  • Daha iyi performans. Sürüm 3, önyükleme süreci, yönlendirme süreci ve yardımcı şablonlar oluşturmak için sürecin çeşitli bölümlerinde performans iyileştirmeleri içerir.

  • Gelişmiş bileşenler ve yardımcılar. Sürüm 3, yeni FlashHelper ve FlashComponent ile "flaş mesajlar" için gelişmiş destek sağlar. Ek olarak, CookieComponent geliştirilmiştir, bu da tanımlama bilgisi ad alanlarının yapılandırmasını ve tanımlama bilgisi verilerinin işlenmesini ayırmayı kolaylaştırır.

  • Geliştirilmiş oturum yönetimi. Oturum yönetimi CakePHP'de her zaman statik bir sınıf olmuştur ve bunun çeşitli şekillerde sorunlu olduğu kanıtlanmıştır. Sürüm 3 ile, oturuma artık $this->request->session() istek nesnesinden erişebilirsiniz. Bu değişiklik ayrıca oturumun test edilmesini kolaylaştırır ve CakePHP'nin PHPUnit 4.x kullanmasını sağlar.

  • Sözleşmelerin tutarlılığı iyileştirildi. Uygulama iskeleti ve eklenti iskeletleri, birbirleriyle daha tutarlı olması için aynı dizin yapısını kullanacak şekilde güncellendi.

  • Temalar ve eklentiler birleştirildi. CakePHP 3'ün temel amacı, temaları daha güçlü ve sağlam kılmaktı. Bu amaç doğrultusunda çalışırken, temaların eklentilerle aynı yetenekleri sağlaması için gerçekten ihtiyaç duyulduğu ortaya çıktı. Buna göre, herhangi bir eklenti artık paketleme ve yeniden dağıtımı da basitleştiren bir tema olarak kullanılabilir.

  • ORM İyileştirmeleri. ORM'de (Nesne-ilişkisel eşleme) birkaç API değişikliği yapıldı. En önemlisi, tasarruf işlemleri için derin ilişkilendirmeler belirlemek artık daha kolay ve öğrenme eğrisini ve yeni benimseyenler arasındaki kafa karışıklığını azaltmak için birkaç kural değiştirildi.

Ayrıca, sürüm 3.0'ın beta sürümüne dahil edilmesi planlanan birkaç ek özellik vardır. En önemlisi:

  • Uluslararasılaştırma ve yerelleştirme (i18n ve L10n) özellik geliştirmeleri
  • Kenar Tarafı İçeriğine dayalı CacheHelper için bir yedek
  • Daha basit ve daha hızlı rota bildirimi için yeni bir yönlendirme API'si

Aslında, sürüm 3, CakePHP'nin önceki sürümlerinin ötesinde önemli bir yükseltmeyi temsil eder.

Neden CakePHP?

CakePHP'nin birçok harika özelliği olsa da, bu inceleme özellikle onu diğerlerinden ayırmaya gerçekten yardımcı olan birkaç tanesine odaklanıyor:

  • Konfigürasyon üzerinde konvansiyon
  • CakePHP'nin ORM'si (Nesne-ilişkisel eşleme)
  • Bileşenler ve yardımcılar

Konfigürasyon üzerinde konvansiyon

CakePHP her zaman hızlı ve tutarlı bir gelişme olmuştur ve bu amaçla CakePHP geleneklere büyük önem vermektedir. Bu nedenle, Ruby on Rails (ki CakePHP'nin ilhamının çoğunu ondan almıştır) gibi, CakePHP de yapılandırma ilkesiyle ilgili konvansiyona büyük ölçüde bağlıdır.

Kurallar, bir geliştiricinin CakePHP çerçevesini nasıl kullanacağını öğrenirken “işlerin nereye gittiğini” düşünmesi gerekmediği anlamına gelir, çünkü bu kurallar için varsayılanlar zaten yerindedir. CakePHP kurallarına aşina olmak gerekmekle birlikte, bir kez ustalaştıktan sonra geliştirici, kodun nereye yerleştirildiği ve diğer yapılandırma sorunları hakkında endişelenmek yerine temel geliştirmeye odaklanabilir.

CakePHP'nin kuralları, oldukça liberal bir dil olan PHP'nin kendisiyle taban tabana zıttır. Kurallarının bir sonucu olarak CakePHP, birden çok geliştirici ve hatta birden çok ekip arasında kodlama stili ve yapısında daha fazla tutarlılık sağlamaya yardımcı olur. Bir dizi standart sözleşmeyi benimseyen Cake, geliştirmeyi daha tutarlı hale getirmeye çalışır.

Örneğin, bir veritabanı şeması için CakePHP, belirli değişkenlerin, tablo adlarının ve alanların nasıl adlandırılacağı konusunda belirli varsayılan varsayımlar yapar. Cake özellikle şunları bekler:

  • Tablo adları çoğul olacaktır (örneğin, orders )
  • Birincil anahtar alanının adı id olacaktır.
  • Herhangi bir yabancı anahtar alanının adları, başvurulan tablo adına ve ardından _id dayalı olacaktır (örneğin, bir customers tablosundaki yabancı anahtar, customer_id olarak adlandırılacaktır).

Örneklemek için, bir blog gönderisi veritabanından iki tablonun ( articles ve users ) basit bir incelemesini ele alalım. Örneğimizde, bir Makalenin bir Users Users Articles Articles ” olduğunu söyleyeceğiz. Bu ilişkiler CakePHP 3.0'da aşağıdaki gibi belirtilecektir:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }

CakePHP, varsayılan kuralları varsayar ve böylece herhangi bir ilişkilendirmeyi getirirken hangi yabancı anahtarların aranacağını (yani, articles tablosundaki user_id ) otomatik olarak bilir.

Bununla birlikte, CakePHP 3'ün varsayılan kurallarının kolayca geçersiz kılınmasına izin verdiğini vurgulamak önemlidir. Örneğin, users tablosundaki yabancı anahtarımızın user_id yerine author_id olarak adlandırıldığını varsayalım. Bunu belirtmek, CakePHP'nin varsayılanı kullanmadığımızı bilmesini sağlamak için kodumuzda aşağıdaki iki küçük değişikliği gerektirecektir:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }

Dolayısıyla, kurallar gerçekten CakePHP'nin ayrılmaz bir parçasıdır ve kesinlikle avantajlarına sahip olsalar da, burada gösterdiğimiz gibi gerektiğinde onları geçersiz kılmak gerçekten oldukça basittir.

Bazı geliştiriciler, büyük ölçüde sözleşmelere dayanmayan PHP çerçevelerini (Yii ve Laravel gibi) tercih edebilirken, CakePHP kuralları aslında oldukça avantajlı olabilir. Farklı CakePHP geliştiricileri ve projeleri arasında tutarlı kodlama yapısı ve kuralları sağladığından, başka bir geliştirici tarafından yazılan kodu geliştirmek veya sürdürmekle görevlendirildiklerinde CakePHP geliştiricisi için hızlanma süresini önemli ölçüde azaltmaya yardımcı olabilirler.

CakePHP'nin Nesne-ilişkisel eşlemesi (ORM)

CakePHP'nin Nesne-ilişkisel eşlemesi (ORM), CakePHP'nin çerçeve sözleşmelerinden büyük ölçüde yararlanır. Veritabanı şemasını Cake'in standartlarına göre ayarlayarak, Cake'in güçlü ORM'si aracılığıyla tabloları hızla birbirine bağlayabilirsiniz. CakePHP tablo birleştirmeleri, hasMany ve hatta hasAndBelongsToMany ilişkileri gibi şeyleri kolaylıkla ele aldığından, nadiren bir SQL ifadesi yazmanız gerekecek.

CakePHP'nin ContainableBehavior yararlanarak, model ilişkilendirmeleriniz aracılığıyla bir SQL sorgusundan hangi veritabanı tablolarını ve alanlarını seçeceğinizi belirleyebilirsiniz. Bu, birkaç tablonun derinliklerine inebilir ve ORM aracılığıyla oldukça karmaşık SQL ifadelerini hızla oluşturmak kolaydır.

Bu arada, CakePHP'nin ContainableBehavior CakePHP'nin PHP geliştirmeyi nasıl basitleştirip düzene sokabileceğinin harika bir örneğidir. Verileri temiz ve tutarlı bir şekilde aramanıza ve filtrelemenize yardımcı olur ve ayrıca uygulamanızın hızını ve genel performansını artırmanıza yardımcı olabilir. (Karşılık gelen bir dizi bindModel ve unbindModel çağrıları oluşturmak için sağlanan muhafazaları kullanarak, modellerinizin ilişkilendirmelerini geçici veya kalıcı olarak değiştirerek çalışır.)

ORM ile ilgili zorluk, SQL kullanmayı o kadar basit hale getirmesidir ki, bir geliştirici dikkatli olmazsa, istemeden verimsiz SQL sorguları yazabilir. Sorgularını kolaylaştırmayan, kesinlikle kötü yazılmış Kek uygulamalarını birçok kez gördüm. Bu sorunlar, bir sistem dağıtıldıktan birkaç yıl sonra, veritabanları büyüdüğünde ve kötü yazılmış sorgular giderek yavaşladığında ortaya çıkma eğilimindedir.

Buradaki ana sorun, en son CakePHP sürüm 3'ten önce, Cake's ORM'nin bir sorgu gerçekleştirirken varsayılan olarak ilişkili tabloları almasıdır. Sonuç olarak, temel SQL tüm ilişkili tablolardan tüm verileri alacağından, basit bir "tümünü bul" sorgusu potansiyel olarak oldukça şişirilebilir. Sürüm 3'te bu davranış artık varsayılan değildir. (Ve CakePHP'nin önceki sürümlerinde, bu varsayılan davranışı, ana AppModel.php dosyanıza public $recursive = -1; ekleyerek kolayca devre dışı bırakabilirsiniz.)

Genel olarak, Cake's ORM'nin bir incelemesi, geliştirmeyi kolaylaştırmaya gerçekten yardımcı olduğunu ve doğru kullanıldığında karmaşık sorguları hızlı bir şekilde oluşturmak için harika bir araç olduğunu gösteriyor. Bununla birlikte, geliştiricilerin ORM'yi tam olarak anlamak ve sorgularının uygun şekilde optimize edildiğinden emin olmak için zaman ayırması hayati önem taşır (her dilde olduğu gibi).

Bileşenler ve Yardımcılar: CakePHP Kitaplıkları

CakePHP'nin harika özelliklerinden biri, birçok sıkıcı, tekrarlayan ve sıkıcı geliştirme görevini ortadan kaldıran yerleşik kitaplıklardır – Bileşenler ve Yardımcılar –. MVC bağlamında, Bileşenler denetleyici geliştirmeyi kolaylaştırmaya yardımcı olurken, Yardımcılar görünüm kodlamasını ve mantığını (yani sunum katmanı) basitleştirir.

Örneğin PaginatorComponent , bir bulma sorgusundan otomatik olarak sihirli bir şekilde sonraki/önceki sayfa arabirimini oluşturur. JsHelper ekleyin ve aniden favori JavaScript çerçeveniz (varsayılan olarak jQuery) tarafından desteklenen AJAX Pagination'a sahip olursunuz.

Diğer yararlı Yardımcılardan hızlı bir örnekleme şunları içerir:

  • TimeHelper : Zaman değerlerini biçimlendirmek ve değerlendirmek için bir dizi işlev sağlayarak tarih ve saatleri görüntülemeyi çok kolaylaştırır.
  • NumberHelper : Sayıları çeşitli yaygın (veya özelleştirilmiş) biçimlerde ve kesinliklerde görüntülemek için uygun yöntemler sağlar.
  • TextHelper : Bağlantıların etkinleştirilmesine, URL'lerin biçimlendirilmesine, seçilen kelimelerin veya ifadelerin etrafında metin alıntıları oluşturulmasına, metin bloklarında anahtar sözcüklerin vurgulanmasına ve uzun metin parçalarını zarif bir şekilde kesmeye yardımcı olur.

Ve çok daha fazlası var.

CakePHP 3'ün Eleştirileri

Elbette her çerçevenin artıları ve eksileri vardır ve CakePHP bir istisna değildir. Bu incelemenin dışında CakePHP'ye yöneltilen en yaygın eleştirilerden bazıları şunlardır:

  • “Eski çerçeve; şişkin ve yavaş." Bu eleştiri, bugün (varsa) sınırlı gerçekle, tipik olarak daha tarihseldir. PHP sürümlerini PHP 4'e kadar desteklemek, tarihsel olarak CakePHP'nin PHP'nin kendi eski sorunlarının çoğuyla ilgilenmesini gerektirmiştir. PHP'nin olgunlaşmasıyla ve özellikle CakePHP sürüm 3'ün çıkmasıyla birlikte bu iddia gerçekten de geçerliliğini yitirdi.

  • “Aşırı katı ve sınırlayıcı.” CakePHP kurallarının açık avantajları olsa da, onları eleştirenler de var. Eleştirmenler genellikle sözleşmelerin çok katı olduğunu iddia ederler, ancak bu sözleşmelerin kolayca geçersiz kılınabileceğini kabul edemezler (veya kabul edemezler). Cake, standart bir kurallar dizisi benimseyerek, PHP'nin aksi halde gevşek kodlama uygulamaları göz önüne alındığında, yalnızca olumlu bir şey olarak görülmesi gereken geliştirmeyi tutarlı hale getirmeye çalışır.

  • "Yavaş bırakma döngüsü". Yavaş bir serbest bırakma döngüsü mutlaka kötü değildir. Aksine, çok agresif olan bir serbest bırakma döngüsü aslında daha problemli olabilir. Aslında, CakePHP'nin ana sürümlerinin zaman almasının bir nedeni, PHP'nin hala yaygın olarak kullanılan önceki sürümleriyle geriye dönük uyumluluk sağlamaktır. Ayrıca, bu muhafazakar yayın döngüsü ve geriye dönük uyumluluğa verilen önem, yeni sürümler yayınlandığında kodunuzda büyük (ve sık) değişiklik yapma ihtiyacını ortadan kaldırır. Ayrıca CakePHP 3 ekibinin, aylık olarak yayınlanan küçük sürümler (hata düzeltmeleri, yamalar, küçük geliştirmeler, vb.) söz konusu olduğunda yavaş olmaktan başka bir şey olmadığı belirtilmelidir. Benzer şekilde, çoğu hata bileti gönderildikten sonraki saatler içinde yanıtlanır.

  • "Sıradan bir çözüm değil." Diğer birçok modern “kutudan çıkmış web uygulaması” PHP çerçevelerinin (örneğin Yii gibi) aksine, CakePHP bilinçli olarak özel çözümleri desteklemeye ve etkinleştirmeye çalışır. Bir dizi büyük, özel, veri tabanına dayalı web sitesi ve uygulama geliştirirken bundan kişisel olarak büyük ölçüde yararlandım.

  • "Nesneler yerine veri dizileri kullanır." Bu, sürüm 3'ten itibaren artık doğru değil. Önceki sürümlerde, herhangi bir verinin iç içe diziler olarak saklanması ve bunlara başvurulması gerekir (örneğin, $user['User']['username'] ). CakePHP 3 son olarak bunu ele alır, bunun yerine verileri nesneler olarak depolar (örneğin, $user->username ).

  • “Kötü belgeler.” CakePHP belgelerinin her zaman yeni başlayanlar düşünülerek yazılmış gibi görünmediği için bu eleştirinin bir geçerliliği vardır (önemli bilgiler bazen sadece bir veya iki cümlede tartışılır, oysa birkaç paragraf tartışma muhtemelen garanti edilirdi) ). Cake geliştirme ekibi bunun farkındadır ve belgeleri buna göre geliştirmek için çalışmaktadır. Aslında, CakePHP 3 belgelerinin ana sayfası, belgelerin "kalitesi, geçerliliği ve doğruluğu"na yüksek düzeyde bağlılığı açıkça belirtmektedir. CakePHP topluluk tarafından yönlendirilen bir çerçeve olduğundan, belgelerin her sayfasında bir “Bu Belgeyi İyileştir” düğmesi bulunur ve CakePHP kullanıcılarının belgelere kendi ekleme, silme veya düzeltmelerini katkıda bulunmalarını sağlar ve teşvik eder.

Çözüm

Hepsi bir arada, ilk yayınlanmasından yaklaşık 10 yıl sonra, CakePHP'nin bir incelemesi, o zamandan beri ortaya çıkan diğer birçok PHP çerçevesine canlı ve zorlu bir rakip olmaya devam ettiğini ortaya koyuyor.

CakePHP eksiksiz ve kapsamlı bir geliştirme çözümüdür. Kod tabanı olgun ve işlevsellik sonsuz görünüyor. Genel olarak Cake, yalnızca yazılım geliştiriciler için değil, yatırımcılar için de önemli olan geliştirmeyi hızlandırmak için inşa edilmiştir. Yazılım geliştirmenin en büyük maliyeti, geliştirme süresinin maliyetidir ve CakePHP, geliştirme süresini önemli ölçüde azaltmayı amaçlar.

CakePHP, topluluk tarafından yürütülen bir projedir. Sadece daha fazla insan dahil olduğunda daha iyi olabilir. 7 yıldır dahil olduğum ve topluluğun büyümeye devam ettiğini gördüğüm için CakePHP'nin bir sonraki aşaması için heyecanlıyım. CakePHP 3'ün piyasaya sürülmesi ve hem PHP hem de CakePHP'nin olgunluğu, çerçevenin daha iyi ve daha iyi olmaya devam edeceği anlamına geliyor.

Ruby on Rails'e benzer pek çok fayda sunan PHP tabanlı bir çözüm arıyorsanız (kullanım kolaylığı ve yapılandırmaya ilişkin kural açısından), o zaman CakePHP'ye bir şans verin. CakePHP Blog Eğitimi'nin kurulması ve çalıştırılması yalnızca birkaç dakika sürer veya alternatif olarak CakeCoded, bir PHP geliştiricisini CakePHP ile tanıştırmak ve kullanmaya başlamak için bir dizi açık ders sunar. Bu kaynaklarla CakePHP'nin PHP yazılım geliştirme çabalarınızı ne kadar hızlandırabileceğini ve geliştirebileceğini hemen göreceksiniz. Eğlence!


Michael Houghton, kapsamlı CakePHP deneyimine sahip İrlanda merkezli bir Toptal Mühendisidir. Çerçeve ile 100'den fazla web sitesi geliştirdi, CakeDC'de (CakePHP çerçevesinin arkasındaki ticari kuruluş) ekiple çalıştı, çeşitli yamalar gönderdi ve CakePHP belgelerine yardımcı oldu.