15 de abril de 2015

Patrón Registry

La idea de este patrón es crear una clase que tenga un array donde guardar los objetos registrados y una serie de métodos: uno que añada los objetos al array, otro que compruebe su existencia para evitar duplicaciones, otro que devuelva el objeto pasándole su clave, uno que borre el objeto recibiendo la clave y finalmente uno que limpie el array de la clase.
<?php
class registry{
     
     static private $registry = array();
 
     public function add($name, $item)
     {
         if (!self::exists($name)) {
             self::$registry[$name] = $item;
             return true;
         } else {
             return false;
         }
     }
 
     public function exists($name)
     {
         if (is_string($name)) {
             return array_key_exists($name, self::$registry);
         } else {
             throw new Exception('Registry item\'s name must be a string');
         }
     }
 
     public function get($name)
     {
         if (self::exists($name)) {
             $return = self::$registry[$name];
         } else {
             $return = null;
         }
         return $return;
     }
 
     public function remove($name)
     {
         if (self::exists($name)) {
             unset(self::$registry[$name]);
         }
         return true;
     }
 
     public function clear()
     {
         self::$registry = array();
     }
 }
?>
Si nos fijamos es una clase estática por lo que podemos acceder a sus métodos sin necesidad de instanciar la clase, dentro de sus métodos los principales son el método add() y el método get(), mediante estos métodos vamos a llenar la instancia y a mostrar el resultado de la instancia, pero como lo hacemos?? Para crear un valor en el patrón registry usamos el método add este nos pide dos parámetros el primero es el nombre que va a llevar el valor y el segundo es el valor como tal de este veamoslo con un ejemplo:
registry::add('nombre','aca esta el valor que deseamos mostrar');
Sencillamente asignamos a nombre en esta instancia el valor: aca esta el valor que deseamos mostrar, sencillo no y como utilizamos o se muestra el valor que acabamos de asignar?? Utilizando el método get(), de esta manera:
echo registry::get('nombre');
El resultado nos mostraría por pantalla “aca esta el valor que deseamos mostrar”, fácil verdad?? Los demás métodos nos sirven para validación de que exista un índice, limpiar e incluso un quitar índice agregado mediante una llamada a este patrón, fácil verdad?? Que nos permite hacer el Patrón Registry?? Sencillamente nos permite mantener y modificar valores e instancias entre clases diferentes e incluso fuera de las mismas (es un concepto personal si alguien tiene objeción la puede realizar y así aprendemos más), a medida que veamos el código se entenderá mas este pequeño concepto, un pequeño ejemplo:
<?php
a.php
class a
{
  public function llenar($valor)
 {
  registry::add('indice',$valor);
 }
}
?>
espacio
<?php
b.php

class b
{  
 public function mostrar()
 {
  echo registry::get('indice');
 }
}
?>
espacio
<?php
Index.php
require_once("registry.php");
require_once("a.php");
require_once("b.php");

 $a = new a();
 $b = new b();
 $a->llenar("hola");
 $b->mostrar(); 
?>
Si se fijan en la primera clase asignamos a nuestro patrón registry un valor, en la segunda clase sencillamente mostramos el valor del índice que llenamos en la primera clase sencillo su uso no?? Veamos ahora los demás métodos en acción
<?php
b.php
class b
 {  
 public function mostrar($indice)
 {
  if(registry::exists($indice)){
   echo registry::get('indice');
  } 
  else{
   echo "El valor buscado no existe";
  }
 }
 }
?>
re-declaramos la clase b para utilizar más métodos de nuestro patrón registry
<?php
index.php
$a = new a();
 $b = new b();
 $a->leer("hola");
 $b->mostrar('indice');
 registry::remove('indice');
 $b->mostrar('indice');
?>