My CakePHP 3 Review – Încă proaspăt, încă fierbinte

Publicat: 2022-03-11

Luna trecută, echipa CakePHP a anunțat lansarea lansării alfa a lui CakePHP 3. Echipa de dezvoltare Cake consideră că versiunea 3 este o schimbare a jocului, așa că, odată cu lansarea alfa a versiunii 3, care iese din cuptor, acest articol ia privire nouă asupra CakePHP 3 ca un cadru modern eficient pentru dezvoltarea PHP.

Acest tratament CakePHP 3 este proaspăt scos din cuptor.

O scurta istorie

În zilele noastre, există atât de multe opțiuni când vine vorba de dezvoltarea PHP. Pe măsură ce PHP s-a maturizat, tot mai multe cadre PHP au apărut, oferind dezvoltatorilor o gamă largă de opțiuni. Dar nu a fost întotdeauna așa.

În 2005, când PHP 4 era încă standardul, nu existau cadre PHP și dezvoltarea unei abordări de codare orientată pe obiect în PHP a fost cu siguranță o provocare. Atunci a apărut CakePHP – primul cadru PHP MVC. În cei aproape 10 ani care au trecut de la lansarea sa, CakePHP a continuat să evolueze, menținând o cotă de piață sănătoasă a dezvoltatorilor PHP.

Cât de popular este cadrul CakePHP? Este clasat în top 4 cele mai populare proiecte PHP de pe GitHub, din aproximativ 130.000 de proiecte, cu peste 18.000 de membri în grupul Google CakePHP cu 32.000 de subiecte. Cu 270 de colaboratori la cod și 320 de colaboratori la documentație, nu se poate nega că CakePHP are o mulțime de urmăritori. Popularitatea actuală pe scară largă și în creștere a lui CakePHP este bine rezumată într-un articol al lui James Watts, membru principal și manager al comunității CakePHP pentru Cake Software Foundation, pe care l-am intervievat în timpul scrierii acestui articol.

Cu versiunea 3 a framework-ului acum disponibilă, CakePHP este de așteptat să rămână o forță lider în lumea PHP și un competitor major în peisajul variat al framework-urilor PHP de astăzi.

Ce este nou în versiunea 3 a CakePHP?

Această recenzie se bazează pe versiunea alfa a CakePHP 3.0, care încorporează o serie de funcții și îmbunătățiri noi, inclusiv:

  • Performanță mai bună. Versiunea 3 încorporează îmbunătățiri ale performanței procesului de bootstrap, procesului de rutare și mai multe părți ale procesului pentru generarea de șabloane de ajutor.

  • Componente și ajutoare îmbunătățite. Versiunea 3 oferă suport îmbunătățit pentru „mesaje flash” cu noile sale FlashHelper și FlashComponent. În plus, CookieComponent a fost îmbunătățită, facilitând separarea configurației spațiilor de nume cookie și gestionarea datelor cookie.

  • Gestionarea sesiunilor îmbunătățită. Managementul sesiunii a fost întotdeauna o clasă statică în CakePHP, care sa dovedit a fi problematică în mai multe moduri. Cu versiunea 3, acum puteți accesa sesiunea din obiectul de solicitare $this->request->session() . Această modificare face, de asemenea, testarea sesiunii mai ușor și permite CakePHP să utilizeze PHPUnit 4.x.

  • Consecvență îmbunătățită a convențiilor. Scheletul aplicației și scheletele pluginului au fost actualizate pentru a utiliza aceeași structură de directoare pentru a fi mai consistente unele cu altele.

  • Temele și pluginurile au fost îmbinate. Un obiectiv cheie al CakePHP 3 a fost de a face temele mai puternice și mai robuste. Lucrând în acest scop, a devenit evident că ceea ce era cu adevărat necesar era ca temele să ofere aceleași capabilități ca și pluginurile. În consecință, orice plugin poate fi acum folosit ca temă, ceea ce simplifică, de asemenea, ambalarea și redistribuirea.

  • Îmbunătățiri ORM. Mai multe modificări API au fost făcute la ORM (Object-relational mapping). În special, este acum mai simplu să specificați asocieri profunde pentru operațiunile de salvare, iar câteva convenții au fost modificate pentru a reduce curba de învățare și confuzia în rândul noilor adoptatori.

În plus, există câteva caracteristici suplimentare care sunt, de asemenea, planificate să fie încorporate în versiunea beta a versiunii 3.0. Cel mai important:

  • Îmbunătățiri ale caracteristicilor de internaționalizare și localizare (i18n și L10n).
  • Un înlocuitor pentru CacheHelper bazat pe Edge Side Includes
  • Un nou API de rutare pentru declararea rutei mai simplă și mai rapidă

