Co­deI­gni­ter è con­si­de­ra­to un web ap­pli­ca­tion framework destinato agli svi­lup­pa­to­ri che pre­fe­ri­sco­no il fattore della velocità rispetto alla pos­si­bi­li­tà di avere una grande varietà di funzioni. Secondo la pagina web ufficiale del progetto, l’obiettivo prin­ci­pa­le del design del PHP framework open source è quello di garantire il massimo delle pre­sta­zio­ni e della fles­si­bi­li­tà con una struttura che sia il più ridotta possibile.

Cos’è Co­deI­gni­ter?

Co­deI­gni­ter è un web framework scritto in lin­guag­gio PHP che vanta di poter conferire ef­fi­cien­za e velocità allo sviluppo di ap­pli­ca­zio­ni web grazie al design del software par­ti­co­lar­men­te compatto. L’ideatrice di Co­deI­gni­ter è l’azienda sta­tu­ni­ten­se EllisLab, che nel febbraio del 2006 ne ha ri­la­scia­to la prima versione ufficiale. Il 9 luglio 2013 ha poi an­nun­cia­to di non riuscire, da sola, a radunare le risorse suf­fi­cien­ti per poter ef­fet­tua­re uno sviluppo del software, così un anno dopo il progetto è stato acquisito dal British Columbia Institute of Tech­no­lo­gy (BCIT). Il codice sorgente del framework è di­spo­ni­bi­le con licenza MIT e può venire scaricato tramite il servizio online GitHub. Da ottobre 2016 viene offerta l’ultima versione di Co­deI­gni­ter 3.1.2, di­spo­ni­bi­le gra­tui­ta­men­te per il download sulla pagina web ufficiale del progetto.

Assetto e struttura del framework

Il design orientato alla per­for­man­ce di Co­deI­gni­ter viene esaltato dall’assetto slanciato del framework PHP. Questo, infatti, si orienta sul modello di ar­chi­tet­tu­ra per software Model-View-Con­trol­ler (MVC). Il principio che sta alla base di MVC è la rigida se­pa­ra­zio­ne tra codice di pro­gram­ma­zio­ne e pre­sen­ta­zio­ne, rea­liz­za­to grazie a un assetto del software di tipo modulare e il tra­sfe­ri­men­to del codice PHP. Si dif­fe­ren­zia­no tre com­po­nen­ti prin­ci­pa­li: il modello (Model), la vista (View) e il con­trol­lo­re (Con­trol­ler).

  • Il modello (Model) rap­pre­sen­ta la struttura dei dati di un’ap­pli­ca­zio­ne web svi­lup­pa­ta sulla base di Co­deI­gni­ter. A questo scopo vengono definite delle co­sid­det­te classi di modello (“model classes”) nel codice sorgente. Grazie all’accesso a un database, queste con­ten­go­no funzioni spe­ci­fi­che con le quali possono venire aperte, salvate o ag­gior­na­te le in­for­ma­zio­ni.
  • La vista (View) è quell’aspetto di un’ap­pli­ca­zio­ne che viene pre­sen­ta­to all’utente finale. Di norma si tratta di un documento HTML nel quale i contenuti vengono integrati tramite PHP in maniera dinamica. La vista è quindi una sorta di template. Co­deI­gni­ter offre inoltre la pos­si­bi­li­tà di definire le sezioni di pagine web (come l’header e il footer oppure pagine RSS) come vista. Di norma le ap­pli­ca­zio­ni web usu­frui­sco­no di diverse viste che pro­pon­go­no i propri contenuti usu­fruen­do del medesimo modello. In questo modo è possibile pre­sen­ta­re le dif­fe­ren­ti features del programma con diversi tipi di vi­sua­liz­za­zio­ni.
  • Il con­trol­lo­re (Con­trol­ler) funge da entità me­dia­tri­ce tra modello, vista ed ogni altra risorsa che occorre per elaborare una richiesta HTTP oppure per creare un sito web dinamico. Questo com­po­nen­te accoglie le richieste in entrata, cerca la vista de­si­de­ra­ta e inoltra i contenuti al modello, il quale li ha caricati a partire da un database.

Grazie alla seguente grafica è possibile vedere l’in­te­ra­zio­ne che in­ter­cor­re tra i com­po­nen­ti MVC:

