Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Douglas Agostinho

PDO + Registry (Design Pattern) + PHPOO

Recommended Posts

Olá pessoal, tudo bom?

 

Essa dúvida eu creio que deve ser algo simples. Mas como eu não entendi, eu creio que aqui o registro da dúvida aqui no fórum pode ser interessante até mesmo para novos usuários (que podem ter a mesma dúvida que eu).

 

Sou desenvolvedor PHP. Estou começando a programar orientado a objetos, e gostaria de fazer tudo da forma mais "correta" possível.

 

Tudo o que vou escrever abaixo é baseado no tópico aqui do fórum pdo + singleton [link]. Para não ter que reescrever tudo, por favor leia o tópico porque ele é muito interessante.

 

Mínha dúvida reside no post #6, do João Batista Neto. Aliás, se o próprio João puder ajudar, será muito bom.

 

Pelo o que eu entendi a melhor forma de se conectar ao banco MySQL em uma aplicação de médio porte é instanciar um objeto PDO, colocar no Registry, e depois usar este Registry sempre que precisar.

 

Na prática, pelo o que eu entendi, nós precisamos:

 

1) Um arquivo PHP com a classe Registry (que fica, por exemplo, na pasta /classes)

2) Um arquivo de inicialização (que vamos chamar aqui de inicializacao.php). Este arquivo possui um include da classe registry, faz a conexão PDO e coloca no registry. Esse arquivo PHP é chamado no topo de TODO arquivo PHP da minha aplicação que precisar acessar o banco de dados.

 

Então, se eu tiver 100 páginas PHP em minha aplicação, as 100 páginas terão logo no topo um include para este arquivo inicializacao.php. Este arquivo já instanciou o PDO, e já colocou na registry. Então, se em qualquer momento do meu script eu precisar usar o BD, eu apenas uso o objeto guardado anteriomente.

 

Minhas dúvidas são:

 

Dúvida A) Se eu instancio o objeto PDO neste arquivo que é incluído EM TODA página PHP, porque eu preciso então do registry? Teoricamente, o objeto PDO nunca será instanciado duas vezes. E, em vez de instanciar o PDO e colocar no registry, por que não ler direto o PDO?

 

Por favor entendam que eu sei que o registry é uma melhor prática, eu só gostaria de entender o porquê, neste caso citado acima, ele é realmente relevante. Porque pra mim não faz muito sentido "guardar" no registry algo que estará acessível, de qualquer forma, em toda página PHP da minha aplicação.

 

Dúvida B) Se eu quiser acessar o BD no script PHP eu pego o objeto PDO guardado na registry. Até aí tudo bem. Porém, seu eu quiser acessar o BD dentro de uma classe, eu posso fazer isso também? Faço da mesma forma? Isso é uma má prática?

 

 

Desde já agradeço pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal mais fera vai te orientar melhor! mais...

 

vá lá minha contribuição =X

 

Até onde eu sei voce guarda uma instância no Registry, então mesmo você incluindo ela em toda sua aplicação, esse registry vai apenas buscar a instancia de PDO já conectada dentro do próprio registry.

 

Se você debuga um Registry vai nota que seu Arquivo de conect_Mysql.php (com as config de dns host pass e tals), ele so executado na primeira requisição, na segunda o Registry pega do ArrayObject a instancia de PDO, o arquivo conect_Mysql.php no debug nem é executado. pelo menos na minha aplicação é assim =X

 

Depois sempre que chama o registry, somente consulta se já existe .. o PDO não vai se conecta no DB novamente, PDO ja foi conectado na 1º requisição uma unica vez!

Esse é seu ganho com registry, você não vai abri uma nova conexão a cada requisição e sim pegar uma já aberta do Registry..

 

Quanto a segunda duvida. Má pratica acredito que não seja!

 

Você precisa da conexão pega ela do Registry , é simples assim=X

 

Eu pessoalmente, Abstraio essa conexão, tudo que se trata de DB extends esse abastract!

 

assim que intendo =X se eu tive errado vo aprende aqui com esse tópico também

Compartilhar este post


