Como instalar, configurar y crear un bootstrap para Zend Framework 1.5

Julio 25th, 2008  |  Published in Zend Framework

Intro

Existen muchas formas y mejores de crear un archivo de bootstrap para Zend Framework 1.5 como cargar las librerias de forma dinámica en donde se necesitan etc, esta es una guia sencilla de como instalar y crear una forma de configurar el Zend Framework 1.5, algunos tips para esta guia fueron obtenidos de aqui.

Para esta guia, vamos a suponer que se esta utilizando Apache en Linux y estamos accesando al servidor en la dirección http://localhost/

Instalación

Para instalar el Zend Framework 1.5, solo hay que bajarlo de aqui y descomprimir el archivo. Notamos que hay un directorio que se llama library, lo vamos a copiar a donde va a estar nuestra aplicacion en un momento.

En donde va a estar nuestra aplicación, vamos a crear esta estructura de directorios:

application/
	config/
	controllers/
	models/
	views/
library/
public_html/
tmp/
	logs/

El directorio application/, va a tener todos los Models, Views y Controllers de la aplicación.

Dentro del folder library/, vamos a copiar el contenido del folder library/ que extrajimos del Zend Framework 1.5

El Apache debe de tener a public_html/ como directorio raíz.

tmp/

El directorio tmp/ y todos sus subdirectorios deben de tener permiso de escritura, se asigna con el siguiente comando:

# chmod -R 777 tmp

.htaccess

Ahora, dentro del directorio public_html/ vamos a hacer dos cosas, primero vamos a crear el archivo .htaccess en donde le vamos a decir al webserver que todas las solicitudes se enruten al archivo index.php de la siguiente forma:

RewriteEngine on 
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

Nota: Es necesario tener habilitado el modulo mod_rewrite en Apache

index.php

Después creamos el archivo public_html/index.php con el siguiente contenido:

<?php 
require '../bootstrap.php';

Hasta este punto, todas las solicitudes a http://localhost/ serán enrutadas al archivo index.php. Como pueden ver, el archivo index.php solamente manda llamar al archivo bootstrap.php, que por razones de seguridad, se encuentra un directorio abajo, y fuera del directorio raíz del webserver. Mas adelante vamos a crear este archivo, primero vamos a crear un archivo en donde va a estar la configuración de la aplicación.

config.php

El archivo de configuración lo vamos a guardar en application/config/config.php:

$config = array(
				'environment'=>'development',
				'enable_database' => true,
				'enable_file_logger' => true,
				'enable_db_logger' => true
			   );
 
if ($config['enable_database']) {
	$config['database'] = array(
								'host' => 'localhost',
								'user' => 'db_username',
								'pass' => 'db_password',
								'name' => 'db_name'
							   );
 
	if ($config['enable_db_logger']) {
		$config['db_logger'] = array(
									 'log_table' => 'log_table',
									 'column_mapping' => array('priority' => 'priority', 'timestamp' => 'timestamp', 'priority_name' => 'priorityName', 'message' => 'message')
									);		
	}
}
 
if ($config['enable_file_logger']) {
	$config['file_logger'] = array(
								   'log_format' => '%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL,
								   'file_name' => date("Y-m-d") . '.php'
								   );
}

Nota: El único proposito de este archivo es asignar los datos de configuración a la variable $config en forma de arreglo. La vamos a utilizar después en nuestro bootstrap.php

Los datos se explican por si solos, en $config['database'] va la información de la conexión a la base de datos.

En $config['db_logger'] ponemos el nombre de la tabla en la que se van a guardar los logs, y las columnas.
Nota: Es necesario que la tabla y las columnas existan en la base de datos para que funcione, las columnas deberan ser: priority, timestamp, priority_name y message.

En $config['file_logger'] va la información del formato del log, y del nombre del archivo, en este caso, estamos utilizando la funcion date() para crear un archivo de log para cada dia.

Los datos que estan dentro de la variable $config, van a poder ser accesibles en toda la aplicación gracias a que las guardaremos en el Zend_Registry en nuestro boostrap.php en la siguiente explicación.

bootstrap.php

El archivo bootstrap.php debe de estar en el directorio raíz (es decir, en donde esta el resto de la estructura de directorios application, config, ypublic_html y tmp):

$dirs = array(
	'app' => 'application',
	'web' => 'public_html',
	'lib' => 'library',
	'tmp' => 'tmp',
	'log' => 'tmp/logs'
);
 