Într-adevăr, versiunea 3 reprezintă o actualizare semnificativă dincolo de versiunile anterioare de CakePHP.

De ce CakePHP?

În timp ce CakePHP are multe caracteristici excelente, această recenzie se concentrează pe câteva în special care ajută cu adevărat să-l deosebească, și anume:

  • Convenție asupra configurației
  • ORM-ul lui CakePHP (mapping obiect-relațional)
  • Componente și ajutoare

Convenție asupra configurației

CakePHP a fost întotdeauna despre o dezvoltare rapidă și consecventă și, în acest scop, CakePHP pune un accent puternic pe convenție. Prin urmare, la fel ca Ruby on Rails (din care CakePHP sa inspirat în mare parte), CakePHP aderă puternic la principiul convenției privind configurarea.

Convențiile înseamnă că un dezvoltator nu trebuie să se gândească la „unde merg lucrurile” atunci când învață cum să folosească cadrul CakePHP, deoarece setările implicite pentru aceste reguli sunt deja puse în aplicare. Deși trebuie să se familiarizeze cu convențiile CakePHP, odată stăpânite, dezvoltatorul se poate concentra pe dezvoltarea de bază, mai degrabă decât să fie nevoit să-și facă griji unde este plasat codul și alte probleme de configurare.

Convențiile CakePHP sunt în contrast puternic cu PHP în sine, care este un limbaj destul de liberal. Ca rezultat al convențiilor sale, CakePHP ajută la asigurarea unei mai mari coerențe în stilul și structura de codare pentru mai mulți dezvoltatori și chiar pentru mai multe echipe. Prin adoptarea unui set standard de convenții, Cake se străduiește să facă dezvoltarea mai consistentă.

Pentru o schemă de bază de date, de exemplu, CakePHP face anumite ipoteze implicite în ceea ce privește modul în care vor fi denumite anumite variabile, nume de tabel și câmpuri. Mai exact, Cake se așteaptă ca:

  • Numele tabelelor vor fi la plural (de exemplu, orders )
  • Numele câmpului cheie primară va fi id
  • Numele oricăror câmpuri de cheie străină se vor baza pe numele tabelului la care se face referire, urmat de _id (de exemplu, cheia străină dintr-un tabel de customers va fi numit customer_id ).

Pentru a ilustra, să luăm în considerare o simplă revizuire a două tabele ( articles și users ) dintr-o bază de date de postări de blog. În exemplul nostru, vom spune că Articles „Aparține” Users și Users „are multe” Articles . Aceste relații ar fi specificate după cum urmează în CakePHP 3.0:

 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 își asumă convențiile implicite și, prin urmare, știe automat ce chei străine să caute (adică user_id în tabelul articles ) atunci când preia orice asociații.

Este important să subliniem, totuși, că CakePHP 3 permite ca convențiile sale implicite să fie ușor suprascrise. De exemplu, să presupunem că cheia noastră externă din tabelul users a fost numită author_id în loc de user_id . Specificarea acestui lucru ar necesita doar următoarele două mici modificări ale codului nostru pentru a-i anunța CakePHP că nu folosim implicit:

 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']); } }

Deci, deși convențiile sunt într-adevăr parte integrantă a CakePHP și cu siguranță au avantajele lor, depășirea lor atunci când este necesar este într-adevăr destul de simplă, așa cum am arătat aici.

În timp ce unii dezvoltatori pot prefera cadre PHP (cum ar fi Yii și Laravel) care nu se bazează atât de mult pe convenții, convențiile CakePHP pot fi de fapt destul de avantajoase. Ele pot ajuta la reducerea dramatică a timpului de accelerare pentru un dezvoltator CakePHP atunci când este însărcinat să îmbunătățească sau să mențină codul scris de un alt dezvoltator, deoarece au ca rezultat o structură și convenții de codare consistente pentru mai mulți dezvoltatori și proiecte CakePHP.

Maparea obiect-relațională (ORM) CakePHP

Maparea obiect-relațională (ORM) de la CakePHP beneficiază foarte mult de convențiile-cadru ale CakePHP. Prin stabilirea schemei bazei de date la standardele lui Cake, puteți conecta rapid tabele împreună prin puternicul ORM al lui Cake. Rareori va trebui să scrieți o instrucțiune SQL, deoarece CakePHP se ocupă cu ușurință de lucruri precum îmbinări de tabel, hasMany și chiar hasAndBelongsToMany .

Folosind ContainableBehavior de la CakePHP, prin asocierile modelelor, puteți specifica ce tabele și câmpuri ale bazei de date să selectați dintr-o interogare SQL. Acest lucru poate merge adânc în mai multe tabele, iar prin ORM este ușor să construiți rapid instrucțiuni SQL foarte complexe.

