La mia recensione di CakePHP 3 – Ancora fresca, ancora calda

Pubblicato: 2022-03-11

Il mese scorso, il team di CakePHP ha annunciato il lancio della versione alpha di CakePHP 3. Il team di sviluppo di Cake considera la versione 3 un punto di svolta, quindi con la versione alpha della versione 3 ora appena uscita dal forno, questo articolo prende una nuovo sguardo a CakePHP 3 come un framework moderno ed efficace per lo sviluppo di PHP.

Questo dolce CakePHP 3 è appena sfornato.

Una breve storia

Al giorno d'oggi, ci sono così tante opzioni quando si tratta di sviluppo PHP. Con la maturazione di PHP, sempre più Framework PHP sono entrati in scena, fornendo agli sviluppatori un'ampia gamma di scelte. Ma non è sempre stato così.

Nel 2005, quando PHP 4 era ancora lo standard, non esistevano framework PHP e lo sviluppo di un approccio di codifica orientato agli oggetti in PHP era certamente una sfida. Fu allora che emerse CakePHP, il primo framework MVC PHP in assoluto. Nei quasi 10 anni trascorsi da quando è stato rilasciato per la prima volta, CakePHP ha continuato ad evolversi, mantenendo una buona quota di mercato di sviluppatori PHP.

Quanto è popolare il framework CakePHP? È classificato tra i primi 4 progetti PHP più popolari su GitHub, su circa 130.000 progetti, con oltre 18.000 membri nel gruppo Google CakePHP con 32.000 argomenti. Con 270 contributori al codice e 320 contributori alla documentazione, non si può negare che CakePHP abbia un grande seguito. L'attuale popolarità diffusa e crescente di CakePHP è ben riassunta in un articolo di James Watts, membro principale e community manager di CakePHP per la Cake Software Foundation, che ho intervistato mentre scrivevo questo articolo.

Con la versione 3 del framework ora disponibile, CakePHP dovrebbe sicuramente rimanere una forza trainante nel mondo PHP e uno dei principali contendenti nel variegato panorama odierno di framework PHP.

Cosa c'è di nuovo nella versione 3 di CakePHP?

Questa recensione si basa sulla versione alpha di CakePHP 3.0, che incorpora una serie di nuove funzionalità e miglioramenti tra cui:

  • Migliori prestazioni. La versione 3 incorpora miglioramenti delle prestazioni al processo di bootstrap, al processo di routing e a diverse parti del processo per la generazione di modelli di supporto.

  • Componenti e aiutanti migliorati. La versione 3 fornisce un supporto avanzato per i "messaggi flash" con i suoi nuovi FlashHelper e FlashComponent. Inoltre, il CookieComponent è stato migliorato, rendendo più semplice separare la configurazione degli spazi dei nomi dei cookie e la gestione dei dati dei cookie.

  • Gestione delle sessioni migliorata. La gestione delle sessioni è sempre stata una classe statica in CakePHP che si è rivelata problematica in diversi modi. Con la versione 3, ora puoi accedere alla sessione dall'oggetto request $this->request->session() . Questa modifica semplifica anche il test della sessione e consente a CakePHP di utilizzare PHPUnit 4.x.

  • Maggiore coerenza delle convenzioni. Lo scheletro dell'applicazione e gli scheletri dei plugin sono stati aggiornati per utilizzare la stessa struttura di directory in modo da essere più coerenti l'uno con l'altro.

  • Temi e plugin uniti. Un obiettivo chiave di CakePHP 3 era rendere i temi più potenti e robusti. Lavorando verso questo obiettivo, è diventato evidente che ciò che era veramente necessario era che i temi fornissero le stesse capacità dei plugin. Di conseguenza, qualsiasi plug-in può ora essere utilizzato come tema, il che semplifica anche il confezionamento e la ridistribuzione.

  • Miglioramenti ORM. Diverse modifiche API sono state apportate all'ORM (mappatura relazionale degli oggetti). In particolare, ora è più semplice specificare associazioni profonde per le operazioni di salvataggio e un paio di convenzioni sono state modificate per ridurre la curva di apprendimento e la confusione tra i nuovi utenti.

Inoltre, ci sono alcune funzionalità aggiuntive che dovrebbero essere incorporate anche nella versione beta della versione 3.0. Più importante:

  • Miglioramenti delle funzionalità di internazionalizzazione e localizzazione (i18n e L10n).
  • Un sostituto di CacheHelper basato su Edge Side Include
  • Una nuova API di routing per una dichiarazione di route più semplice e veloce

