Utilizando Zend Auth

A Zend Auth serve para autenticar usuários em sua aplicação, ou seja, com ela você pode disponibilizar conteúdos exclusivos somente para quem estiver logado em seu sistema. Ela não distribui níveis de acesso diretamente, você pode configurar esses níveis de acesso e restringir no momento da autenticação ou usar a Zend ACL.

Neste momento não irei criar o formulário de postagem para focar bem na Zend Auth.

Crie dois controllers em sua aplicação, um para login e outro para o logout. Sugiro criar um terceiro controller apenas para testar a autenticação.

No controller dedicado ao login insira

/* Resgata o adaptador do banco de dados utilizado */
$dbAdapter = Zend_Db_Table::getDefaultAdapter();

$authAdapter = new Zend_Auth_Adapter_DbTable(
  $dbAdapter, //adaptador do banco de dados padrão da sua app
  'users', // nome da tabela de usuários
  'usuario', // nome da coluna com o nome do usuário
  'senha', // nome da coluna com o campo da senha
  'sha1(?)' // campo opcional caso a senha seja criptografada
);

/* Opcionalmente você pode capturar estes dados com os setter methods */
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users')
            ->setIdentityColumn('username')
            ->setCredentialColumn('password');

/* Estou pressupondo que o login e senha foram capturados nas variáveis $username e $password */
$authAdapter->setIdentity($username)->setCredential($password);

/* Variável que guarda o resultado da tentativa de autenticação */
$result = $authAdapter->authenticate();

/* Agora verificamos se o retorno de $result é verdadeiro ou falso */
if($result->isValid()){
  /* Se verdadeiro inicia uma instância do Zend Auth */
  $auth = Zend_Auth::getInstance();
  /* Resgata os dados do usuário, exceto a coluna senha */
  $data = $authAdapter->getResultRowObject(null,'senha');
  /* Grava a seção no sistema */
  $auth->getStorage()->write($data);
  /* Uma vez que o usuário está logado você pode optar por redirecioná-lo ou exibir alguma mensagem */
  $this->_redirect("/");
} else {
  /* Caso o usuário não tenha sido autenticado por algum motivo você registra aqui que atitude tomar */
  $this->view->mensagem = "falhou";
}

No controller responsável pelo logout é bem mais simples.

/* Inicia uma instância de Zend Auth */
$auth = Zend_Auth::getInstance();
$auth->clearIdentity(); // apaga a identidade / encerra a seção
$this->_redirect("/"); // opcionalmente você pode redirecionar para alguma página ou exibir uma mensagem

Ok, e como fazer para saber se o usuário está logado ou não?

Nas páginas onde deseja restringir o acesso, acesse o seu respectivo controller e insira a função preDispatch.

public function preDispatch()
{
  /* Verifica se o usuário não está logado */
  if(!Zend_Auth::getInstance()->hasIdentity())
    // Se não estiver logado, você redireciona para uma página de erro.
    $this->_redirect("/erro");
}

Trabalhando com relacionamento de tabelas no Zend Db Table

Existe uma facilidade muito grande para se trabalhar com relacionamento de tabelas no Zend Framework, e evita-se aquelas enormes querys para trazer meia dúzia de dados.

Após criar os Models via Zend_Tool

zf create model nome-da-tabela

Abra o model da tabela principal e insira na classe a linha que registra qual a tabela filha:

protected $_dependentTables = array('Application_Model_DbTable_NomeDaTabelaFilha');

Em seguida, abra a tabela filha e registre mapeamento dos campos de relacionamento:

protected $_referenceMap = array(
	//Array das tabelas relacionadas
	'Empresa' => array(
		//Nome da Tabela relacionada
		'refTableClass'=>'Application_Model_DbTable_NomeDaTabelaPai',
		//Campo de relacionamento da tabela pai
		'refColumns'=>'id',
		//Campo de relacionamento da tabela filha
		'columns'=>'empresa_id',
		//Opcionais
		'onDelete'=>self::CASCADE,
		'onUpdate'=>self::RESTRICT
		)
	);

A partir de agora você pode chamar diretamente no seu controller:

$tabela_principal = new NomeDoModel();
$this->view->dados = $tabela_principal->fetchAll();

 E na sua view fazer o tratamento com um “foreach”, a única coisa que deverá ser acrescentada é no ponto onde você quer as informações da tabela filha usar o seguinte comando:

$tabela_secundaria = $tabela_principal->findDependentRowSet('Application_Model_DbTable_NomeDaTabelaFilha');

Isto retorna um array que poderá ser tratado norlmamente com o uso de um foreach.

Configurações opcionais para os módulos de uma aplicação Zend

Após modular a sua aplicação, se faz necessário adaptar algumas coisas. Por exemplo, os diretórios padrão /controllers e /views da sua aplicação não serão mais usados pois agora para qualquer controller e view criado deverá ser apontado o Módulo a qual pertence, ou seja:

zf create controller teste 1 default

onde teste é o controller que quer criar, 1 é o parâmetro para que uma view relacionada seja criada e default é o nome do módulo ao qual o controller se refere. Portanto, se somente depois de concluir a aplicação você decidiu modular, será necessário retrabalhar todos os controllers para obedecer a nova estrutura. Não basta somente mover as pastas para dentro dos novos módulos, será necessário editar o nome da classe de cada controller para abrigar o nome do módulo, ou seja, antes de modular a aplicação a sua classe controller iniciava-se assim:

class IndexController extends Zend_Controller_Action{}

Após a modulação, a mesma classe iniciará desta forma:

class Default_IndexController extends Zend_Controller_Action{}

Onde “Default_ ” é o nome do módulo a qual pertence. Depois de migrar suas classes e views pode remover as respectivas pastas da raiz já que não serão necessárias.

Para obter melhor controle sobre essa transição, existem alguns parâmetros que podem auxiliar.

No seu arquivo Application.ini insira as seguintes linhas:

; Nome do módulo que quer usar como Padrão
resources.frontController.defaultModule = "default"
resources.modules[] =
; Opcionais, somente para o caso de alterar o nome padrão
resources.frontController.defaultController = "index" 
resources.frontController.defaultAction = "index"

Configurando DB Adapter pela Zend Tool

Existem duas formas de configurar o acesso ao seu banco de dados no Zend.

A primeira e mais comum é editar o arquivo /application/configs/Application.ini e inserir as linhas com os dados de acesso ao banco de dados:

resources.db.adapter = "PDO_MySQL"
resources.db.params.host = "localhost"
resources.db.params.dbname = "zf_exemplo"
resources.db.params.username = "root"
resources.db.params.password = "root"

A segunda que considero mais rápida, uma vez que você já tem todos os dados necessários é por meio da Zend Tool. Acesse via terminal a pasta da sua aplicação e digite:

zf configure db-adapter 
"adapter=PDO_MySQL
&host=localhost
&dbname=zf_exemplo
&username=root
&password=root"

Para verificar se os dados foram inseridos corretamente acesse o arquivo de configuração e verá que os dados foram gravados como citado no terceiro parágrafo.