De altfel, ContainableBehavior al lui CakePHP este un exemplu excelent al modului în care CakePHP poate simplifica și eficientiza dezvoltarea PHP. Vă ajută să căutați și să filtrați datele într-un mod curat și consecvent și, de asemenea, poate ajuta la creșterea vitezei și a performanței generale a aplicației dvs. (Acesta funcționează prin modificarea temporară sau permanentă a asocierilor modelelor dvs., folosind continerile furnizate pentru a genera o serie corespunzătoare de apeluri bindModel și unbindModel .)

Provocarea cu ORM este că face utilizarea SQL atât de simplă încât, dacă un dezvoltator nu este atent, el sau ea poate scrie interogări SQL ineficiente fără să vrea. Cu siguranță am văzut de multe ori aplicații Cake prost scrise care nu și-au simplificat interogările. Aceste probleme tind să apară la câțiva ani după ce un sistem a fost implementat, când bazele de date devin mai mari și interogările scrise prost devin din ce în ce mai lente.

Problema principală aici este că, înainte de cea mai recentă versiune CakePHP 3, ORM-ul lui Cake ar prelua în mod implicit orice tabel asociat atunci când efectua o interogare. Ca rezultat, o interogare simplă „găsiți tot” ar putea deveni destul de umflată, deoarece SQL-ul de bază ar prelua toate datele din toate tabelele asociate. În versiunea 3, acest comportament nu mai este implicit. (Și în versiunile anterioare de CakePHP, acest comportament implicit este ușor de dezactivat prin simpla adăugare public $recursive = -1; la fișierul principal AppModel.php .)

În general, o revizuire a ORM-ului Cake arată că într-adevăr ajută la eficientizarea dezvoltării și, dacă este utilizat corect, este un instrument uimitor pentru a crea rapid interogări complexe. Cu toate acestea, este esențial ca dezvoltatorii să-și ia timp pentru a înțelege pe deplin ORM și pentru a se asigura că interogările lor sunt optimizate corespunzător (așa cum este adevărat în orice limbă).

Componente și ajutoare: biblioteci CakePHP

Una dintre caracteristicile grozave ale CakePHP sunt bibliotecile încorporate – Componente și Ajutoare – care elimină multe sarcini de dezvoltare plictisitoare, repetitive și plictisitoare. În contextul MVC, Componentele ajută la eficientizarea dezvoltării controlerului, în timp ce Helpers simplifică codificarea vizualizării și logica (adică stratul de prezentare).

PaginatorComponent , de exemplu, construiește automat în mod magic o interfață pentru pagina următoare/anterioră dintr-o interogare de căutare. Adăugați JsHelper și dintr-o dată aveți AJAX Pagination, alimentat de cadrul dvs. JavaScript preferat (jQuery în mod implicit).

O eșantionare rapidă a altor Helper utili include:

  • TimeHelper : Afișarea datelor și a orelor este o simplă simplă, oferind o suită de funcții pentru formatarea și evaluarea valorilor de timp.
  • NumberHelper : Oferă metode convenabile pentru afișarea numerelor într-o varietate de formate și precizii comune (sau personalizate).
  • TextHelper : ajută la activarea link-urilor, formatarea adreselor URL, crearea de fragmente de text în jurul cuvintelor sau expresiilor alese, evidențierea cuvintelor cheie în blocuri de text și trunchierea grațioasă a porțiunilor lungi de text.

Și mai sunt multe.

Critici la adresa CakePHP 3

