Uno dei nostri clienti ci ha chiesto di aggiungere alcune funzionalità dinamiche a un sito Web esistente, costituito da diverse pagine HTML statiche.
Normalmente lavoriamo con un framework MVC (principalmente CodeIgniter), ma in questo caso spostare tutto su un framework richiederebbe troppo tempo.
Poiché non è un grande progetto, non avere la piena funzionalità di un framework non è un problema. Ma la domanda è come mantenere pulito il codice.
La soluzione che ho trovato è quella di dividere il codice nelle librerie (l'API dell'applicazione) e nei modelli. Quindi all'interno di HTML ci saranno solo chiamate API e la leggibilità non sarà sacrificata.
L'ho implementato con una sorta di registro statico (scusate se ho torto, non sono un esperto di pattern design):
<?php
class Custom_framework {
//Global database instance
private static $db;
//Registered models
private static $models = array();
//Registered libraries
private static $libraries = array();
//Returns a database class instance
static public function get_db(){
if(isset(self::$db)){
//If instance exists, returns it
return self::$db;
} else {
//If instance doesn't exists, creates it
self::$db = new DB;
return self::$db;
}
}
//Returns a model instance
static public function get_model($model_name){
if(isset(self::$models[$model_name])){
//If instance exists, returns it
return self::$models[$model_name];
} else {
//If instance doesn't exists, creates it
if(is_file(ROOT_DIR . 'application/models/' . $model_name . '.php')){
include_once ROOT_DIR . 'application/models/' . $model_name . '.php';
self::$models[$model_name] = new $model_name;
return self::$models[$model_name];
} else {
return FALSE;
}
}
}
//Returns a library instance
static public function get_library($library_name){
if(isset(self::$libraries[$library_name])){
//If instance exists, returns it
return self::$libraries[$library_name];
} else {
//If instance doesn't exists, creates it
if(is_file(ROOT_DIR . 'application/libraries/' . $library_name . '.php')){
include_once ROOT_DIR . 'application/libraries/' . $library_name . '.php';
self::$libraries[$library_name] = new $library_name;
return self::$libraries[$library_name];
} else {
return FALSE;
}
}
}
}
All'interno di HTML, i metodi API sono accessibili in questo modo:
<?php echo Custom_framework::get_library('My_library')->my_method(); ?>
Mi sembra una soluzione pratica. Ma mi chiedo quali siano i suoi svantaggi e quali siano le possibili alternative.