La struttura MVC fa sì che il design del software sia fles­si­bi­le, e che i singoli moduli del programma vengano scambiati, elaborati e riu­ti­liz­za­ti senza grande dif­fi­col­tà. Premesso che non vengano ef­fet­tua­ti cam­bia­men­ti sulle in­ter­fac­ce, le modifiche ef­fet­tua­te su un com­po­nen­te, invece, so­li­ta­men­te non hanno alcun effetto sul codice sorgente di altri com­po­nen­ti. La netta se­pa­ra­zio­ne tra logica del programma e vi­sua­liz­za­zio­ne permette che il codice di pro­gram­ma­zio­ne sia chiaro e ben strut­tu­ra­to. Le ap­pli­ca­zio­ni web su base MVC sono con­si­de­ra­te facili da usare anche durante la ma­nu­ten­zio­ne. In caso di errore, il più delle volte la causa della sorgente di errore va ricercata tra uno di questi com­po­nen­ti.

Oltre a ciò, il modello di ar­chi­tet­tu­ra MVC offre la pos­si­bi­li­tà di svi­lup­pa­re se­pa­ra­ta­men­te la logica e il layout dell’ap­pli­ca­zio­ne web. Se gli svi­lup­pa­to­ri back end e quelli front end lavorano pa­ral­le­la­men­te, le ap­pli­ca­zio­ni verranno ultimate de­ci­sa­men­te più in fretta. Co­deI­gni­ter usu­frui­sce di MVC, ma non vincola del tutto gli utenti a usare questo modello di ar­chi­tet­tu­ra. Mentre, per quanto riguarda i com­po­nen­ti con­trol­ler e vista, si tratta di elementi ob­bli­ga­to­ri, i col­le­ga­men­ti al database tramite il modello sono invece opzionali. In più è anche possibile rea­liz­za­re un’ap­pli­ca­zio­ne sulla base di Co­deI­gni­ter che abbia un’ar­chi­tet­tu­ra del tipo HMVC (Hie­rar­chi­cal MVC Ar­chi­tec­tu­re), la quale amplia il modello MVC ag­giun­gen­do un livello di logica ge­rar­chi­ca.

Il flusso di ap­pli­ca­zio­ne del PHP framework

Co­deI­gni­ter si basa su un concetto di URL: ciò significa che il con­trol­ler diventa l’unità centrale di mo­ni­to­rag­gio tra vista e modello tramite l’in­se­ri­men­to di un URL nella barra di ricerca del browser. A questo scopo gli svi­lup­pa­to­ri creano le co­sid­det­te classi con­trol­ler (classes). In questo caso si tratta di file PHP, che con­ten­go­no diverse funzioni per caricare librerie (libraries), esten­sio­ni (plugins) oppure classi aiutanti (helper), per rea­liz­za­re col­le­ga­men­ti alle banche dati, per integrare un modello oppure per ricercare una vista specifica.

Il flusso di ap­pli­ca­zio­ne di Co­deI­gni­ter si basa quindi sul seguente schema URL di base:

example.com/class/function/parameter

Al dominio (example.com) segue una classe con­trol­ler che va coinvolta, come anche una specifica funzione con­trol­ler. La con­clu­sio­ne è co­sti­tui­ta da parametri (Parameter) opzionali: questi servono a tra­smet­te­re ID o variabili al con­trol­ler scelto.

Nella pratica un URL di Co­deI­gni­ter potrebbe apparire come segue:

example.com/news/article/511

Un URL del genere richiama il con­trol­ler news presente sul dominio example.com e lo induce a mettere in atto la funzione article (ad esempio per caricare una vista omonima per la vi­sua­liz­za­zio­ne dell’articolo). Quali sono i contenuti che devono essere ri­chia­ma­ti tramite il modello a partire dal database, sono i parametri opzionali a deciderlo, i quali vengono trasmessi al con­trol­ler assieme all’URL; in questo esempio un articolo con l’ID 511.

Nella con­fi­gu­ra­zio­ne finale il PHP framework rap­pre­sen­ta l’index.php in ogni URL dell’ap­pli­ca­zio­ne:

example.com/index.php/news/article/511

Questo file PHP contiene in­for­ma­zio­ni riguardo alla posizione dei file core del framework e a dove si trovano le librerie, esten­sio­ni, oppure classi aiutanti integrate, e in quale percorso sono i file di ap­pli­ca­zio­ne. L’elemento index.php serve quindi all’ini­zia­liz­za­zio­ne di tutte le risorse di base.

Se Co­deI­gni­ter opera su un server Apache HTTP, index.php può venire rimosso tramite mod_rewrite dagli URL delle ap­pli­ca­zio­ni, per mettere a di­spo­si­zio­ne degli indirizzi web “puliti” agli utenti finali e ai crawler dei motori di ricerca. Gli svi­lup­pa­to­ri in­se­ri­sco­no il seguente blocco di codice nel file .htaccess del server web:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

La struttura di base del framework PHP si regge in­nan­zi­tut­to sulle classi con­trol­ler, sulle classi modello e sui template di vista.