Cu siguranță, fiecare cadru are avantajele și dezavantajele sale, iar CakePHP nu face excepție. Iată câteva dintre cele mai frecvente critici adresate CakePHP în afara acestei recenzii:

  • „Cadru moștenit; umflat și lent.” Această critică este de obicei mai mult una istorică, cu adevăr limitat (dacă există) astăzi. Sprijinirea versiunilor PHP încă din PHP 4 a impus ca CakePHP să se ocupe de multe dintre problemele moștenite ale PHP. Odată cu maturizarea PHP și, în special, odată cu lansarea versiunii 3 CakePHP, această acuzație și-a pierdut cu adevărat valabilitatea.

  • „Prea strict și restrictiv.” Deși există avantaje clare ale convențiilor CakePHP, există totuși cei care le critică. Criticii susțin adesea că convențiile sunt prea stricte, dar nu recunosc (sau recunosc) că aceste convenții pot fi ușor depășite. Prin adoptarea unui set standard de convenții, Cake caută să facă dezvoltarea coerentă, ceea ce, având în vedere practicile de codare altfel laxe ale PHP, ar trebui să fie văzută doar ca un lucru pozitiv.

  • „Cic de eliberare lentă”. Un ciclu de eliberare lent nu este neapărat rău. Dimpotrivă, un ciclu de eliberare prea agresiv poate fi de fapt mai problematic. De fapt, o parte din motivul pentru care lansările majore CakePHP necesită timp este asigurarea compatibilităţii cu versiunile anterioare de PHP care sunt încă implementate pe scară largă. În plus, acest ciclu de lansare conservator și accentul pus pe compatibilitatea cu versiunea anterioară elimină nevoia de modificări majore (și frecvente) la codul tău atunci când sunt lansate versiuni noi. De asemenea, trebuie remarcat faptul că echipa CakePHP 3 este deloc lentă când vine vorba de lansări minore (remedieri de erori, patch-uri, îmbunătățiri minore etc.), care sunt lansate lunar . În mod similar, majoritatea biletelor de erori primesc răspuns în câteva ore de la postare.

  • „Nu este o soluție ieșită din cutie.” Spre deosebire de multe alte cadre PHP moderne „aplicații web din cutie” (cum ar fi Yii, de exemplu), CakePHP caută în mod intenționat să sprijine și să activeze soluții personalizate. Eu personal am beneficiat enorm de pe urma dezvoltării unui număr mare de site-uri web și aplicații mari, personalizate, bazate pe baze de date.

  • „Folosește matrice de date mai degrabă decât obiecte.” Acest lucru nu mai este adevărat, începând cu versiunea 3. În versiunile anterioare, orice date ar trebui să fie stocate și referite ca matrice imbricate (de exemplu, $user['User']['username'] ). CakePHP 3 abordează în cele din urmă acest lucru, în schimb stochează datele ca obiecte (de exemplu, $user->username ).

  • „Documentare slabă”. Există o oarecare validitate a acestei critici, deoarece documentația CakePHP nu pare să fi fost întotdeauna scrisă ținând cont de începător (informațiile importante sunt uneori discutate doar într-o propoziție sau două, în timp ce câteva paragrafe de discuție ar fi fost probabil justificate ). Echipa de dezvoltare Cake este conștientă de acest lucru și lucrează pentru a îmbunătăți documentația în consecință. De fapt, pagina de start a documentației CakePHP 3 afirmă în mod explicit un nivel ridicat de angajament față de „calitate, validitate și acuratețe” a documentației. Deoarece CakePHP este un cadru condus de comunitate, un buton „Îmbunătățiți acest document” este furnizat pe fiecare pagină a documentației, permițând și încurajând utilizatorii CakePHP să contribuie cu propriile adăugiri, ștergeri sau corecții la documentație.

Concluzie

Per total, la aproape 10 ani de la lansarea sa inițială, o revizuire a CakePHP dezvăluie că acesta rămâne un concurent vibrant și formidabil pentru multe alte cadre PHP care au apărut de atunci.

CakePHP este o soluție de dezvoltare completă și cuprinzătoare. Baza de cod este matură, iar funcționalitatea pare nesfârșită. În general, Cake a fost construit pentru a face dezvoltarea rapidă, ceea ce este important nu numai pentru dezvoltatorii de software, ci și pentru investitori. Cel mai mare cost al dezvoltării software este costul timpului de dezvoltare, iar CakePHP își propune să reducă semnificativ timpul de dezvoltare.

CakePHP este un proiect condus de comunitate. Se poate îmbunătăți doar pe măsură ce tot mai mulți oameni se implică. După ce am fost implicat timp de 7 ani și am văzut cum comunitatea continuă să crească, sunt încântat de această următoare etapă pentru CakePHP. Lansarea CakePHP 3 și maturitatea atât a PHP, cât și a CakePHP înseamnă că cadrul va continua să devină din ce în ce mai bun.

Dacă sunteți în căutarea unei soluții bazate pe PHP, care oferă multe beneficii similare cu Ruby on Rails (în ceea ce privește ușurința de utilizare și convenția față de configurație), atunci dă-ți o încercare lui CakePHP. Tutorialul blogului CakePHP durează doar câteva minute pentru a configura și rula, sau, alternativ, CakeCoded oferă o serie de lecții clare pentru a ajuta un dezvoltator PHP să familiarizeze cu CakePHP și să înceapă să-l folosească. Cu aceste resurse, veți vedea rapid în ce măsură CakePHP vă poate accelera și îmbunătăți eforturile de dezvoltare software PHP. Bucurați-vă!


Michael Houghton este un inginer Toptal cu sediul în Irlanda, cu o experiență vastă în CakePHP. El a dezvoltat peste 100 de site-uri web cu framework-ul, a lucrat cu echipa de la CakeDC (entitate comercială din spatele framework-ului CakePHP), a trimis diverse patch-uri și a ajutat cu documentația CakePHP.