- Wed
- 19
- Nov
- 08
Un bootstrap object oriented per Zend Framework ( applicazione reale Zend Framework p.12 )
Di in Php, Zend Framework Controls: +-close
Trasformiamo il nostro bootstrap in una classe php
Il codice del nostro bootstrap attualmente è contenuto all’interno del file index.php, che di fatto è il nostro bootstrap. In questo articolo vedremo come realizzare una classe Bootstrap dove ogni metodo si occuperà di inizializzare qualcosa di specifico sullo Zend Framework, donando all’applicazione un pizzico di leggibilità e organizzazione in più.
Attualmente il file index.php, nostro attuale bootstrap, è organizzato in questo modo, come potete anche vedere in alcuni altri articoli della categoria Php -> Zend Framework
index.php
// Blocco 1
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', true);
date_default_timezone_set('Europe/Rome');
$rootDir = dirname(dirname(__FILE__));
$rootDir = dirname(dirname(dirname(__FILE__)));
define( 'CONTAINER', 'paesidelmondo/' );
define( 'ZEND_ROOT', $rootDir.'/'.CONTAINER );
set_include_path(ZEND_ROOT.'library'.PATH_SEPARATOR.get_include_path());
// Blocco 1b
set_include_path(ZEND_ROOT.'application/models'.PATH_SEPARATOR.get_include_path());
// Blocco 2
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
// Blocco 2b
Zend_Layout::startMvc(array('layoutPath' => ZEND_ROOT.'/application/views/layouts'));
// Blocco 3
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
//$front->throwExceptions(true);
//$frontController->setParam('useDefaultControllerAlways', true);
$front->setControllerDirectory(ZEND_ROOT.'application/controllers');
// Blocco 3b
$config = new Zend_Config_Ini(ZEND_ROOT.'config.ini', 'prova');
// Blocco 3c
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);
Zend_Registry::set('db', $db);
Zend_Registry::set('config', $config);
$acl = new Paesidelmondo_Acl();
$aclHelper = new Paesidelmondo_Controller_Action_Helper_Acl(null, array('acl'=> $acl));
Zend_Controller_Action_HelperBroker::addHelper($aclHelper);
Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
SearchIndexer::setIndexDirectory(ZEND_ROOT.'/var/search_index');
Paesidelmondo_Db_Table_Row_Observerable::attachObserver('SearchIndexer');
Zend_Controller_Action_HelperBroker::addPrefix('Paesidelmondo_Controller_Action_Helper_');
// Blocco 4
try {
$front->dispatch();
} catch(Exception $e) {
echo nl2br($e->__toString());
}
D’ora in poi invece il seguente sarà il nostro file index.php
$rootDir = dirname(__FILE__);
define( 'CONTAINER', 'paesidelmondo/' );
define( 'ROOT_DIR', $rootDir.'/'.CONTAINER );
set_include_path(ROOT_DIR.'library'.PATH_SEPARATOR.get_include_path());
set_include_path(ROOT_DIR.'application/models'.PATH_SEPARATOR.get_include_path());
//echo get_include_path();
require(ROOT_DIR.'\application\bootstrap.php');
require_once('Zend/Loader.php');
Bootstrap::run('prova');
Come potete vedere tutte inizializzazioni dei vari componenti sono state rimosse, lasciando tutto il lavoro al metodo statico run della classe Bootstrap. Siccome non ho visto la necessità di creare una istanza della classe, per ora ho deciso di trattarla staticamente, infatti anche tutti gli altri metodi della classe sono statici. Il metodo run accetta un argomento che determina con quali configurazioni l’applicazione sarà avviata. Come potete vedere voi stessi, il Bootstrap.php sarà salvato all’interno della directory ‘application’ ( la stessa che contiene le dir Models/Views/Controllers ).
class Bootstrap {
public static $config = null;
public static $configSection = null;
public static $frontController = null;
public static $registry = null;
public static function run($configSection = 'generale'){
self::$configSection = $configSection;
self::prepare();
$response = self::$frontController->dispatch();
self::sendResponse($response);
}
public static function prepare(){
Zend_Loader::registerAutoload();
self::setupRegistry();
self::setupConfiguration();
self::setupEnvironment();
self::setupFrontController();
self::setupView();
self::setupDatabase();
self::setupACL();
self::setupLucene();
}
public static function setupRegistry(){
self::$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS);
Zend_Registry::setInstance(self::$registry);
}
public static function setupConfiguration(){
$config = new Zend_Config_Ini(ROOT_DIR.'configuration/config.ini', self::$configSection);
self::$registry->config = $config;
}
public static function setupEnvironment(){
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', (bool)self::$registry->config->ini->display_errors);
date_default_timezone_set(self::$registry->config->date_default_timezone);
}
public static function setupFrontController(){
self::$frontController = Zend_Controller_Front::getInstance();
self::$frontController->throwExceptions((bool)self::$registry->config->front->throwExceptions);
self::$frontController->returnResponse((bool)self::$registry->config->front->returnResponse);
self::$frontController->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
self::$frontController->setControllerDirectory(ROOT_DIR.'/application/controllers');
}
public static function setupView(){
$view = new Zend_View;
$view->setEncoding('UTF-8');
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR.'/application/views/layouts'));
}
public static function setupDatabase(){
$db = Zend_Db::factory(self::$registry->config->db->adapter, self::$registry->config->db->config->toArray());
$db->query("SET NAMES 'utf8'");
Zend_Db_Table::setDefaultAdapter($db);
self::$registry->db = $db;
}
public static function setupACL(){
$acl = new Paesidelmondo_Acl();
$aclHelper = new Paesidelmondo_Controller_Action_Helper_Acl(null, array('acl'=> $acl));
Zend_Controller_Action_HelperBroker::addHelper($aclHelper);
}
public static function setupLucene(){
Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
SearchIndexer::setIndexDirectory(ROOT_DIR.'/var/search_index');
Paesidelmondo_Db_Table_Row_Observerable::attachObserver('SearchIndexer');
}
public static function sendResponse(Zend_Controller_Response_Http $response){
$response->setHeader('Content-Type', 'text/html; charset=UTF-8', true);
$response->sendResponse();
}
}
Il codice, se avete seguito tutti gli altri articoli non merita particolari spiegazioni, ma c’è una cosa importante da notare: subito dopo aver istanziato l’oggetto $db effettuiamo una query, SET NAMES ‘utf8′. Questa query è utile perchè imposta il charset utf8 per la gestione dell’interazione con il database. Purtroppo questa modifica, ci obbliga a eliminare alcune modifiche delle quali vi avevo parlato in questo articolo: sto parlando dell’aggiunta delle funzioni utf8_encode e utf8_decode. Queste, utilizzando la query SET NAMES ‘utf8′ nel bootstrap, non sono più necessarie, anzi, effettuano una codifica/decodifica non necessaria causando un malfunzionamento nella visualizzazione dei testi. Il vantaggio di questo approccio è anche la visione corretta dei testi usando PhpMyAdmin: i testi contenenti caratteri unicode saranno perfettamente visibilie e modificabili direttamente da li senza dover subire nessun encoding.
Per quanto riguarda Lucene, una volta effettuate le modifiche sopra descritte vi è la necessità di reindicizzare tutti i documenti per farlo funzionare correttamente.
Si conclude qui questo articolo sulla gestione del Bootstrap Object Oriented.
Related posts:
- Zend Framework: gestione dei moduli ed esempio modulo di amministrazione Come usare Zend_Layout per la gestione dei moduli In quest'articolo...
- Zend Framework: Zend_Form con ReCaptcha Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...
- Creare un progetto Zend Framework 1.8.0 con Zend_Tool e Wamp Server Sono numerose le novità portate dalla nuova versione 1.8.0 di...
Related posts brought to you by Yet Another Related Posts Plugin.












