Construcción de un sistema MVC simple con PHP5 :: Parte II

Febrero 26, 2007

Tareas de inicialización

Las tareas de inicialización son utilizadas para realizar actividades generales de inicialización como definir constantes, configurar el nivel de reporte de errores, etc. La primera parte del archivo de inicialización debe verse de cómo lo esto:

  1. <?php
  2. error_reporting (E_ALL);
  3. if (version_compare(phpversion(), '5.1.0', '<') == true) { die ('PHP5.1 Only'); }
  4. // Constants:
  5. define ('DIRSEP', DIRECTORY_SEPARATOR);
  6. // Get site path
  7. $site_path = realpath(dirname(__FILE__) . DIRSEP . '..' . DIRSEP) . DIRSEP;
  8. define ('site_path', $site_path);

En el ejemplo anterior nosotros: definimos algunas constantes, obtenemos el path del sitio y también nos aseguramos que la versión actual de PHP sea por lo menos 5.1.

La siguiente tarea que debemos realizar es configurar un objeto Registry para colocar toda la información que tenga características de global. Un objeto Registry es transmitido por todos los objetos en nuestro sistema MVC y es utilizado para compartir la información global sin tener que utilizar la palabra reservada de PHP ‘global’ o $GLOBALS. Para mayor información leer “Using globals in PHP”.

Agregar el siguiente código en el archivo startup.php, a continuación del código del ejemplo anterior:

$registry= new Registry;

Si trata de ejecutar el sistema ahora, usted debería obtener el siguiente error:

Fatal error: Class 'Registry' not found in g:ProjectsPHPitcontentsimple mvc php5demoincludesstartup.php on line 12

En realidad no es una sorpresa, ya que nosotros no tenemos creada la clase Registry aún, y tampoco tenemos incluido un archivo que contenga la clase Registry. Nosotros podríamos simplemente incluir el archivo utilizando la función include(), pero realizaremos esto utilizando una de las nuevas características de PHP5: __autoload().

La función mágica __autoload() es usada dinámicamente para cargar clases. Siempre que PHP encuentre que la clase no existe, primero llamará a la función __autoload(), y solo después mostrará un error. Esto puede ser utilizado para cargar clases “al vuelo”

Colocar el siguiente código antes del código del ejemplo anterior:

  1. // For loading classes
  2. function __autoload($class_name) {
  3. $filename = strtolower($class_name) . '.php';
  4. $file = site_path . 'classes' . DIRSEP . $filename;
  5. if (file_exists($file) == false) {
  6. return false;
  7. }
  8. include ($file);
  9. }

Nuestra función __autoload() toma el nombre de la clase, pasada como un argumento, y chequea si existe una clase llamada de manera similar en nuestro directorio de clases. Si el archivo no existe, la función retornara false y un error fatal será mostrado, pero si el archive existe, este será incluido, lo cual significa que la clase estará disponible y no se lazará un error.

Nosotros aun no tenemos creado una clase Registry, lo que significa que aun obtendremos un error, entonces hagamos algo al respecto.

Creando la clase Registry

La clase Registry es utilizada para pasar datos globales entre objetos individuales, y actualmente es una clase realmente simple, y no necesitará mas que tres pequeños métodos

Primero, creamos un nuevo directorio llamado ‘classes’, y luego creamos un nuevo archivo llamado ‘registry.php’. Colocamos el siguiente código en el archive registry.php:

  1. <?php
  2. Class Registry {
  3. private $vars = array();
  4. }
  5. ?>

Nosotros tenemos ahora el esqueleto para la clase Registry, y todo lo que nosotros necesitamos es añadir algunos métodos. Todo lo que necesita la clase Registry es un método set(), para almacenar los datos, y un método get(), para recuperar los datos. Opcionalmente nosotros podemos también tener métodos para agregar o remover algún dato. Los siguientes tres métodos deben ser agregados a la clase Registry:

  1. function set($key, $var) {
  2. if (isset($this->vars[$key]) == true) {
  3. throw new Exception('Unable to set var `' . $key . '`. Already set.');
  4. }
  5. $this->vars[$key] = $var;
  6. return true;
  7. }
  8. function get($key) {
  9. if (isset($this->vars[$key]) == false) {
  10. return null;
  11. }
  12. return $this->vars[$key];
  13. }
  14. function remove($var) {
  15. unset($this->vars[$key]);
  16. }

Como tu puedes ver, estos tres métodos son realmente básicos, y todo lo que ellos realizan es almacenar, obtener y eliminar items de la propiedad $vars. En el método set() nosotros también chequeamos si los datos con una clave particular ya existe, nosotros lanzamos una excepción. Esto es una manera de proteger de la sobreescritura de datos de forma accidental.