Classi con­trol­ler

Co­deI­gni­ter dà agli svi­lup­pa­to­ri l’op­por­tu­ni­tà di pro­gram­ma­re con­trol­ler in­di­vi­dua­li come classi definite dall’utente. A questo scopo gli svi­lup­pa­to­ri web mettono a di­spo­si­zio­ne un file PHP separato per ogni con­trol­ler all’interno del percorso ap­pli­ca­tion/con­trol­lers/. I con­trol­ler con­ten­go­no la logica di programma di un’ap­pli­ca­zio­ne web svi­lup­pa­ta con Co­deI­gni­ter e vengono create sotto forma di sot­to­clas­si dell’elemento CI_Con­trol­ler class. All’interno del codice sorgente i pro­gram­ma­to­ri fanno lo stesso grazie alla parola chiave extends.

class News extends CI_Controller {
}

Essendo una sot­to­clas­se, News eredita dalla classe genitore CI_Con­trol­ler tutte le funzioni ri­guar­dan­ti la vi­si­bi­li­tà public e protected.

N.B.:

Nel PHP le parole chiave public, protected o private servono a definire la vi­si­bi­li­tà di una ca­rat­te­ri­sti­ca o di una funzione. Se un elemento riceve la di­chia­ra­zio­ne di public, tutte le classi di un software avranno accesso a questo elemento. Se, però, l’accesso deve essere limitato alle classi genitore e alle classi derivate, i pro­gram­ma­to­ri adoperano la parola chiave protected. Un elemento che viene di­chia­ra­to private sarà esclu­si­va­men­te a di­spo­si­zio­ne della classe definita dall’elemento.

Ogni classe con­trol­ler definita dall’utente deve inoltre contenere una funzione di co­strut­to­re, tramite la quale si riescono a integrare librerie, modelli, banche dati oppure classi aiutanti. A partire dalla versione PHP5 viene uti­liz­za­to l’elemento __construct() come funzione di co­strut­to­re standard.

<?php
class News extends CI_Controller {
    public function __construct() {        //definisce il costruttore 
        parent::__construct();        //richiama il costruttore della classe superiore
        $this->load->helper('url');        //carica una classe aiutante per le operazioni con gli URL
        $this->load->helper('file');        //carica una classe aiutante per le operazioni con i file
        $this->load->database();     //carica un database
        $this->load->model('News_model');    //carica un modello con il nome di “News_model” 
}
?>

L’esempio mostra la classe News come sot­to­clas­se di CI_Con­trol­ler. La funzione di co­strut­to­re __construct() unisce due classi aiutanti, un database e il modello News_model. Le singole stringhe di codice vengono com­men­ta­te poi all’interno del codice sorgente.


N.B.

Tutte le classi di con­trol­ler che vengono definite in PHP per Co­deI­gni­ter devono iniziare con una lettera maiuscola (News invece di news). Nell’URL, invece, si scrivono in minuscolo.

Funzioni con­trol­ler

Se c’è la struttura di base del con­trol­ler definito dall’utente, allora la logica del programma apparirà sotto forma di funzioni del con­trol­ler, grazie alle quali è possibile ri­chia­ma­re le viste oppure rea­liz­za­re in­te­ra­zio­ni con un modello integrato.

Affinché il con­trol­ler sia in grado di caricare una vista, il documento HTML che sta alla sua base va inserito nel percorso ap­pli­ca­tion/views/ sotto forma di file PHP. Una vista semplice per la vi­sua­liz­za­zio­ne di un articolo potrebbe, ad esempio, apparire nel modo seguente:

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <title><?php echo $title; ?></title>
 </head>
 <body >
    <h1><?php echo $headline ?></h1>
    <p><?php echo  $content_body ?></p>
 </body>
</html>
N.B.

I documenti HTML che con­ten­go­no codice PHP devono essere salvati come file PHP (.php). Solo in questo modo è possibile stabilire che l’in­ter­pre­te PHP del server web rap­pre­sen­ta anche gli script e non emette il codice PHP solamente sotto forma di testo.

Per caricare una vista nel con­trol­ler, si necessita di una funzione definita dall’utente. Nell’esempio di codice seguente entra in gioco la funzione article() per caricare la vista article.php.

public function article() {
    if (!file_exists(application/views/article.php)) {
        show_404();
    }
$this->load->view('article');
}

Il codice del programma va letto come segue: in­nan­zi­tut­to Co­deI­gni­ter verifica se il percorso ap­pli­ca­tion/views/ contiene un file con il nome article.php. Questa richiesta viene rea­liz­za­ta tramite il costrutto lin­gui­sti­co if e la con­di­zio­ne negata (!) file exists().

Se la con­di­zio­ne combacia e non c’è un file omonimo all’interno del percorso cor­ri­spon­den­te, allora if propone il valore TRUE, e Co­deI­gni­ter applica la funzione show_404() avviata sotto il comando if. In questo caso l’utente ri­ce­ve­reb­be l’in­di­ca­zio­ne che il file richiesto non esiste. Se, invece, la con­di­zio­ne if non viene sod­di­sfat­ta e !file_exists viene valutato come FALSE, Co­deI­gni­ter applica la funzione $this->load->view('article'), la quale serve a caricare il file cor­ri­spon­den­te come vista all’interno dell’ap­pli­ca­zio­ne.

Finché si tratta del formato PHP, il file de­si­de­ra­to può essere avviato nella funzione view() senza suffisso. Se, però, vanno caricati altri formati allora è ob­bli­ga­to­rio apporre il relativo suffisso del file di ognuno.

Di norma Co­deI­gni­ter entra in azione nel contesto di ap­pli­ca­zio­ni web dinamiche, preferite dagli utenti rispetto alle pagine HTML statiche. Ciò si può rea­liz­za­re riempendo la vista di dati cor­ri­spon­den­ti ai parametri che Co­deI­gni­ter riceve assieme all’URL.

example.com/news/article/511

Finora tramite la funzione $this->load->view('article') si caricava la vi­sua­liz­za­zio­ne per la rap­pre­sen­ta­zio­ne dell’articolo. Ora, invece, vanno integrati spe­cial­men­te i contenuti che sono collegati al parametro 511: si tratta di un ID che con l’aiuto di un sistema di ma­na­ge­ment del database è collegato a un articolo di news specifico. Per leggere l’ID dal database e per caricarlo suc­ces­si­va­men­te sul programma, è ne­ces­sa­rio com­ple­ta­re l’esempio qui sopra perché venga ri­chia­ma­to il modello integrato all’interno del co­strut­to­re.

public function article($id) {
    if (!file_exists(application/views/article.php)) {
        show_404();
    }
    $data = $this->News_model->get_data($id);
    $this->load->view('article', $data);}

L’argomento di funzione tra­sfe­ri­to, che nell’esempio appare con il nome di variabile $id, cor­ri­spon­de alla parte dell’ID dell’URL, come ad esempio 511. La funzione del modello ancora da scrivere get_data() serve a caricare il contenuto dell’articolo collegato all’ID dal database. Il metodo view()- richiama la vista article e le trasmette questi dati sotto forma di un array as­so­cia­ti­vo ($data). Il modello News_model trasmette quindi i dati se­le­zio­na­ti al con­trol­ler News, il quale li inoltra, a sua volta, alla vista. Tutte le ope­ra­zio­ni connesse alla richiesta di dati vengono ar­chi­via­ti nel modello integrato.

Classi modello

I modelli vengono attivati in Co­deI­gni­ter per rendere di­spo­ni­bi­li funzioni con le quali è possibile ef­fet­tua­re delle spe­ci­fi­che ope­ra­zio­ni relative al database. Proprio come le classi con­trol­ler, anche le classi modello possono venire pro­gram­ma­te con il framework PHP in modo che vengano definite dall’utente.

Per attivare una classe modello, in­nan­zi­tut­to viene assegnato un nome alla classe: in questo caso News_model. In maniera analoga alle classi con­trol­ler, tutte le classi modello definite dall’utente sono sot­to­clas­si della classe genitore CI_Model. L’ere­di­ta­rie­tà si realizza tramite la parola chiave extends. Anche le classi modello con­net­to­no i database e altre risorse at­tra­ver­so la funzione co­strut­to­re.     

class News_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->load->database(); 
    }
}

Sulla base di questa struttura seguono le co­sid­det­te funzioni modello nelle quali gli svi­lup­pa­to­ri de­fi­ni­sco­no tutte le ope­ra­zio­ni del database che sono a di­spo­si­zio­ne del con­trol­ler tramite il relativo modello.

Funzioni modello

Le classi modello per­met­to­no agli svi­lup­pa­to­ri di definire funzioni in­di­vi­dua­li per le ope­ra­zio­ni del database. In un esempio pre­ce­den­te abbiamo uti­liz­za­to la funzione utente get_data() nella classe con­trol­ler News per estra­po­la­re i contenuti dell’articolo dal database e caricarli nella vista. Nel modello definiamo solamente quali ope­ra­zio­ni del database si na­scon­do­no dietro a questa funzione.

class News_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->load->database(); 
    }
public function get_data($id) {
     $this->db->select('content');
     $this->db->from('example_table');
     $this->db->where('id', $id);
    $query = $this->db->get();
    return $query->result();
}