In un mio lavoro ho fatto una cosa simile ma utilizzando il sistema di plugin del Front Controller,
http://framework.zend.com/manual/en/zend.controller.plugins.html
che ne pensi? è un idea malsana?
Lorenzo Massacci’s last blog post..Pensieri della settimana
Ciao,
ho appena terminato di leggere la pagina della documentazione di Zend Framework. Innanzitutto ti ringrazio per il link, non avevo ancora letto nulla riguardo la creazione di plugin per ZF.
Com’è scritto nell’introduzione “The controller architecture includes a plugin system that allows user code to be called when certain events occur in the controller process lifetime”, questo significa che, grazie ad un plugin, possiamo dire all’applicazione di fare determinate cose dipendentemente da dove il processo del front controller è arrivato, ed i punti del processo in questione sono 6 ( routeStartup(), routeShutdown(), dispatchLoopStartup(), preDispatch(), postDispatch(), dispatchLoopShutdown() ), quindi nel nostro plugin possiamo inserire uno di questi 6 metodi ( nessuno di loro obbligatorio ) per fargli compiere delle azioni.
Detto ciò, credo che sarebbe possibile eseguire parte se non tutto il codice del bootstrap in un controller plugin, fin’ora non ho mai visto usare quest’approccio, e senza fare dei test non saprei se potrebbero saltare fuori degli errori.
Se hai creato un controller plugin che funge da bootstrap e vuoi condividere il tuo codice, postalo pure come commento!
Ciao
in realtà non è una mia idea
l’ho scoperto utilizzando Zend Studio for Eclipse che da la possibilità di creare in automatico la struttura cartelle di un progetto Zend Framework e facendolo crea un plugin per il Front Controller deidicato all’inizializazzione, dove nel costruttore va a settare l’ambiente di sviluppo (path, ecc..) e poi prepara i vari metodi vuoti dove io sono andato a leggere (Zend_Config) e registrare (Zend_Registry) le configurazioni, oltre che settare le routing.
dimmi se non hai modo di provarlo con Zend Studio che posto il file
ciao
Lorenzo Massacci’s last blog post..Pensieri della settimana