Link para o post
Compartilhar em outros sites
Dúvida A) Se eu instancio o objeto PDO neste arquivo que é incluído EM TODA página PHP, porque eu preciso então do registry? Teoricamente, o objeto PDO nunca será instanciado duas vezes. E, em vez de instanciar o PDO e colocar no registry, por que não ler direto o PDO?

 

Por favor entendam que eu sei que o registry é uma melhor prática, eu só gostaria de entender o porquê, neste caso citado acima, ele é realmente relevante. Porque pra mim não faz muito sentido "guardar" no registry algo que estará acessível, de qualquer forma, em toda página PHP da minha aplicação.

 

Com o tempo você vai perceber que é bobeira ter 100 páginas na sua aplicação, você vai ter no máximo alguns poucos templates e o restante será definido em termos de classes. Estude um pouco sobre MVC para entender isso melhor. Pq eu digo isso? Pq a estrutura da sua aplicação raramente irá variar muito, então pra que duplicar as páginas? Tenha uma página padrão e só insira dados na mesma.

 

Enfim, se você utiliza um registro, ainda é possível manter algum controle sobre seu conteúdo, ao contrário se você usasse uma variável global.

É possível que você faça:

$db = new PDO(...);

Temos aí uma variável global. Nada impede de alguém fazer:

$db = 'Oi, eu sou o Goku';

Pronto, aí seu código foi pro espaço, seu sistema não funciona mais.

 

Aí você fala: "Ah, mas eu não sou burro de fazer isso".

Tudo bem, enquanto você trabalhar sozinho, você pode fazer esse tipo de coisa, mas acaba se tornando um vício. Se algum dia você for trabalhar em equipe, tem que contar sempre com a infinidade da estupidez humana (brincadeira xD). Então acostume-se desde já a fazer do jeito "certo".

 

Utilizando um registro, voce pode fazer algo como:

 

class Registry {
protected static $instance;
private $data = array();

final protected function __construct() {
}

public static function getInstance() {
	if(static::$instance === null) {
		static::$instance = new static();
	}
	return static::$instance;
}

public function set($obj) {
	if(!is_object($obj)) {
		throw new Exception('Registry armazena somente objetos, 
							você forneceu ' . gettype($obj));
	}

	$class = get_class($obj);
	if(isset($this->data[$class])) {
		throw new Exception('Já existe uma instância de ' 
							. $class . ' no registro');
	}

	$this->data[$class] = $obj;
}

public function get($className) {
	if(isset($this->data[$class])) {
		return $this->data[$class];
	} else {
		return null; //Ou lance uma exceção se preferir...
	}
}
}

Só existirá uma instância para cada classe dentro de Registry.

 

Dúvida B ) Se eu quiser acessar o BD no script PHP eu pego o objeto PDO guardado na registry. Até aí tudo bem. Porém, seu eu quiser acessar o BD dentro de uma classe, eu posso fazer isso também? Faço da mesma forma? Isso é uma má prática?

 

Pesquise por Injeção de Dependências e terá sua resposta. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, o que o Luis Paullo disse está correto?

 

Se eu chamar o registry em 100 páginas, e na primeira eu já guardei uma conexão PDO, ele usa a mesma conexão, sem precisar abrir uma nova?

 

Henrique Barcelos, obrigado pelas dicas. Vou pesquisar sobre MVC e também Injeção de Dependências.

Compartilhar este post


Link para o post
Compartilhar em outros sites

me equivoquei aqui você não vai abri uma nova conexão a cada requisição! .

 

Bom quando faz uma requisição toda aplicação inicia novamente.. e registry pega a conexão novamente..

 

testa o exemplo do Henrique Barcelos pra voce te uma ideia..

 

Registry voce guarda uma instâcia de um Objeto em um pacote .. é so isso =X

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém conhece um link que explique bem o pattern Registry? Estou a um bom tempo pesquisando e encontrei poucas fontes (confiaveis e sérias) falando desse pattern. No wikipedia nao achei sobre o registry, no object mentor de robert c martin tbm não... no ooodesign só tem singleton...

 

 

Esse pattern é reconhecido como boa prática de programação? Eu tava vendo que existe o pattern Registry e Singleton Registry, o segundo é uma junção do singleton com registry? podendo ter uma lista de classes diferentes num array, porém, apenas uma instância de cada uma?

 

 

