2 commenti CodeIgniter

Il file MY_Controller.php che illustrerò in questo tutorial è un punto di svolta di cruciale importanza per sfruttare al meglio questo framework. Si tratta di una funzionalità opzionale ma che, almeno per il mio modo di sviluppare applicativi, è quasi sempre imprenscindibile.

 

Personalmente ritengo che la collocazione e l'illustrazione nell'ambito della user guide di CodeIgniter non sia all'altezza della sua grande importanza e delicatezza: la scarsezza di esempi pratici e la sintesi con cui viene trattato è una grossa falla di una User Guide che in generale ritengo ottima.

Occore dire, tuttavia, che, sotto un aspetto prettamente teorico, ci sono pochissime cose da dire.

 

Alterare ed espandere il core di CodeIgniter

La struttura di funzionamento di CodeIgniter comprende una serie di classi che ne costituiscono il core system (CI_Controller, CI_Config, CI_Language, etc etc).

 

Esse sono caratterizzate per il fatto che vengono tutte istanziate ogni volta che viene eseguito CodeIgniter: per poterle usare non occorrerà eseguire il load (tramite il file autoload oppure con la Loader class).

 

Le funzionalità di queste classi potranno essere alterate (cosa molto delicata da fare con attenzione e cognizione) o espanse inserendovi nuovi metodi e proprietà. Per aggiungere funzionalità dovremo:

  1. estendere (extends) la classe padre (in perfetta conformità con le classiche regole della OOP);
  2. il nome dell'estensione avrà come prefisso "MY_";
  3. il file dovrà essere collocato in /application/core/ con il nome identico alla classe estesa creata.

Per completezza occorre dire che il prefisso "MY_" è configurabile all'interno del file /application/config/config.php in corrispondenza della variabile $config['subclass_prefix']. Personalmente non conosco un valido motivo per il quale bisognerebbe modificare tale suffisso.

 

Il file MY_Controller: funzioni, metodi e proprietà comuni a più controllers

Di default, nel creare i nostri controller dobbiamo rispettare una regola fondamentale: tutti devono essere extends della CI_Controller class.

 

Ma, spessissimo, può succedere che vi siano metodi e proprietà che vorremmo fossero comuni in più controllers.

 

Ciò ci obbligherebbe ad adottare soluzioni più o meno efficienti: creare un nuovo helpers da istanziare (load) in tutti i controller che necessitano delle sue funzioni o, nell'ambito di una pessima stesura del codice, replicare tale funzione/metodo in tutte le classi che lo richiedono.

 

Facciamo un esempio pratico: in un sito web abbiamo una sidebar che viene popolata con dati estratti dal database; in pratica servirà, eseguire il load dei models necessari, eseguire i metodi per l'estrazione dei dati, eseguire il load della view per la rappresentazione visiva dei dati.

Immagginate di avere molti controllers che necessitano di tale sidebar: ciò ci costringerebbe a replicare le medesime operazioni in più controllers.

 

Tale problema può essere agevolmente affrontata integrando all'interno del file MY_Controller un metodo che ci restituisce come return la sidebar.

 

In altre parole nel nostro caso vogliamo aggiungere funzionalità alla classe core CI_Controller dalla quale discendono tutti i controller. Pertanto, creaiamo il file MY_Controller.php e lo collochiamo in /application/core/.

A puri fini esemplificativi questo potrebbe essere:

<?php
Class MY_Controller extends CI_Controller{
	public function __construct(){
		parent::__construct();
		echo 'esecuzione Construct MY_Controller ';
		}

	protected function _example(){
		echo 'esecuzione Method in MY_Controller ';
		}

 

I controller che richiedono i metodi presenti nella classe My_Controller saranno extends di quest'ultima. Ad esempio, poniamo di avere il controller Welcome collocato in /application/controllers/welcome.php, avremo:

<?php
Class Welcome extends MY_Controller{

	public function index(){
		}

	public function miniscript(){
		$this->_example();
		}

	}

 

Puntando all'URL /welcome verrà eseguito primariamente il costruttore della classe MY_Controller, dopodichè il metodo index() della Classe Welcome.

Puntando all'URL /welcome/miniscript verrà eseguito primariamente il costruttore della classe MY_Controller, dopodichè il metodo miniscript() della Classe Welcome che, a sua volta, esegue il metodo _example() ereditato dal My_Controller.

 

Così come abbiamo creato il controller Welcome extends di MY_Controller potremo creare tanti altri controller exteds di MY_Controller e, come le tradizionali regole della OOP insegnano, queste erediteranno i metodi public e protected presenti nella Class MY_Controller.

 

Vorrei far notare che il metodo _example() presente nella classe MY_Controller è di tipo protected ed il nome inizia con l'underscore _.

 

Grazie a tale prefisso il metodo sarà "privato" secondo le convenzioni utilizzate da CodeIgniter per impedire l'esecuzione del metodo tramite URL. Invece, la scelta di utilizzare il protected è giustificata nella possibilità di utilizzare il metodo nelle classi ereditarie, ovvero nei controller extends di My_Controller (nell'esempio Welcome).

 

Di questo tema (noioso e prettamente teorico) ho già parlato in una articolo specifico a cui rimando per approfondire il tema.

In ogni caso, salvo casi particolari si deve evitare creare metodi public e senza underscore: in questi casi il metodo diverrebbe direttamente eseguibile tramite URL attraverso tutti i controller extends di MY_Controller.

 

Impieghi concreti del file MY_Controller

I casi in cui si necessita del file MY_Controller sono tantissimi e svariati: in generale si ricorre a questo quando un determinata procedura o funzionalità deve essere replicata in più controller e si vuole evitare duplicazioni di codice.

 

Oltre all'esempio della sidebar presa ad esempio in questo articolo un altro uso tradizionale è quello di un sistema di login: in questo caso avremo, solitamente, la necessità di verificare lo status di login (loggato / non loggato) in maniera trasversale molti controller.

 

La realizzazione di un sistema di login sarà l'argomento che tratterò nei futuri articoli dedicati a CodeIgniter.

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

2 Commenti presenti

avatar Olimpio Romanella

Olimpio Romanella

07 March 2014 ore 19:06

@MisterT: hai ragione corro a correggerlo. Grazie per i complimenti.

avatar MisterT

MisterT

07 March 2014 ore 10:51

Ciao, grazie per l'ottimo tutorial.
Ti segnalo solo quello che a me sembra un errore, ma forse dipende solo dalle mie impostazioni.

Per far funzionare l'esempio, nel mio caso, devo rimuovere le parentesi tonde () dopo MY_Controller

Class Welcome extends MY_Controller{

Grazie
Ciao