Nella classe modello News_model la funzione sopra uti­liz­za­ta get_data() viene definita come ope­ra­zio­ne database, che richiede alla colonna di­chia­ra­ta sotto select() la tra­smis­sio­ne del codice ID ($id) a partire dalla tabella del database di­chia­ra­ta sotto from() tramite get() e che, con l’aiuto della funzione result(),la re­sti­tui­sce sotto forma di array. So­li­ta­men­te un modello rende di­spo­ni­bi­le una mol­te­pli­ci­tà di funzioni. Gli svi­lup­pa­to­ri possono quindi attingere alla classe Query Builder, la quale comprende una serie di funzioni pre­de­fi­ni­te per le classiche ope­ra­zio­ni database. Re­la­ti­va­men­te a questo argomento, potete trovare una pa­no­ra­mi­ca nella do­cu­men­ta­zio­ne ufficiale del framework Co­deI­gni­ter.

Gestione del routing con Co­deI­gni­ter

Quali sono le classi e le funzioni con­trol­ler che devono essere coinvolte, viene pre­sta­bi­li­to da Co­deI­gni­ter con un URL. Il framework web adopera la struttura URL classe/funzione/parametro. Questo schema di base si riesce ad adattare a pia­ci­men­to: a questo scopo, infatti, Co­deI­gni­ter mette a di­spo­si­zio­ne il file routes.php nel percorso ap­pli­ca­tion/config/. Questo contiene un array con il nome di $route, che permette agli svi­lup­pa­to­ri di definire propri criteri di routing.

Durante la con­fi­gu­ra­zio­ne finale si trovano tre in­se­ri­men­ti di default nell’array $route: il con­trol­ler standard, una regola di routing per l’override 404 come anche una regola per la so­sti­tu­zio­ne au­to­ma­ti­ca dei trattini (-) con i trattini bassi (o un­der­sco­re) (_).

$route['default_controller'] = 'home/welcome';
$route['404_override'] = 'home/welcome';
$route['translate_uri_dashes'] = FALSE;

La prima voce di default sta­bi­li­sce il con­trol­ler standard dell’ap­pli­ca­zio­ne. Questo viene caricato da Co­deI­gni­ter ogni volta che un URL non contiene ulteriori in­for­ma­zio­ni di routing al di fuori del dominio. Nell’esempio uti­liz­za­to la regola di routing definisce la classe con­trol­ler home come con­trol­ler standard. I vi­si­ta­to­ri che non danno alcun ri­fe­ri­men­to alla pagina web di de­sti­na­zio­ne all’interno dell’URL, verranno rein­di­riz­za­ti su home e vi­sua­liz­ze­ran­no la vista welcome. È una con­sue­tu­di­ne inoltrare alla homepage. Se non è stato definito nessun con­trol­ler come standard, allora, una volta che si richiama la pagina iniziale, Co­deI­gni­ter mostrerà al suo posto la pagina di errore 404.

La seconda voce di default all’interno dell’array $route definisce un con­trol­ler che viene ri­chia­ma­to ogni volta che il con­trol­ler coinvolto tramite l’URL non è stato trovato nei file dell’ap­pli­ca­zio­ne. La regola di routing $route['404_override'] = 'home' so­vra­scri­ve la pagina di errore 404, che nor­mal­men­te viene attivata in un caso del genere e, invece, conduce alla classe con­trol­ler home.

La terza voce di default all’interno dell’array $route impedisce errori di routing grazie ai trattini di unione. Il trattino, infatti, non è un simbolo valido per il nome della classe o della funzione e viene quindi so­sti­tui­to au­to­ma­ti­ca­men­te negli URL già nell’im­po­sta­zio­ne standard.

Se va rea­liz­za­ta una regola di routing definita dall’utente per un URL dinamico, allora gli svi­lup­pa­to­ri web hanno a di­spo­si­zio­ne due pos­si­bi­li­tà su Co­deI­gni­ter: gli in­se­ri­men­ti di routing per URL dinamici possono venire definiti con l’aiuto di wildcard (me­ta­ca­rat­te­ri o anche caratteri jolly) o in al­ter­na­ti­va con espres­sio­ni regolari.

L’elemento routes.php supporta due tipologie di me­ta­ca­rat­te­ri:

N.B.

I siti web con una grande quantità di pagine di errore 404 sono difficili da scan­sio­na­re per i crawler, rendendo quindi faticoso l’accesso a contenuti rilevanti per i motori di ricerca. Ciò, oltre a provocare un effetto negativo sulla user ex­pe­rien­ce, può avere un’influenza negativa sul ranking del motore di ricerca. Di norma gli svi­lup­pa­to­ri web si impegnano a evitare pagine di errore 404.

Wildcard di routes.php De­scri­zio­ne
:num Funge da me­ta­ca­rat­te­re solo per i caratteri numerici
:any Funge da me­ta­ca­rat­te­re per qualsiasi carattere

L’esempio seguente mostra un in­se­ri­men­to all’interno del routes.php, che permette di rimuovere la funzione (article) dall’URL:

$route['news/article/(:num)'] = 'news/$1';

Tramite il carattere jolly :num il parametro viene assegnato a un URL dinamico e salvato nella variabile $1. Finché le regole di routing vengono definite con :num o :any, allora vanno messe tra parentesi all’interno di routes.php.

L’elemento routes.php accetta inoltre regole di routing sotto forma di espres­sio­ni regolari. Entrambe le tipologie di me­ta­ca­rat­te­re possono essere annotate come segue:

:num corrisponde a \d+
:any corrisponde a [^/]+

Un’al­ter­na­ti­va all’esempio qui sopra potrebbe dunque essere la seguente scrittura:

$route['news/article/(\d+ )'] = 'news/$1';

Anche le espres­sio­ni regolari vengono messe tra parentesi all’interno di routes.php.

Una pa­no­ra­mi­ca del flusso di ap­pli­ca­zio­ne

Il grafico seguente riassume in sette passaggi l’ap­pli­ca­tion flow di un’ap­pli­ca­zio­ne sulla base di Co­deI­gni­ter:

1. L’index.php serve a Co­deI­gni­ter come front con­trol­ler per richieste HTTP in entrata. Qui vengono ini­zia­liz­za­te tutte le risorse di base che servono per uti­liz­za­re l’ap­pli­ca­zio­ne.

2. A livello di routing, Co­deI­gni­ter verifica quale azione deve essere messa in atto. A questo scopo l’ap­pli­ca­zio­ne allinea l’URL nella richiesta con le regole di routing definite nel routes.php.

3. Suc­ces­si­va­men­te al routing avviene il caching. Se si trova una risposta adatta alla request all’interno della cache dell’ap­pli­ca­zio­ne, allora questa verrà inoltrata di­ret­ta­men­te al browser che ha inviato la richiesta. Al­tri­men­ti il con­trol­ler esaminato durante il routing viene attivato con la funzione filtro pre­in­se­ri­ta.

4. Il framework Co­deI­gni­ter contiene un filtro integrato che in­ter­cet­ta richieste dannose. Ogni request HTTP subisce un controllo di sicurezza prima che l’ap­pli­ca­zio­ne carichi un con­trol­ler adeguato alla richiesta.

5. Se la richiesta riesce a passare il controllo del filtro, allora viene attivato il con­trol­ler: questo sceglie una vista adatta e carica il modello e anche tutte le librerie, le classi aiutanti, le esten­sio­ni e gli script che sono necessari per ri­spon­de­re alla richiesta.

6. Non appena vengono trasmessi tutti i dati rilevanti alla vista, quest’ultima può inol­trar­li al browser.

7. Se è attivo un caching, Co­deI­gni­ter ferma prov­vi­so­ria­men­te i dati in uscita per poter ri­spon­de­re di­ret­ta­men­te a richieste ri­cor­ren­ti.

I vantaggi del framework Co­deI­gni­ter