Ahora tenemos completamente funcional la clase Registry, pero nosotros no pararemos aquí. Vamos a utilizar una de las características de SPL: ArrayAccess. SPL, que es el acrónimo de Standard PHP Library, es una colección de interfaces y clases que facilitan la solución de problemas comunes. Una de las interfaces de SPL, ArrayAccess, puede ser utilizada para proporcionar a un objeto el acceso a sus atributos como si fuese un arreglo. Considere el siguiente código:

  1. function offsetExists($offset) {
  2. return isset($this->vars[$offset]);
  3. }
  4. function offsetGet($offset) {
  5. return $this->get($offset);
  6. }
  7. function offsetSet($offset, $value) {
  8. $this->set($offset, $value);
  9. }
  10. function offsetUnset($offset) {
  11. unset($this->vars[$offset]);
  12. }

El acceso como arreglo hace que parezca que $registry es un arreglo, sin mostrarlo como un objeto. Aunque ArrayAccess no tiene ventajas reales, esto significa menos tipeo de código debido a que usted no tendrá que utilizar continuamente ->get(). Para utlizar ArrayAccess usted primero tendrá que cambiar la primera línea de la clase Registry, para que empiece con:

Registry Implements ArrayAccess {

La palabra reservada Implements es utilizada para implementar una iterface

Por la implementación de la interfase ArrayAccess, la clase debe también agregar cuatro nuevos métodos:

  1. function offsetExists($offset) {
  2. return isset($this->vars[$offset]);
  3. }
  4. function offsetGet($offset) {
  5. return $this->get($offset);
  6. }
  7. function offsetSet($offset, $value) {
  8. $this->set($offset, $value);
  9. }
  10. function offsetUnset($offset) {
  11. unset($this->vars[$offset]);
  12. }

Estos métodos se explican por si mismos, mayor información puede ser encontrada en la documentación de SPL.

Ahora tenemos implementada el ArrayAccess y podemos utilizar como un arreglo, como se pudo apreciar en el ejemplo anterior y el siguiente ejemplo:

  1. <?php
  2. $registry = new Registry;
  3. // Set some data
  4. $registry->['name'] = 'Dennis Pallett';
  5. // Get data, using get()
  6. echo $registry->get ('name');
  7. // Get data, using array access
  8. echo $registry['name']
  9. ?>

Nuestra clase Registry ahora esta terminada, y si usted intenta ejecutar el sistema todo debería funcionar (aunque nada se mostrará aun). El archivo de inicialización esta finalizado, y podemos continuar con el siguiente paso para construir nuestro sistema MVC: configurar la funcionalidad de base de datos, también llamado “Modelo”.

Sigue la parte III

 

Entrada almacenada bajo: PHP, Patrones y Antipatrones

Este post ha sido visto 2245 veces

6 Comentarios Añade tu comentario

  • 1. Alejandro  |  Abril 21, 2008 at 2:45 pm

    Gracias por el tutorial, antes de empesar a leer todo queria cerciorarme si esta completo.
    ¿son dos partes o mas?, saludos

  • 2. neTo  |  Abril 22, 2008 at 8:16 am

    son 5 partes en realidad, ahora que lo comentas busque en el blog pero por alguna extraña razon no estan publicados, por suerte conserver algunos respaldos en mi pc y voy a ir publicandolos nuevamente.

    Ya esta el primero en:
    http://blog.undermedia.com.ec/index.php/construccion-de-un-sistema-mvc-simple-con-php5-2/

  • 3. Alejandro  |  Abril 22, 2008 at 2:58 pm

    Por favor, lo esperare con mucha ansia, ami me ayudara muchísimo dado que no se ingles y tuve que recorrer todo google para encontrar algo asi.

    Saludos

  • 4. Luis  |  Mayo 27, 2008 at 12:11 pm

    neTo… gracias por el tutorial… me interesaría saber cómo debo usar esta clase Registry para tenerlo disponible con las demás clases (Modelo, Vistas y el Controlador)… y si haces uso de una clase Router para ubicar los Controladores.

    Otra pregunta… dónde puede encontrar las 3 partes que faltan?

  • 5. neTo  |  Junio 06, 2008 at 9:56 am

    Perdon por la demora, puedes ver ya un ejemplo de uso de la clase Registry en http://blog.undermedia.com.ec/index.php/construccion-de-un-sistema-mvc-simple-con-php5-parte-iii/
    que es la tercera parte.

  • 6. Henry  |  Septiembre 09, 2008 at 1:02 am

    Gracias esta super chido el tutorial, donde puedo conseguir la IV y V parque te comentas.

    Saludos

Envia comentario

Obligatorio

Obligatorio

Algunas etiquetas HTML estan permitidas:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Conectate a este comentario  |  Suscribete a los comentarios via RSS Feed



Mira tambien

Feeds

 Suscribirse por feed

Suscribirse por mail