PHP Patterns parte 2: Registry

Posted on agosto 24, 2010. Filed under: PHP |

Avançando um pouco mais em cima do pattern Singleton, obtemos o pattern Registry. O pattern Registry pode ser comparado a uma agenda de telefone ou um diretório que armazena e obtem referências para objetos. Um dos principais objetivos deste pattern é armazenar os dados globalmente de uma forma segura e organizada. Com o Registry podemos armazenar qualquer objeto como se fosse um Singleton. Ou de outra forma, enquanto o objeto que implementa o pattern Singleton consegue guardar a referência de um único objeto, o objeto que implementa o pattern Registry consegue guardar a referência de dois ou mais objetos.
Vamos a um exemplo prático da utilzação do pattern Registry: Você tem um objeto de banco de dados que deseja utilzar durante o ciclo da sua aplicação. Você pode facilmente resolver esse problema de forma elegante utilizando o pattern Singleton. Porém, supondo que na mesma aplicação, você necessita conectar em um segundo banco de dados. Dessa forma, você terá 2 objetos de banco de dados para serem armazenados. Utilizando o pattern Singleton isto é impossível, à não ser que você tenha duas classes separadas implementando o Singleton, o que não é muito elegante. O pattern Registry soluciona essa situação de uma forma muito fácil. Vamos ao código:

class Registry {
  private static $_register;

  public static function add(&$item, $name = null)
  {
    if (is_object($item) && is_null($name)) {
      $name = get_class($item);
    } elseif (is_null($name)) {
      $msg = "Você deve setar um nome para não-objetos";
      throw new Exception($msg);
    }
    $name = strtolower($name);
    self::$_register[$name] = $item;
  }

  public static function &get($name)
  {
    $name = strtolower($name);
    if (array_key_exists($name, self::$_register)) {
      return self::$_register[$name];
    } else {
      $msg = "’$name’ não esta registrado.";
      throw new Exception($msg);
    }
  }

  public static function exists($name)
  {
    $name = strtolower($name);
    if (array_key_exists($name, self::$_register)) {
      return true;
    } else {
      return false;
    }
  }
}

Utilizando o Registry em sua aplicação: Em uma primeira parte, registramos o objeto chamado $db na classe Registry utilizando o método estático add:
$db = new DB();
Registry::add($db, 'DB');

Em outra parte da aplicação podemos acessar o objeto $db, registrado anteriormente, simplesmente utilizando o método estático get da classe Registry. Nosso objeto dentro do Registry se torna “global” de uma maneira segura e elegante:

$db = Registry::get(’DB’);

Entendendo a implementação do pattern Registry:

Primeiro declaramos a propriedade $_register que irá armazenar os objetos registrados. A propriedade $_register é um array:

  private static $_register;

Depois criamos o método add que receberá um objeto ou um outro tipo de dados para ser registrado. O segundo parâmetro é opcional, ele será o nome usado para referênciar o objeto registrado. No caso de um objeto passado no primeiro parâmetro, o segundo parâmetro é opcional, e se você não fornecê-lo, o método irá seta-lo como sendo o nome da classe do objeto instanciado passado no primeiro parâmetro. Caso o primeiro parâmetro não seja um objeto, você é obrigado a fornecer um nome para referência, pois não temos como sugerir um nome para um elemento que não seja um objeto.

  public static function add(&$item, $name = null)
  {
    if (is_object($item) && is_null($name)) {
      $name = get_class($item);
    } elseif (is_null($name)) {
      $msg = "Você deve setar um nome para não-objetos";
      throw new Exception($msg);
    }
    $name = strtolower($name);
    self::$_register[$name] = $item;
  }

O método get irá recuperar o elemento registrado anteriomente. O elemento pode ser um objeto ou qualquer outro tipo de dados. Você deve fornecer o nome que referência o elemento como parâmetro para o método get.

  public static function &get($name)
  {
    $name = strtolower($name);
    if (array_key_exists($name, self::$_register)) {
      return self::$_register[$name];
    } else {
      $msg = "’$name’ não esta registrado.";
      throw new Exception($msg);
    }
  }

Esses são os dois principais métodos da implementação do pattern Registry. Caso você tenha interesse em se aprofundar mais, sugiro olhar o código fonte fornecido pelo Zend Framework que implementa o pattern Registry através da classe chamada Zend_Registry. Esta classe implementa o pattern Registry de forma muito bem codificada. Se você trabalha com o Zend Framework você deve saber da utilidade dessa classe. Segue abaixo exemplos de utilização da classe Zend_Registry:

Zend_Registry::set('log', $logger); // registrando o objeto $logger
// mais tarde em sua aplicação, obtendo o objeto logger
$log = Zend_Registry::get('log');
$log->info('Alertas...');

// ou utilizando diretamente
Zend_Registry::get('log')->info('Alertas...');

Make a Comment

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Uma resposta to “PHP Patterns parte 2: Registry”

RSS Feed for Pasqua Tecnologia Comments RSS Feed


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: