L'ultimo componente della struttura MVC è costituito dai Model. In realtà, con le conoscenze acquisite fino a questo punto, è possibile sviluppare un ottimo codice modulare e scalabile, avvalendosi unicamente dei Controller e delle View. Code Igniter infatti, si basa prevalentemente su questi 2 componenti della struttura MVC. Tuttavia, i Model ricoprono un ruolo molto importante, anche in questo framework.
Il loro scopo principale è quello di contenere la logica elaborativa dell'applicazione, gestendola in maniera slegata dal Controller. Mentre quest'ultimo si occupa della struttura dell'applicazione, il Model si occupa della logica.
Nella pratica, significa che qualsiasi operazione che abbiamo necessità di svolgere nella nostra applicazione, purché non sia relativa alla gestione della struttura, deve essere posizionata in un apposito Model.
Caricare un Model
Per caricare un Model agiamo in una modalità quasi identica a quella delle View, utilizzando il metodo load
della classe Loader, in questo caso utilizzando però il model:
$this->load->model('modelname');
I Model devono essere collocati nella cartella application/models
. La stringa modelname
deve essere sostituita con il nome del nostro Model. Anche in questo caso è possibile organizzare i Model in differenti sotto-cartelle. Per richiamare le classi basta passare la path alla sotto-cartella, ad esempio:
$this->load->model('database/modelname');
Struttura e funzionamento di un Model
Vediamo come strutturare la classe Model
. Questa deve avere la prima lettera obbligatoriamente maiuscola, deve avere nome identico al nome del file che la contiene e deve estendere la classe CI_Model
:
// il Model sarà contenuto nella cartella application/models/foo.php
class Foo extends CI_Model {
}
Aggiungiamo ora un metodo al Model:
// il Model sarà contenuto nella cartella application/models/foo.php
class Foo extends CI_Model {
// questo metodo accetta 2 parametri, svolge semplicemente una moltiplicazione
// e la restituisce
public function multiply($x, $y) {
return $x * $y;
}
}
A questo punto dobbiamo solamente caricare il Model dal nostro Controller e possiamo usufruire di tutti metodi pubblici:
class Welcome extends CI_Controller {
public function index()
{
// carica il model
$this->load->model('foo');
// usa il metodo del model
$result = $this->foo->multiply(10, 20);
// stampa '200'
echo $result;
}
}
In fase di caricamento, al metodo model
è possibile passare opzionalmente un secondo parametro: una stringa che indica il nome dell'oggetto con cui richiameremo i metodi e le proprietà del model. Di default questo oggetto prende il nome del Model:
// carica il model, rinominando l'oggetto
$this->load->model('foo', 'mymodel');
// usa il metodo del model
$result = $this->mymodel->multiply(10, 20);
Auto-caricare un Model
Se un Model viene utilizzato da una moltitudine di Controller all'interno dell'applicazione, risulta più conveniente auto-caricarlo invece che caricarlo manualmente utilizzando il metodo che abbiamo appena visto. Per fare ciò occorre modificare il file di configurazione autoload
, che si trova in application/config/autoload.php
.
Questo file contiene una moltitudine di array che rappresentano risorse da caricare automaticamente. Nel nostro caso si tratta di Model, dunque cerchiamo l'indice model
dell'array $autoload
, che è a sua volta un array, ed aggiungiamo i nomi dei Model che vogliamo caricare automaticamente:
$autoload['model'] = array('foo');
In questo caso il Model Foo verrà caricato da Code Igniter e non ci sarà occorrenza di richiamare il metodo load
. Nel caso in cui volessimo, come nell'esempio precedente, dare un nome specifico all'oggetto che punta al Model, dobbiamo passare un key -> value
all'array:
$autoload['model'] = array('foo' => 'mymodel');