Se souberem, passem os links que conhecem sobre Registry.

 

Para agregar valor ao post, abaixo está um link que estive lendo e pode ser útil para outros user.

 

http://www.phpfreaks.com/tutorial/design-patterns---singleton-and-singleton-registry

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai encontrar sobre Registry procurando pelo Martin Fowler, segue um link no decorrer do post. Já adianto algumas coisas conforme meu entendimento.

 

Também gostaria que o pessoal que conhece o padrão e já o aplicou, corrija-me nos meus eventuais erros, pois não sou dono da verdade :closedeyes:, além de opinar também. Mais informação e conhecimento é sempre bem vindo. O entendimento do padrão depende essencialmente da sua interpretação.

 

Registry é um padrão que pode ser um Singleton. É melhor eu explanar cada padrão separadamente.

 

Singleton:

Este padrão garante a existência de apenas uma instância de uma classe e implementa um ponto global de acesso ao objeto.

Versão traduzida pois o Singleton não possui muita perda de informação.

 

O padrão deve ser interpretado em duas etapas:

- Uma única instância (um único objeto);

- Ponto global de acesso ao seu objeto.

 

Todo objeto que for um Singleton, possuirá uma única instância na execução de uma aplicação e, indiferente de onde você necessite o objeto, você possuirá acesso a essa única instância.

 

Registry:

A well-known object that other objects can use to find common objects and services.

Para não perder a informação passada pelo Martin Fowler, mantive em inglês mesmo.

 

Isso é importante para entender melhor:

A Registry is essentially a global object, or at least it looks like one - even if it isn't as global as it may appear.

 

Parafraseando:

Um registry é essencialmente um objeto global, ou pelo menos parece um

 

É importante entender que apesar do Registry ser comummente associado ao Singleton, ele não necessita ser um.

 

Agora vem a parte única que define, genericamente e em poucas linhas, o Registry: ele é um repositório, um "baú", com acesso global (ou pelo menos parece ter um :thumbsup:).

 

Um baú, nesse caso, possui uma única, e importante, função: "Guardar coisas/objetos".

 

Segundo a definição de Martin Fowler, ele guardará objetos e serviços. Possui, necessariamente, estes dois métodos:

- Adicionar um objeto/serviço;

- Recuperar um objeto/serviço.

 

Pelo Registry podendo ser um Singleton, ele possui todas, as duas, características de qualquer objeto Singleton possui:

- Uma única instância;

- Ponto de acesso global.

 

Apesar de ser muito comum, o mais comum para o bem da verdade, o Registry ser um Singleton, necessariamente não precisa ser um. Para reforçar ainda mais a minha afirmação, além do que já foi definido pelo Martin Fowler, segue um post do @Evandro Oliveria em uma discussão, produtiva, sobre Registry/Singleton:

Você pode ter o seu registro como um Singleton, como uma instância de uma suposta PHPCore, responsável pelo boostraping, além de um gerenciador de Session no DB porque você usa PHP Clustering balanceado com Nginx. Que tal? Independente da forma de acesso, através ou não, de um Registry, há casos extremos onde seja realmente necessário manter uma única instância existindo. Assim como consigo lhe provar, por A + B, que um Registry não precisa ser, necessariamente, um Singleton.

 

Para uma implementação e um pouco mais de explanação sobre o Registry, poderá encontrar nesse post do @João Batista Neto e nos subsequentes.

http://forum.imasters.com.br/topic/400014-pdo-singleton/page__view__findpost__p__1566101

 

 

Diferente de programação "normal" onde se assimila o conteúdo mais facilmente na prática, os Design Patterns necessitam de uma boa compreensão, senão total, sobre o seu conceito. Se você não entender o conceito por trás do padrão e, principalmente, a sua real funcionalidade/necessidade, você não saberá o que está fazendo.

 

Apesar de Singleton ser, na minha opinião, o mais fácil de implementar, muitos confundem ele com o "mais fácil de entender". Isso deixa de ser verdade quando encontramos esse padrão aplicado de forma errada, o que demonstra uma falta de atenção sobre seu real uso e necessidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.