define('APP_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR . $dirs['app'] . DIRECTORY_SEPARATOR);
define('WEB_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR . $dirs['web'] . DIRECTORY_SEPARATOR);
define('LIB_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR . $dirs['lib'] . DIRECTORY_SEPARATOR);
define('TMP_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR . $dirs['tmp'] . DIRECTORY_SEPARATOR);
define('LOG_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR . $dirs['log'] . DIRECTORY_SEPARATOR);
 
/* Report all errors directly to the screen for simple diagnostics in the dev environment */  
error_reporting(E_ALL | E_STRICT);  
ini_set('display_startup_errors', 1);  
ini_set('display_errors', 1); 
date_default_timezone_set('America/Mexico_City');
 
set_include_path(LIB_DIR . get_include_path());  
 
/* Set up autoload so we don't have to explicitely require each Zend Framework class */ 
require_once "Zend/Loader.php"; 
Zend_Loader::registerAutoload(); 
 
/* Load Configuration */
require_once(APP_DIR . 'config/config.php');
try {
	$config = new Zend_Config($config);
} catch (Zend_Exception $e) {
	echo "Error: " . $e->getMessage();
}
Zend_Registry::set("config", $config);
 
if ($config->enable_file_logger) {
	/* Create a log formatter */
	$formatter = new Zend_Log_Formatter_Simple($config->file_logger->log_format);
 
	/* Create a file logger */
	$stream = @fopen(LOG_DIR . $config->file_logger->file_name, 'a', false);
	if (!$stream) {
		throw new Exception('Failed to open stream');
	}
	try {
		$fileWriter = new Zend_Log_Writer_Stream($stream);
		$fileWriter->setFormatter($formatter);
		$fileLogger = new Zend_Log($fileWriter);
		Zend_Registry::set("fileLogger", $fileLogger);
	} catch (Zend_Log_Exception $e) {
		echo "Error: " . $e->getMessage();
	} catch (Zend_Exception $e) {
		echo "Error: " . $e->getMessage();
	}
}
 
if ($config->enable_database) {
	/* Load database */
	$options = array(
		Zend_Db::AUTO_QUOTE_IDENTIFIERS => true,
	);
	try {
		$db = new Zend_Db_Adapter_Pdo_Mysql(array(
			'host'     => $config->database->host,
			'username' => $config->database->user,
			'password' => $config->database->pass,
			'dbname'   => $config->database->name,
			'options'  => $options,
		));
		$db->getConnection();
		Zend_Db_Table::setDefaultAdapter($db);
		Zend_Registry::set("database", $db);
		} catch (Zend_Db_Adapter_Exception $e) {
			if ($config->enable_file_logger) {
				$fileLogger->log('Database Error: ' . $e->getMessage(), 1);
			}
		} catch (Zend_Exception $e) {
			if ($config->enable_file_logger) {
				$fileLogger->log('Error: ' . $e->getMessage(), 1);
			}
	}
 
	if ($config->enable_db_logger) {
		/* Create a database logger */
		try {
			$dbWriter = new Zend_Log_Writer_Db($db, $config->log_table, $config->column_mapping);
			$dbLogger = new Zend_Log($dbWriter);
			Zend_Registry::set("dbLogger", $dbLogger);
			} catch (Zend_Exception $e) {
				if ($config->enable_file_logger) {
					$fileLogger->log("Error: " . $e->getMessage() . " - " . $e->getFile() . " - Line: " .  $e->getLine(), 4);
				}
		}		
	}
}
 
/* Dispatcher */
try {
	$frontController = Zend_Controller_Front::getInstance(); 
	$frontController->setControllerDirectory(APP_DIR . "controllers"); 
	$frontController->dispatch();
} catch (Zend_Exception $e) {
	if ($config->enable_db_logger) {
		$dbLogger->log("Error: " . $e->getMessage() . " - " . $e->getFile() . " - Line: " .  $e->getLine(), 1);		
	}
	if ($config->enable_file_logger) {
		$fileLogger->log($e->getMessage(), 1);
	}
}

Nota: En este archivo solo hay que asignar los directorios y el timezone

Al final, te debió de haber quedado esta estructura de archivos y directorios:

application/
	config/
		config.php
	controllers/
	models/
	views/
library/
	Zend/
		...toda la libreria zend aqui.
public_html/
	.htaccess
	index.php
tmp/
	logs/

Recuerda que dentro del Zend_Registry guardamos varios elementos:

  • config: Que es un objeto de Zend_Config que contiene todos los datos que pusimos dentro del archivo config.php
  • fileLogger: Objeto de tipo Zend_Log con el que podemos loggear en archivos.
  • dbLogger: Objeto de tipo Zend_Log con el cual se loggea dentro de la base de datos.

Un tip extra, dentro de la aplicación, podemos utilizarlos haciendo llamadas como esta:

public function log_error($error) {
	$config = Zend_Registry::get('config');
	if ($config->enable_file_logger) {
		$fileLogger = Zend_Registry::get('fileLogger');
		$fileLogger->log($error, 3);
	}
	if ($config->enable_db_logger) {
		$dbLogger = Zend_Registry::get('dbLogger');
		$dbLogger->log($error, 3);
	}
}

Espero les haya servido de algo… comentarios bienvenidos.