In effetti, la versione 3 rappresenta un aggiornamento significativo rispetto alle versioni precedenti di CakePHP.

Perché CakePHP?

Sebbene CakePHP abbia molte fantastiche funzionalità, questa recensione si concentra su alcune in particolare che aiutano davvero a distinguerlo, vale a dire:

  • Convenzione sulla configurazione
  • L'ORM di CakePHP (mappatura relazionale degli oggetti)
  • Componenti e aiutanti

Convenzione sulla configurazione

CakePHP ha sempre puntato sullo sviluppo rapido e coerente e, a tal fine, CakePHP pone una forte enfasi sulle convenzioni. Pertanto, come Ruby on Rails (da cui CakePHP ha tratto gran parte della sua ispirazione), CakePHP aderisce fortemente alla convenzione sul principio di configurazione.

Le convenzioni significano che uno sviluppatore non deve pensare a "dove vanno le cose" quando impara a usare il framework CakePHP, poiché le impostazioni predefinite per queste regole sono già state messe in atto. Sebbene sia necessario acquisire familiarità con le convenzioni di CakePHP, una volta padroneggiate, lo sviluppatore può concentrarsi sullo sviluppo di base, piuttosto che doversi preoccupare di dove è posizionato il codice e altri problemi di configurazione.

Le convenzioni di CakePHP sono in netto contrasto con lo stesso PHP, che è un linguaggio abbastanza liberale. Come risultato delle sue convenzioni, CakePHP aiuta a garantire una maggiore coerenza nello stile e nella struttura della codifica tra più sviluppatori e anche tra più team. Adottando un insieme standard di convenzioni, Cake si sforza di rendere lo sviluppo più coerente.

Per uno schema di database, ad esempio, CakePHP fa alcune ipotesi predefinite in termini di nome di determinate variabili, nomi di tabelle e campi. Nello specifico Cake si aspetta che:

  • I nomi delle tabelle saranno plurali (es. orders )
  • Il nome del campo della chiave primaria sarà id
  • I nomi di qualsiasi campo di chiave esterna saranno basati sul nome della tabella di riferimento seguito da _id (ad esempio, la chiave esterna in una tabella customers sarà denominata customer_id ).

Per illustrare, consideriamo una semplice revisione di due tabelle ( articles e users ) da un database di post di blog. Nel nostro esempio, diremo che un Articles "appartiene a" un Users e un Users "ha molti" Articles . Queste relazioni sarebbero specificate come segue in 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 assume le convenzioni predefinite e quindi sa automaticamente quali chiavi esterne cercare (ad esempio, user_id nella tabella degli articles ) quando recupera qualsiasi associazione.

È importante sottolineare, tuttavia, che CakePHP 3 consente di sovrascrivere facilmente le sue convenzioni predefinite. Ad esempio, supponiamo che la nostra chiave esterna nella tabella users sia stata chiamata author_id invece di user_id . Specificare questo richiederebbe solo le seguenti due piccole modifiche al nostro codice per far sapere a CakePHP che non stiamo usando l'impostazione predefinita:

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

Quindi, sebbene le convenzioni siano effettivamente parte integrante di CakePHP e abbiano sicuramente i loro vantaggi, sovrascriverle quando necessario è davvero abbastanza semplice, come abbiamo mostrato qui.

Mentre alcuni sviluppatori potrebbero preferire framework PHP (come Yii e Laravel) che non fanno molto affidamento sulle convenzioni, le convenzioni CakePHP possono in effetti essere piuttosto vantaggiose. Possono aiutare a ridurre drasticamente i tempi di accelerazione per uno sviluppatore CakePHP quando ha il compito di migliorare o mantenere il codice scritto da un altro sviluppatore, poiché si traducono in una struttura di codifica e convenzioni coerenti tra più sviluppatori e progetti CakePHP.

La mappatura relazionale degli oggetti (ORM) di CakePHP

La mappatura relazionale a oggetti (ORM) di CakePHP beneficia notevolmente delle convenzioni quadro di CakePHP. Impostando lo schema del database secondo gli standard di Cake, puoi collegare rapidamente le tabelle tra loro tramite il potente ORM di Cake. Raramente avrai bisogno di scrivere un'istruzione SQL, poiché CakePHP gestisce facilmente cose come i join di tabelle, hasMany e persino hasAndBelongsToMany relazioni.

Sfruttando ContainableBehavior di CakePHP, tramite le associazioni di modelli puoi specificare quali tabelle e campi del database selezionare da una query SQL. Questo può andare in profondità di diverse tabelle e tramite l'ORM è facile costruire rapidamente istruzioni SQL altamente complesse.

