Bootstrap Class
Por zsamer en Mayo 22, 2008
Hoy veremos como centralizar toda la inicialización del bootstrap en una sola clase, permitiendo un index.php mucho más limpio y delegar todos los procesos en la clase Bootstrap que tendrá un método estático main() que es la puerta de entrada a nuestro sistema al puro estilo C#/JAVA, 100% Orientado a Objetos.
En nuestro ejemplo, nuestra clase Bootstrap la vamos a llamar Core, esta va ser final, no queremos que sea extendida.
Primero tenemos que crear un archivo settings que tendrá toda las configuraciones necesarias del ambiente, tales como el manejo de error, include path y un par de constantes del sistema.
Nuestro archivo settings.php lo vamos a dejar en el directorio /quickstart/application/.
Entonces, /quickstart/application/settings.php
-
<?php
-
/** Configuración de manejo de error */
-
date_default_timezone_set("America/Santiago");
-
-
-
$paths[] = BI_PATH_BASE . DS . '/application/config';
-
$paths[] = BI_PATH_BASE . DS . '/application/models';
-
$paths[] = BI_PATH_BASE . DS . '/library';
-
$paths[] = BI_PATH_BASE . DS . '/public';
-
-
-
require 'Core.php';
-
Core::setBaseDir(BI_PATH_BASE);
Bueno y nuestra importante clase Core o Bootstrap la vamos a dejar en la raiz del directorio library.
Entonces, /quickstart/library/Core.php
-
<?php
-
require 'Zend/Loader.php';
-
-
/**
-
* Clase Bootstrap/Core
-
* Contiene algunos metodos necesarios para operaciones de bajo nivel
-
* para la aplicacion
-
*/
-
final class Core
-
{
-
/**
-
* Directorio del Web App, No es URL, directorio físico
-
* @var String
-
*/
-
-
/**
-
* Instancia de Zend_Controller_Request_Abstract
-
* @var Zend_Controller_Request_Abstract
-
*/
-
-
/**
-
* Obtiene identificador de la Version Aplicacion
-
* @var String
-
*/
-
{
-
return '0.1.10000';
-
}
-
-
/**
-
* Set request class/object
-
*
-
* Set the request object. The request holds the request environment.
-
*
-
* @param Zend_Controller_Request_Abstract $request
-
* @throws Zend_Controller_Exception if invalid request class
-
*/
-
{
-
self::$_request = $request;
-
}
-
-
/**
-
* Retorna el request object.
-
*
-
* @return null|Zend_Controller_Request_Abstract
-
*/
-
{
-
if(null === self::$_request){
-
self::$_request = self::getFrontController()->getRequest();
-
}
-
return self::$_request;
-
}
-
-
/**
-
* Retorna el response object.
-
*
-
* @return null|Zend_Controller_Response_Abstract
-
*/
-
{
-
return self::getFrontController()->getResponse();
-
}
-
-
/**
-
* Retorna el front controller object.
-
*
-
* @return null|Zend_Controller_Front
-
*/
-
{
-
return Zend_Controller_Front::getInstance();
-
}
-
-
/**
-
* Retorna la instancia unica del registry.
-
*
-
* @return Zend_Registry
-
*/
-
{
-
Zend_Loader::loadClass('Zend_Registry');
-
return Zend_Registry::getInstance();
-
}
-
-
{
-
return Zend_Layout::getMvcInstance();
-
}
-
-
/**
-
* Bootstrap, entrada a la aplicacion .
-
*
-
* @return void
-
*/
-
{
-
//Setup class autoloading
-
Zend_Loader::registerAutoload();
-
-
// initialize configuration information
-
$config = self::initConfig();
-
-
// connect to the database
-
self::initConnection($config->database);
-
self::setupFrontController();
-
}
-
-
/**
-
* setupFrontController, inicializacion del front controller.
-
*
-
* @return void
-
*/
-
{
-
self::initLayout();
-
-
try
-
{
-
require_once 'Zend/Controller/Front.php';
-
$frontController = self::getFrontController();
-
$response = $frontController->addModuleDirectory(self::getRoot() . '/modules')
-
->returnResponse(true)
-
->throwExceptions(true)
-
->dispatch();
-
-
self::sendResponse($response);
-
-
} catch (Exception $e) {
-
}
-
}
-
-
/**
-
* sendResponse, envia la respuesta de la peticion (Response).
-
*
-
* @return void
-
*/
-
{
-
$response->setHeader('Content-Type', 'text/html;', true);
-
$response->sendResponse();
-
}
-
-
/**
-
* Inicializacion de la configuracion y retorna este como Zend_Config object
-
* object
-
*
-
* @returns Zend_Config
-
*/
-
{
-
Zend_Loader::loadClass('Zend_Config_Ini');
-
$config = new Zend_Config_Ini(self::getRoot() . '/config/quickstart.ini', 'default');
-
self::getRegistry()->set('configIni', $config);
-
return $config;
-
}
-
-
/**
-
* Inicializacion de la base de datos information y retorna este como Zend_Db_Adapter_Abstract
-
* object
-
*
-
* @returns Zend_Db_Adapter_Abstract
-
*/
-
{
-
Zend_Loader::loadClass('Zend_Db');
-
Zend_Loader::loadClass('Zend_Db_Table');
-
-
try
-
{
-
$db = Zend_Db::factory($config);
-
$con = $db->getConnection();
-
Zend_Db_Table::setDefaultAdapter($db);
-
} catch (Zend_Db_Adapter_Exception $e) {
-
throw new Zend_Db_Adapter_Exception("Message: " . $e->getMessage() . "\n");
-
} catch (Zend_Exception $e) {
-
throw new Zend_Exception("Message: " . $e->getMessage() . "\n");
-
}
-
self::getRegistry()->set('db', $db);
-
return $db;
-
}
-
-
/**
-
* Inicializacion de Zend Layout
-
* object
-
*
-
* @returns void
-
*/
-
{
-
Zend_Loader::loadClass('Zend_Layout');
-
-
'layout' => 'Main',
-
'layoutPath' => self::getRoot() . '/layouts/scripts/'
-
);
-
-
Zend_Layout::startMvc($options);
-
}
-
-
{
-
self::$basedir = $dir;
-
}
-
-
{
-
return self::$basedir;
-
}
-
-
{
-
return self::getRequest()->getBaseUrl();
-
}
-
-
{
-
return self::getBaseDir() . DS. 'application';
-
}
-
}
Hasta ahora todo bien, solo nos faltaría ver como queda nuestro limpio index.php
quickstart/public/index.php
-
<?php
-
require '../application/settings.php';
-
-
try
-
{
-
Core::main();
-
} catch (Exception $e) {
-
}
Como se puede ver queda todo mucho más limpio, claro y ordenado.
Espero que les sirvan, en nuestro próximo post voy a explicar como podemos integrar el ORM Propel con Zend Framework, por supuesto que compartiendo la misma conexión PDO de acceso a la base de datos con el ORM de Zend Framwork (Zend_Db_Table). La idea de esto es tener la opción y facilidad de poder contar con dos ORM en nuestro proyecto, ocupando ambas ya que comparten la misma conexion de PDO.
Comentarios
8 Responses to “Bootstrap Class”
Deja tu comentario

Impecable como siempre.
gracias Pablo
Me ha gustado la entrada, a la espera de la nueva entrega…
Has probado Doctrine (http://www.phpdoctrine.org/)? Dicen que esta bien, Symfony oficialmente soporta Propel como ORM por defecto y Doctrine a través de un plugin
Un saludo
Isidro
si, doctrine también es una buena librería para ORM, tiene casi las mismas funcionalidades de propel.
[...] mi ultimo articulo Bootstrap Class había quedado comprometido de escribir un post sobre cómo integrar ZF con el ORM Propel, así que [...]
[...] Hoy en esta segunda y ultima entrega veremos la integración con Zend Framework, para ello será necesario extender la clase Zend_Db_Adapter_Pdo_Mysql (utilizando mysql) y agregaremos un par de métodos y funcionalidades en la clase Core/Bootstrap de nuestro sistema cubierto en el artículos anterior Bootstrap Class. [...]
[...] advertencia Core::getRoot() necesitan primero ver el Post Bootstrap Class, sino pueden remplazar a su [...]
[...] Bootstrap Class [...]