Pra quem não conhece:
http://www.doctrine-project.org/
A cerca de um mês atrás criei um Adapter do Zend_Auth que utiliza o framework Doctrine para realizar a autenticação de usuários, tendo em vista que todas as minhas ações de banco já eram feitas através dele, visando acabar com a dependência do Zend_Db. Sem muito tempo para postar, aproveitei este fim de carnaval para compartilhar com a comunidade. Quem tiver interesse é só acessar meu repositório do Zfb no github:
http://github.com/tuliobraga/zfb/tree/master/library/
Passos anteriores:
Criar a tabela de usuários.
Fazer o autoload das classes do Doctrine e do Zend Framework.
http://www.doctrine-project.org/documentation/manual/1_2/en/getting-started#implementing:bootstrap-file
Criar a conexão de banco no bootstrap. (Neste passo é interessante dar um nome para sua conexão - Segundo parâmtetro do Doctrine_Manager::connection())
http://www.doctrine-project.org/documentation/manual/1_2/en/introduction-to-connections#opening-new-connections
Gerar os models a partir do banco existente.
http://www.doctrine-project.org/documentation/manual/1_2/en/introduction-to-models#generating-models
Fazer o autoload dos models.
http://www.doctrine-project.org/documentation/manual/1_2/en/introduction-to-models#autoloading-models
Usando o Zfb_Auth_Adapter_Doctrine
O uso do Zfb_Auth_Adapter_Doctrine é muito semelhante ao uso do Zend_Auth_Adapter_Dbtable. Você deve passar o seu objeto de conexão de banco na instância do adapter da seguinte forma:
- Código: Selecionar tudo
/* Capturando o objeto de conexão de banco */
$manager = Doctrine_Manager::getInstance();
$db = $manager->getConnection('nome_da_sua_conexão');
/* Instânciando o Adapter de autenticação. */
$authAdapter = new Zfb_Auth_Adapter_Doctrine($db);
O próximo passo é definir o nome da tabela de usuários. Diferentemente do Adapter Dbtable, você deve fornecer o nome da classe de model gerada pelo Doctrine, já que este executa suas querys, chamadas de DQL (Doctrine Query Language), baseado nas definições presentes nestas classes.
- Código: Selecionar tudo
$authAdapter->setTableName('User');
Os próximos passos são idênticos aos do Zend_Auth_Adapter_Dbtable.
Implementação
A implementação deste Auth Adapter foi completamente baseada no Zend_Auth_Adapter_Dbtable, com todos os métodos e a mesma nomenclatura, tendo portanto as mesmas validações.
Diferenças
A propriedade protegida $_zendDb teve seu nome alterado para $_doctrineDb.
As querys foram reestruturadas para seguir os padrões e métodos de acesso do Doctrine.
O lançamento de exceções passou a seguir a hierárquia de exceções da biblioteca Zfb.
Exemplo
Este código espera que as variáveis $username e $password estejam definidas com os valores informados pelo usuário. Usado por mim encapsulado em um método estático que espera como parâmetros o nome de usuário e senha.
- Código: Selecionar tudo
/* Capturando o objeto de conexão de banco */
$manager = Doctrine_Manager::getInstance();
$db = $manager->getConnection('nome_da_conexão');
/* Instânciando o Adapter de autenticação. */
$authAdapter = new Zfb_Auth_Adapter_Doctrine($db);
/* Definindo tabela, coluna de identidade, coluna de senha, valor de identidade, valor de senha e tratamento para a senha */
$authAdapter->setTableName('User')
->setIdentityColumn('USERNAME')
->setCredentialColumn('PASSWORD')
->setIdentity($username)
->setCredential($password)
->setCredentialTreatment('MD5(?)');
/* Tentando autenticar */
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
/* Verificando autenticação */
if($result->isValid()){
/* Armazenando dados na sessão e retornando-os */
$storage = new Zend_Auth_Storage_Session();
$storage->write($authAdapter->getResultRowObject(null,'password'));
return (array)$storage->read();
}else{
/* Capturando mensagem de erro e lançando exceção */
$error = $result->getMessages();
throw new Zfb_Auth_Adapter_Exception($error[0]);
}
Espero que seja útil.
Até!