Con più di 13.000 stelline, Co­deI­gni­ter è un progetto di sviluppo GitHub molto stimato e si posiziona al terzo posto tra i framework più popolari. Ma come ogni software, anche Co­deI­gni­ter possiede sia vantaggi che svantaggi. Se siete uno svi­lup­pa­to­re web è ne­ces­sa­rio valutare entrambi prima di scegliere questo framework PHP così leggero. Questi sono i vantaggi dell’ap­pli­ca­zio­ne:

  • Con­fi­gu­ra­zio­ne semplice: il primo approccio con Co­deI­gni­ter è semplice. Gli utenti non si devono occupare a lungo della con­fi­gu­ra­zio­ne del framework, ma possono iniziare pra­ti­ca­men­te subito con lo sviluppo dell’ap­pli­ca­zio­ne che hanno pia­ni­fi­ca­to. La dif­fi­col­tà si limita fon­da­men­tal­men­te alle im­po­sta­zio­ni nel config.php nel percorso ap­pli­ca­tion/config/. Gli utenti de­fi­ni­sco­no un percorso standard per l’accesso via browser, una chiave per la codifica, un nome per i cookie di sessione e le im­po­sta­zio­ni per il cross-site-scripting (XSS). È inoltre rac­co­man­da­bi­le creare un file .htaccess per rimuovere index.php tramite Rew­ri­te­Ru­le dal percorso degli URL dell’ap­pli­ca­zio­ne. Oltre a ciò è anche in­di­spen­sa­bi­le ef­fet­tua­re la con­fi­gu­ra­zio­ne della con­nes­sio­ne al database che inserite nel file database.php.
  • Small Footprint: Co­deI­gni­ter lascia solamente una traccia minima nel sistema. Il pacchetto per il download del framework pesa 11 MB. Di questi, più di 9 MB sono dedicati all’esaustiva do­cu­men­ta­zio­ne del software. La di­men­sio­ne ridotta del codice è quindi causata dal fatto che il sistema di base di Co­deI­gni­ter comprende esclu­si­va­men­te un paio di piccole librerie. Eventuali risorse ag­giun­ti­ve possono essere caricate suc­ces­si­va­men­te senza problemi a seconda delle necessità.
  • Pre­sta­zio­ni elevate: Il sistema di base così leggero fa sì che Co­deI­gni­ter, rispetto ad altri framework PHP, possa usufruire di una velocità molto elevata, per la quale ha ricevuto anche i com­pli­men­ti dell’inventore del PHP Rasmus Lerdorf. Alla Free and Open Source Con­fe­ren­ce (FrOSCon) del 2008, infatti, Lerdorf ha co­mu­ni­ca­to che gli piace Co­deI­gni­ter, perché è più veloce e più leggero, e si allontana dall’idea comune di framework (“because it is faster, lighter and the least like a framework”).
  • URL puliti: Co­deI­gni­ter genera au­to­ma­ti­ca­men­te URL user-friendly e ot­ti­miz­za­ti per i motori di ricerca. Al posto di rea­liz­za­re l’accesso a contenuti web dinamici tramite Query Strings come altri framework PHP, Co­deI­gni­ter fa af­fi­da­men­to su un’im­po­sta­zio­ne basata sui segmenti.

URL con Query String: example.com?con­trol­ler=news&function=article&id=511

URL con segmenti: example.com/news/article/511.

  • Stile di pro­gram­ma­zio­ne libero: Co­deI­gni­ter si basa sulla libera in­ter­pre­ta­zio­ne del modello di ar­chi­tet­tu­ra MVC. Gli svi­lup­pa­to­ri non sono tenuti a seguire alcuno stile di pro­gram­ma­zio­ne specifico.
  • Do­cu­men­ta­zio­ne det­ta­glia­ta: Co­deI­gni­ter dispone di un’ampia do­cu­men­ta­zio­ne in lingua inglese, incluso un tutorial per prin­ci­pian­ti. Oltre a ciò, il codice sorgente è chiaro e com­men­ta­to pre­ci­sa­men­te. La do­cu­men­ta­zio­ne di Co­deI­gni­ter si trova sulla pagina web del progetto come guida online ed è di­spo­ni­bi­le per il download.
  • Supporto della community: gli svi­lup­pa­to­ri che svi­lup­pa­no ap­pli­ca­zio­ni sulla base di Co­deI­gni­ter possono contare sull’aiuto di altri utenti. Il progetto è seguito da una community molto attiva ed esiste un forum pubblico. At­tual­men­te sono più di 7.300 gli utenti che si scambiano opinioni riguardo all’utilizzo e allo sviluppo del framework in ben 65.000 di­scus­sio­ni.

Svantaggi del framework Co­deI­gni­ter