Per inciso, ContainableBehavior di CakePHP è un ottimo esempio di come CakePHP può semplificare e ottimizzare lo sviluppo di PHP. Ti aiuta a cercare e filtrare i dati in modo pulito e coerente e può anche aiutare ad aumentare la velocità e le prestazioni complessive della tua applicazione. (Funziona alterando temporaneamente o permanentemente le associazioni dei tuoi modelli, utilizzando i contenitori forniti per generare una serie corrispondente di chiamate bindModel e unbindModel .)

La sfida con l'ORM è che rende l'utilizzo di SQL così semplice che, se uno sviluppatore non è attento, può scrivere query SQL inefficienti senza volerlo. Ho sicuramente visto molte volte applicazioni Cake scritte male che non hanno ottimizzato le loro query. Questi problemi tendono a emergere un paio d'anni dopo l'implementazione di un sistema, quando i database diventano più grandi e le query scritte male diventano sempre più lente.

Il problema principale qui è che, prima dell'ultima versione 3 di CakePHP, l'ORM di Cake recuperava per impostazione predefinita tutte le tabelle associate durante l'esecuzione di una query. Di conseguenza, una semplice query "trova tutto" potrebbe potenzialmente diventare piuttosto gonfia poiché l'SQL sottostante recupererebbe tutti i dati da tutte le tabelle associate. Nella versione 3, questo comportamento non è più l'impostazione predefinita. (E nelle versioni precedenti di CakePHP, questo comportamento predefinito è facile da disabilitare semplicemente aggiungendo public $recursive = -1; al tuo file AppModel.php principale.)

Nel complesso, una revisione dell'ORM di Cake mostra che aiuta davvero a semplificare lo sviluppo e, se utilizzato correttamente, è uno strumento straordinario per creare rapidamente query complesse. È comunque fondamentale che gli sviluppatori si prendano il tempo necessario per comprendere appieno l'ORM e assicurarsi che le loro query siano adeguatamente ottimizzate (come è vero in qualsiasi lingua).

Componenti e aiutanti: librerie CakePHP

Una delle grandi caratteristiche di CakePHP sono le librerie integrate - Componenti e Aiutanti - che eliminano molte attività di sviluppo noiose, ripetitive e noiose. Nel contesto MVC, i componenti aiutano a semplificare lo sviluppo del controller, mentre gli helper semplificano la codifica e la logica della vista (ad esempio, il livello di presentazione).

Il PaginatorComponent , ad esempio, crea automaticamente un'interfaccia di pagina successiva/precedente da una query di ricerca. Aggiungi JsHelper e improvvisamente hai AJAX Pagination, alimentato dal tuo framework JavaScript preferito (jQuery per impostazione predefinita).

Un rapido esempio di altri utili aiutanti include:

  • TimeHelper : rende la visualizzazione di date e orari un gioco da ragazzi, fornendo una suite di funzioni per la formattazione e la valutazione dei valori temporali.
  • NumberHelper : fornisce metodi convenienti per visualizzare i numeri in una varietà di formati e precisioni comuni (o personalizzati).
  • TextHelper : aiuta a abilitare i collegamenti, formattare gli URL, creare estratti di testo attorno a parole o frasi scelte, evidenziare le parole chiave in blocchi di testo e troncare con grazia lunghi tratti di testo.

E ce ne sono molti altri.

Critiche a CakePHP 3

