Login
Libri
Home Argomenti Generali I Controllers

I Controllers

Share

I Controllers sono il cuore della tua applicazione,  determinando come sarà gestita una richiesta HTTP.

Che cos'è un Controller?

Un controller è semplicemente un file di Classe denominato in modo che possa essere associato ad una URI.

Considera questa URI:

example.com/index.php/blog/

Nel precedente esempio, CodeIgniter si attenderebbe di trovare un controller di nome blog.php e lo carica.

Qunado vine impartito il nome di un controller nella successiva parte della URI, esso sarà caricato.

Proviamo:  Hello World!

Creiamo un semplice controller in modo da poter vederlo in azione. Utilizzando l'editor di testo, creare un file chiamato blog.php, e inserire il codice riportato di seguito in esso:


class Blog extends CI_Controller {
function index() {
echo 'Hello World!';
}
}
?>

Quindi salva il file nella cartella application/controllers/.

Ora visita il tuo sito usando una URL simile a questa:

example.com/index.php/blog/


Se hai fatto bene, si dovrebbe vedere "Hello World!".

Nota: I nomi di classe devono iniziare con una lettera maiuscola. In altre parole, questo è valido:

class Blog extends CI_Controller {
}
?>


Questo non è valido:

class blog extends CI_Controller {
}
?>


Inoltre, bisogna sempre assicurarsi che il proprio controller estenda la classe padre "controller" in modo che possa ereditarne tutte le sue funzioni.

Funzioni

Nell'esempio di sopra, il nome della funzione è index(). La funzione "index" è sempre caricato di default se il secondo segmento del URI è vuoto. Un altro modo per mostrare il tuo messaggio, "Ciao Mondo", potrebbe essere questo:

example.com/index.php/blog/index


Il secondo segmento del URI determina quale funzione nel controller viene chiamato.

Proviamo. Aggiungi una nuova funzione al tuo controller:
class Blog  extends CI_Controller {
function index() 
{
echo 'Hello World!';
} 
function comments() 
{
echo 'Look at this!';
}
}
?>


Adesso carica il seguente URL per visualizzare la funzione comments
example.com/index.php/blog/comments/


Si dovrebbe vedere il tuo nuovo messaggio.

Come passare segmenti URI per le tue funzioni

Se la tua URI contiene più di due segmenti, questi saranno passati alla funzione come parametri.

Per esempio, supponiamo una URI come questa:

example.com/index.php/products/shoes/sandals/123


La funzione sarà trasmessa alla URI con gli argomenti dei segmenti 3 e 4 ( "sandls" e "123"):

class Products extends CI_Controller {

 function shoes($sandals, $id)
 {
 echo $sandals;
 echo $id;
 }
}
?> 

Importante: Se stai usando un settaggio particolare nel tuo file di configurazione routes, i segmenti passati alla funzione saranno reindirizzati a quelli.

La definizione di un controller di Default

CodeIgniter può essere settato per caricare un controller di default quando non è presente una URI, come sarà nel caso viene richiesta solo la URL principale del tuo sito. Per specificare un controller di default, apri il file /config/routes.php e imposta questa variabile:

$route [ 'default_controller'] = 'Blog'; 

Dove "Blog" è il nome della classe controller che si desidera utilizzare. Se ora carichi il tuo file index.php principale senza specificare alcun segmento URI, vedrai il tuo messaggio "Ciao Mondo" come impostazione predefinita.

Funzione di Rimappatura delle chiamate

Come osservato in precedenza, il secondo segmento del URI determina in genere quale funzione del controller deve essere chiamata. CodeIgniter consente di ignorare questo comportamento attraverso l'uso della funzione _remap ():

function _remap()
{
 / / codice qui ...
}


Importante: Se il controller contiene una funzione chiamata _remap (), sarà sempre chiamata a  prescindere da ciò che contiene la vostra URI. Esso sostituisce il normale comportamento della URI, che determina la funzione da chiamare, che consente di definire la propria funzione di routing regole.

La chiamata sovrascrive la funzione (di solito il secondo segmento del URI) che sarà passata come parametro alla funzione _remap():

function _remap($method)
{
 if ($method == 'some_method')
 {
 $this->$method();
 }
 else
 {
 $this->default_method();
 }
}

Elaborazione dell'output