Già prima del passaggio a BCIT lo sviluppo del framework Co­deI­gni­ter era a tratti stagnante. Gli svi­lup­pa­to­ri che sono alla ricerca di alcune evo­lu­zio­ni tec­no­lo­gi­che, come sono state ad esempio adottate da framework simili negli anni passati, ri­mar­ran­no delusi ad aspet­tar­se­le da Co­deI­gni­ter.

  • ORM solo tramite provider terzi: la pro­gram­ma­zio­ne orientata agli oggetti (object-re­la­tio­nal mapping, ORM) è una tecnica dello sviluppo di software, che permette alle ap­pli­ca­zio­ni di tra­sfe­ri­re oggetti scritti con un lin­guag­gio di pro­gram­ma­zio­ne orientato all’oggetto come il PHP su un database re­la­zio­na­le. Co­deI­gni­ter non supporta l’ORM a livello nativo. La tecnica può però venire integrata tramite servizi offerti da terzi.
  • Template engine assente: Co­deI­gni­ter si vanta di poter operare senza dover ricorrere a un template engine. Al suo posto il framework offre op­zio­nal­men­te un semplice parser di template, che può essere con­si­de­ra­to un vantaggio. So­li­ta­men­te l’in­ter­ven­to di un template engine è connesso a un overhead della per­for­man­ce (un tempo ag­giun­ti­vo). In aggiunta, oltre al framework va appreso anche l’utilizzo del lin­guag­gio template. Al­tri­men­ti un template engine permette di separare la ge­ne­ra­zio­ne di dati dal codice per la pre­sen­ta­zio­ne, facendo sì che si crei un codice sorgente con una struttura molto chiara. Se si attiva un template engine con una sintassi leggera, può de­ci­sa­men­te ridurre l’intera esten­sio­ne del codice dell’ap­pli­ca­zio­ne.
  • Name spacing assente: grazie a name spaces PHP dà la pos­si­bi­li­tà di separare il codice di diversi gruppi di ap­pli­ca­zio­ne. Gli svi­lup­pa­to­ri PHP sfruttano questa feature per evitare conflitti che compaiono nella nomina di classi e funzioni. Capitano, ad esempio, col­li­sio­ni di nomi tra classi, funzioni, costanti o elementi PHP interni che vengono integrati da servizi offerti da terzi. Finora Co­deI­gni­ter non sfrutta questa feature PHP.
  • PHP auto loading assente: a partire dalla versione 5, con __autoload() e spl_autoload_register(), il PHP offre due funzioni che per­met­to­no di caricare au­to­ma­ti­ca­men­te de­fi­ni­zio­ni di classi a pia­ci­men­to. Questa feature non è di­spo­ni­bi­le per il framework Co­deI­gni­ter.
  • Meno librerie built-in rispetto ad altri framework PHP: Per via del design così leggero del software che offre, Co­deI­gni­ter contiene de­ci­sa­men­te meno librerie di altri PHP framework nella sua con­fi­gu­ra­zio­ne finale. Queste com­pren­do­no, in­nan­zi­tut­to, i compiti più im­por­tan­ti dello sviluppo web come accessi database, invio di e-mail, la va­li­da­zio­ne di dati dei formulari, il man­te­ni­men­to di sessioni oppure le ope­ra­zio­ni con XML-RPC. Per i compiti che vanno oltre alle features di base devono essere integrate alcune librerie proprie o risorse offerte da terzi. Un punto che può venire anche in­ter­pre­ta­to come un vantaggio dagli svi­lup­pa­to­ri che ricercano un framework ridotto al minimo es­sen­zia­le.

Co­deI­gni­ter per il lettore fret­to­lo­so

La seguente tabella illustra una rassegna dei dati più im­por­tan­ti del framework Co­deI­gni­ter:

Co­deI­gni­ter  
Svi­lup­pa­to­re British Columbia Institute of Tech­no­lo­gy (BCIT)
Edizione attuale Versione 3.1.2
Modello di design MVC/HMVC, Active Record, Chain of Re­spon­si­bi­li­ty
Co­no­scen­ze richieste PHP, pro­gram­ma­zio­ne orientata all’oggetto (OOP)
Lin­guag­gio di pro­gram­ma­zio­ne PHP 5.6 o superiore
Licenza Licenza MIT
Supporto database MySQL (5.1+), Oracle, Post­gre­SQL, MS SQL, SQLite, CUBRID, Interbase/Firebird, ODBC
ORM Solo tramite servizi offerti da terzi
Caching
Template engine No
Name spaces No
PHP auto loading No
URL ot­ti­miz­za­ti per i motori di ricerca No
Features per la sicurezza Cross-Site-Request-Forgery (XSRF), Cross-Site-Scripting (XSS), SQL Injection
Testing library PHP Unit

In con­clu­sio­ne: a quali progetti si adatta Co­deI­gni­ter?

Grazie al suo design compatto e alla sintassi facile e adatta ai prin­ci­pian­ti, Co­deI­gni­ter è l’ideale so­prat­tut­to per pro­gram­ma­to­ri in erba. Chi ha già ac­cu­mu­la­to espe­rien­ze nel campo dello sviluppo web dinamico sulla base del lin­guag­gio PHP, se la caverà in breve tempo anche con il framework leggero basato su PHP. Anche gli svi­lup­pa­to­ri web ap­prez­za­no la fles­si­bi­li­tà che un framework così ridotto alle fun­zio­na­li­tà di base come Co­deI­gni­ter mette a di­spo­si­zio­ne. Chi ha l’in­ten­zio­ne di optare per Co­deI­gni­ter dovrebbe però in­nan­zi­tut­to essere pronto da una parte a prendere con­fi­den­za con il modello di ar­chi­tet­tu­ra MVC e dall’altra a ri­nun­cia­re a un template engine e all’ORM nativo. No­no­stan­te la di­men­sio­ne ridotta del codice, il PHP framework è adatto sia per progetti piccoli che per quelli più grandi.

Vai al menu prin­ci­pa­le