A dire il vero, ogni framework ha i suoi pro e contro e CakePHP non fa eccezione. Ecco alcune delle critiche più comuni rivolte a CakePHP al di fuori di questa recensione:

  • “Quadro di eredità; gonfio e lento. Questa critica è tipicamente più storica, con verità limitata (se presente). Il supporto di versioni PHP fin da PHP 4 ha storicamente richiesto a CakePHP di affrontare molti dei problemi legacy di PHP. Con la maturazione di PHP, e in particolare con il rilascio di CakePHP versione 3, questa affermazione ha davvero perso la sua validità.

  • "Troppo severo e limitante." Sebbene ci siano chiari vantaggi nelle convenzioni CakePHP, ci sono comunque coloro che le criticano. I critici spesso sostengono che le convenzioni sono troppo rigide, ma non riescono a riconoscere (o riconoscere) che queste convenzioni possono essere facilmente ignorate. Adottando un insieme standard di convenzioni, Cake cerca di rendere coerente lo sviluppo che, date le pratiche di codifica altrimenti allentate di PHP, dovrebbe essere visto solo come una cosa positiva.

  • “Ciclo di rilascio lento”. Un ciclo di rilascio lento non è necessariamente negativo. Al contrario, un ciclo di rilascio troppo aggressivo può effettivamente essere più problematico. In effetti, parte del motivo per cui le versioni principali di CakePHP richiedono tempo è garantire la compatibilità con le versioni precedenti di PHP che sono ancora ampiamente distribuite. Inoltre, questo ciclo di rilascio conservativo e l'enfasi sulla compatibilità con le versioni precedenti elimina la necessità di modifiche importanti (e frequenti) al codice quando vengono rilasciate nuove versioni. Va anche notato che il team di CakePHP 3 è tutt'altro che lento quando si tratta di versioni minori (correzioni di bug, patch, miglioramenti minori, ecc.), Che vengono rilasciate mensilmente . Allo stesso modo, la maggior parte dei ticket di bug riceve risposta entro poche ore dalla pubblicazione.

  • "Non è una soluzione pronta all'uso." In contrasto con molti altri moderni framework PHP "web app out of the box" (come Yii, ad esempio), CakePHP cerca intenzionalmente di supportare e abilitare soluzioni personalizzate. Personalmente ne ho tratto grandi benefici nello sviluppo di una serie di siti Web e applicazioni di grandi dimensioni, personalizzati e basati su database.

  • "Utilizza array di dati anziché oggetti". Questo non è più vero, a partire dalla versione 3. Nelle versioni precedenti, tutti i dati avrebbero dovuto essere archiviati e referenziati come array nidificati (ad esempio, $user['User']['username'] ). CakePHP 3 finalmente risolve questo problema, memorizzando invece i dati come oggetti (ad esempio, $user->username ).

  • "Documentazione scarsa". C'è una certa validità in questa critica, in quanto la documentazione di CakePHP non sembra essere sempre stata scritta pensando al principiante (le informazioni importanti a volte vengono discusse solo in una o due frasi, mentre alcuni paragrafi di discussione sarebbero stati probabilmente giustificati ). Il team di sviluppo di Cake ne è consapevole e sta lavorando per migliorare la documentazione di conseguenza. Infatti, la home page della documentazione di CakePHP 3 afferma esplicitamente un alto livello di impegno per la “qualità, validità e accuratezza” della documentazione. Poiché CakePHP è un framework guidato dalla comunità, in ogni pagina della documentazione viene fornito un pulsante "Migliora questo documento", che consente e incoraggia gli utenti di CakePHP a contribuire con le proprie aggiunte, eliminazioni o correzioni alla documentazione.

Conclusione

Nel complesso, quasi 10 anni dopo il suo rilascio iniziale, una recensione di CakePHP rivela che rimane un vivace e formidabile concorrente dei molti altri framework PHP che sono emersi da allora.

CakePHP è una soluzione di sviluppo completa e completa. La base di codice è matura e la funzionalità sembra infinita. Nel complesso, Cake è stato creato per rendere rapido lo sviluppo, il che è importante non solo per gli sviluppatori di software, ma anche per gli investitori. Il costo maggiore dello sviluppo del software è il costo del tempo di sviluppo e CakePHP mira a ridurre significativamente i tempi di sviluppo.

CakePHP è un progetto gestito dalla comunità. Può solo migliorare man mano che sempre più persone vengono coinvolte. Essendo stato coinvolto per 7 anni e visto la comunità continuare a crescere, sono entusiasta di questa fase successiva per CakePHP. Il lancio di CakePHP 3 e la maturità di PHP e CakePHP significano che il framework continuerà a migliorare sempre di più.

Se stai cercando una soluzione basata su PHP che offra molti vantaggi simili a Ruby on Rails (in termini di facilità d'uso e convenzione sulla configurazione), allora fai un giro a CakePHP. Il tutorial del blog di CakePHP richiede solo pochi minuti per essere impostato ed eseguito, o in alternativa, CakeCoded offre una serie di lezioni chiare per aiutare uno sviluppatore PHP a familiarizzare con CakePHP e per iniziare a usarlo. Con queste risorse, vedrai rapidamente fino a che punto CakePHP può accelerare e migliorare i tuoi sforzi di sviluppo del software PHP. Divertiti!


Michael Houghton è un Toptal Engineer con sede in Irlanda con una vasta esperienza in CakePHP. Ha sviluppato oltre 100 siti Web con il framework, ha lavorato con il team di CakeDC (l'entità commerciale dietro il framework CakePHP), ha presentato varie patch e ha aiutato con la documentazione di CakePHP.