CodeIgniter ha una classe di output che si occupa di inviare automaticamente il risultato finale al browser. Ulteriori informazioni su questo aspetto possono essere trovate nella sezione Views e output. In alcuni casi, tuttavia, si potrebbe desiderare di post-trattamento dei dati finalizzati in qualche modo
specifico da invia al browser stesso. CodeIgniter consente di aggiungere una funzione denominata _output() per il controller che riceverà i dati finalizzati in uscita.
Importante: Se il controller contiene una funzione chiamata _output (), sarà sempre chiamato dalla classe di output, invece di echo dei dati finalizzati direttamente. Il primo parametro della funzione conterrà l'output finalizzati.
Ecco un esempio:

function _output($output)
{
 echo $output;
}

Nota che il tua funzione _output() riceverà i dati nel suo stato finalizzato.
Punto di riferimento e dati di utilizzo della memoria saranno restituiti,
file della cache saranno scritti (se avrai abilitato il caching), e le intestazioni
verranno inviati (se si utilizza questa funzionalità) prima che sia passata alla
funzione _output(). Se si utilizza questa funzione il timer di esecuzione della pagina
e le statistiche di utilizzo della memoria potrebbero non essere perfettamente accurate
in quanto non tiene conto di ogni ulteriore elaborazione che fate. Per un modo alternativo
per controllare l'output prima di qualsiasi trattamento finale è fatto, consulta i metodi
disponibili nella classe Output.

Funzioni private

In alcuni casi potresti volere alcune funzioni non di accesso pubblico. Per creare una funzione privata è sufficiente aggiungere un carattere di sottolineatura come prefisso del nome. In questo caso esse non saranno eseguite attraverso una richiesta di URL.
Per esempio, se si dovesse avere una funzione come questa:

function _utility()
{
 / / qualcosa ...
}


Cercando di accedervi tramite l'URL, come questo, non funzionerà:
example.com/index.php/blog/_utility/

Organizzare i controller in sottocartelle

Se si sta creando una grande applicazione si potrebbe trovare conveniente organizzare i controller in sottocartelle. CodeIgniter ti permette di fare questo.
Semplicemente crea le cartelle all'interno della tua directory application/ontrollers e inserisci il tua classe controller classi all'interno.

Nota: Quando si utilizza questa funzione è necessario specificare la cartella nel prima parte del segmento del tuo URI. Per esempio, per indicare che un controller si trova qui:

application/controllers/products/shoes.php

Per chiamare il controller su indicato. la tua URI sarà simile a questa:

example.com/index.php/products/shoes/show/123

Ciascuna tua sottocartella può contenere un controller di default che sarà chiamata
se l'URL contiene solo una sottocartella. Per fare questo devi semplicemente indicare
il nome del tuo controller di default nel file  application/config/routes.php
CodeIgniter consente inoltre di rimappare il tuo URI utilizzando la funzione URI Routing.

Costruttore di Classe

Se si intende utilizzare un costruttore in uno dei controller,  è necessario inserire in esso la seguente riga di codice:

parent::__construct();

Questa linea è necessarià perché il vostro costruttore locale
sarà quello prevalente nella classe controller genitore che abbiamo bisogno di chiamare manualmente.

In PHP 5, i costruttori si utilizzare con la seguente sintassi:

class Blog extends CI_Controller {

 function __construct()
 {
 parent::__construct();
 }
}
?>


I Costruttori sono utili se è necessario impostare alcuni valori di default,
o eseguire un processo di default quando viene creata un'istanza la classe.

I costruttori non possono restituire un valore, ma possno svolgere un compito di default.Nomi riservati di funzione
Dal momento che le classi di controllo si estenderà il controller principale dell'applicazione è necessario essere attenti a non il nome del tuo funzioni in modo identico a quelli usati da quella classe, altrimenti le funzioni locali andranno a sostituire. Vedi nomi riservati per un elenco completo.

Nomi riservati di funzione

Dal momento che le classi controller estenderanno il controller principale dell'applicazione è necessario essere attenti a non attribuire loro dei nomi di funzioni identiche a quelli usati dalla classe genitore, altrimenti le funzioni locali andranno a sostituirle.

Per un elenco completo di tali funzioni cfr. "Nomi riservati".

Questo è quanto

Questo, in poche parole, è tutto quello che c'è da sapere sul controller.

Ultimo aggiornamento ( Giovedì 17 Marzo 2011 18:03 )