I ENCONTRO DO PHPSP
Zend Framework
Edgar Ferreira da Silva
Fev/2009
   
Quem?
 Eng. De Software
 6 anos de várias
experiências em
desenvolvimento
 Cientista da Computação
 Entusiasta do PHP
 Criador e mantenedor do
ManjaPHP.com.br
   
Objetivo
 Discutir a arquitetura
do Zend Framework
 Demonstrar o uso
alguns componentes
 Discutir boas práticas
com o ZF
   
Framework?
 Frameworks são softwares ou partes que
provêem soluções genéricas e concisas ao
escopo definido.
 Framework para banco de dados:
 Propel
 Doctrine
 Framework para comércio eletônico:
 Magento
   
É um novo conceito?
Email
Data
BD
Imagem
Login
Validação
Lógica de 
Negócio
Personalizada
   
Uma metamorfose
Lógica de 
Negócio
Personalizada
EmailImagem
Login
Data
Validação
BD
   
Quais suas vantagens?
 Utilização de boas práticas de desenvolvimento
 Testes Unitários
 Design Patterns
 Documentação
 Oferece bom suporte a evolução e a extensão
do próprio framework
 Oferece interfaces concisas
 Extender ou modificar com muita cautela.
   
Zend Framework
 Escrito em PHP5
 Orientado á Objetos
 Utiliza a metodologia
MVC
 Licenciado como
Open Source
 Tocado pela Zend
   
Entendendo e extendendo
Models, Views e Controllers
   
Model
 É uma camada onde se reúnem as classes
que: cuidam do acesso correto das
informações
 Reúne em si toda a lógica de negócio
 Deve receber os dados, validar, e decidir o que
fazer com esses dados
   
Zend_Db ou Zend_Model ?
 Zend_Model não existe!
 O Zend_Db provê uma camada de abstração
de banco de dados que, dependendo como for
escrito, poderão ser chamados como models
se aplicar os conceitos do slide anterior
 Exemplo: Posso escrever meus models
utilizando o Zend_Db_Table, implementando
as regras de negócio nas tabelas criadas
   
Zend_Db_Select
 Uma classe que representa os selects de uma
query no banco de dados
 Abstrai a escrita de SQL
 Os resultados são obtidos como é feito no PHP
(método fetch da PDO ou *_fetch_*) podendo
ser especificado como parâmetro a forma do
fetch
   
Zend_Db_Select
$sel = new Zend_Db_Select($db);
$query = $sel->from('usuarios')
->query();
while ($r = $query->fetch()) {
echo $r['username'];
}
   
Zend_Db_Select
$query = $db->select()
->from('usuarios')
->where('id > ?', 0)
->query();
while ($r = $query->fetch()) {
echo $r['username'];
}
   
Zend_Db_Table
 Abstrai uma tabela como sendo um objeto
 Indicamos qual tabela a classe pertence e qual
a chave primária
 Possui métodos padrões para inserir, atualizar,
consultar e apagar registros da tabela
 Os resultados obtidos podem ser
Zend_Db_Table_Row,
Zend_Db_Table_Rowset ou personalizado,
podendo ser um fetch comum
   
Zend_Db_Table
class Usuario extends Zend_Db_Table_Abstract
{
protected $_name = 'usuario';
protected $_primary = 'id';
public function insert() {
/** faz algo personalizado **/
}
public function buscarAtivos() { /** */ }
}
   
Usando
$usuario = new Usuario();
$result = $usuario->fetchAll();
foreach ($result as $row) {
echo $row->username;
}
$result = $usuario->find(1);
$result = $usuario->buscarAtivos();
   
Views
HTML, Helpers e Zend_Form
   
Views
 A View é a camada responsável pela
visualização das informações
 Consiste de comandos HTML, XML, ou o que
for a saída
 PHP pode ser misturado, mas apenas para
visualização, ou seja, não processe nada nas
views
 Pode ser segmentada em vários arquivos
   
Uma view nada especial
<form action="" method="post">
<dl>
<dt><label for="txtUsername">Username</label>
</dt>
<dd>
<input type="text" name="txtUsername"
value="<?php echo $this->username ?>" />
</dd>
<dt><label for="txtSenha">Senha</label></dt>
<dd>
<input type="password" name="txtSenha" />
</dd>
</dl>
<input type="submit" value="Enviar"/>
</form>
   
Helpers
 São componentes que são disponibilizado para
facilitar a montagem das views
 Poupa tempo, é conciso, e oferece muita
facilidade para quem for mexer na view
 Você pode escrever seu próprio helper, para
isso basta usar a interface
Zend_View_Helper_Interface ou extender o
Zend_View_Helper_Abstract
   
Uma view com helpers
<form action="" method="post">
<dl>
<dt><?php echo $this->formLabel('txtUsername',
'Username', array()); ?></dt>
<dd><?php echo $this->formText('txtUsername',
$this->username, array()); ?></dd>
<dt><?php echo $this->formLabel('txtSenha',
'Senha', array()); ?></dt>
<dd><?php echo $this->formPassword('txtSenha',
'', array()); ?></dd>
</dl>
<?php echo $this->formSubmit('submit', 'Enviar',
array()); ?>
</form>
   
Partial ou PartialLoop Helper
 Partial são helpers que permite você inserir um
trecho de uma view em outra view
 O Partial inclui apenas uma view uma vez
 O PartialLoop inclui várias vezes, dependendo
do parâmetro passado
 Muito útil para o detalhe de um relatório
   
Partial
 O index.phtml
<h1>Teste</h1>
<?= $this->partial('index/frase.phtml',
array('variavel' => 'Um partial',
'foo' => $bar)); ?>
 O frase.phtml
<?= $this->partial('index/frase.phtml',
array('variavel' => 'Um partial',
'foo' => $bar)); ?>
   
Resultado
   
PartialLoop
 O index.phtml
<ul>
<?= $this->partialLoop(
'index/lista.phtml',
array(array('item' => 'arroz'),
array('item' => 'pão')
)); ?>
</ul>
 A lista.phtml
<li><?= $this->item ?></li>
   
Resultado
   
Zend_Form
 É um componente direcionado para montar um
formulário
 Dispõe de validações e filtragem dos dados
 Pode ser criado a partir de um arquivo de
configuração, ou via codificação
   
Uma view com Zend_Form
[development]
login.action = ""
login.method = "post"
; username
login.elements.txtUsername.type = "text"
login.elements.txtUsername.options.label =
"Username"
   
(continuação)
; senha
login.elements.txtSenha.type = "password"
login.elements.txtSenha.options.label =
"Senha"
; submit
login.elements.enviar.type = "submit"
login.elements.enviar.options.label =
"Enviar"
   
Uma view com Zend_Form
<?php
$configForms = new
Zend_Config_Ini( APPLICATION_PATH .
'/config/forms.ini',
'development');
$form = new Zend_Form($configForms->login);
echo $form;
?>
   
Requisições atendidas em 1 min
Simples
Helpers
Zend_Form
0 100 200 300 400 500 600 700 800 900 1000
   
Controllers
Zend_Controller_Front
Zend_Controller_Request
Zend_Controller_Router
Zend_Controller_Dispatcher
Zend_Controller_Action
   
Zend_Controller_Front
 Componente que implementa o design pattern
FrontController
 Responsável por instanciar o request, router,
dispatcher e actions
 Neste ponto a orientação á objeto começa a
ser executada
   
Zend_Controller_Front
   
Zend_Controller_Request
 Armazena as informações recebidas da
requisição, como qual módulo, qual controller,
qual action
 Armazena as variáveis recebidas da
requisição: GPCSE
 Você pode armazenar parâmetros, que pode
ser passado a outros componentes (na mesma
requisição)
   
Zend_Controller_Router
 Partindo do request, é capaz de estabelecer
rotas, ou melhor, mapear módulos, controllers
e actions para serem dispachados e variáveis
que devem ser preenchidas
$route = new Zend_Controller_Router_Route(
'archive/:year',
array(
'year' => 2006,
'controller' => 'archive',
'action' => 'show'
)
);
   
Zend_Controller_Dispatcher
● Dispara uma requisição recebendo informações
do Zend_Controller_Request
   
Zend_Controller_Action
 Componente que todos os controllers
desenvolvidos devem extender
 É um conjunto de ações, que são mapeadas
pela URL e estão presentes no objeto de
request
 Interage com views e models
 Onde são escritos o preDispacther() e o
postDispatcher()
   
Exemplo de um controller
<?php
class IndexController extends
Zend_Controller_Action {
public function indexAction ()
$user = new Usuario();
$resultado = $a->find(1);
$this->view->nome = $resultado->nome;
}
}
   
Estrutura de Diretórios
- application
- config
- controllers
- models
- views
- scripts
- controller
- library
- Zend
- public
   
Configuração da aplicação
bootstrap.php
Zend_Registry
Zend_Config
   
bootstrap.php
 Dentro da pasta da aplicação
 Responsável pela configuração inicial do
framework e inicializações
 Útil para iniciar componentes que serão
utilizados em toda a aplicação
 Não deve disparar processamentos dos
contollers.
   
Zend_Registry
 Componente que pode armazenar valores
 Acessado estaticamente, pode oferecer acesso
a qualquer variável entre classes e funções
diferentes.
 Um uso de variáveis globais mais elegante
 Uso muito simples:
 Zend_Registry::get('foo');
 Zend_Registry::set('foo', $bar);
   
Zend_Config
 Possibilita a configuração dos formatos:
 Ini
 Xml
 Array
 Possibilidade de extender o Zend_Config:
 Yml
 Implementa o Countable e o Iterator
   
Zend_Config
 O array passa a ser
objeto
 Perda de
performance
 A mudança para
outra fonte de
configuração se torna
fácil e transparente
   
Zend_Config_Ini
 Utiliza arquivos .ini como fonte de
configurações
 Possibilita a divisão de seções
 Possibilita uma seção herdar valores de outra,
alterando apenas os valores que interessam
 É um formato antigo e comum, o que pode
facilitar para algumas pessoas acostumadas
em fuçar no computador
   
Zend_Config_Ini
[development]
login.action = ""
login.method = "post"
[production : development]
login.action = "/prod/login"
   
Zend_Config_Xml
 Utiliza arquivos .xml como fonte de
configurações
 Possibilita uma seção herdar valores de outra,
alterando apenas os valores que interessam
 É um formato mais estruturado, que traz
clareza sobre a organização das informações
 É consideravelmente custoso.
   
O xml
<?xml version="1.0"?>
<configdata>
<development>
<login>
<action></action>
<method>post</method>
</login>
</development>
<production extends="development">
<login>
<action>/prod/login</action>
</login>
</production>
</configdata>
   
Autenticação
Zend_Auth e Zend_Acl
   
Zend_Auth = Autenticação
 O processo de autenticação é definido por
identificar algo ou alguém que requer o acesso
a algum local ou recurso
 Exemplo do mundo real:
 Ao chegar no seu trabalho, você é identificado
como “Fulano – O Funcionário”.
 Ao entrar em um hospital, você pode ser
identificado como “Cicrano – O Paciente”
   
Zend_Auth
 Provê diversos adaptadores para acesso a
diversos tipos de fontes de dados:
 LDAP
 DB
 HTTP
 OpenID
 Ou você pode escrever o seu
 Sugestão: Zend_Auth_Adapter_Txt (;P)
   
Minha tabela de usuários
 Nome da tabela: Usuários
 Campos:
 id: serial
 username: varchar(25)
 senha: char(32);
   
Zend_Auth com DbTable
$authAdapter = new
Zend_Auth_Adapter_DbTable(
$db,
'usuarios',
'username',
'senha');
Zend_Registry::set('authAdapter',
$authAdapter);
   
Autenticando com o Zend_Auth
if ($this->_request->isPost()) {
$db = Zend_Registry::get('db');
$authAdapter = new Zend_Auth_Adapter_DbTable(
$db, 'usuarios',
'username', 'senha',
'md5(?)');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($senha);
$resultado = $authAdapter->authenticate();
   
Autenticando com o Zend_Auth
if ($resultado->isValid()) {
$auth = Zend_Auth::getInstance();
$storage = $auth->getStorage();
//importante
//armazena a identidade para resgate mais
//tarde
$storage->write(
$authAdapter->getResultRowObject(
null, 'senha'));
$this->_redirect('/');
}
   
Está autenticado?
$auth = Zend_Auth::getInstance();
if ($this->_request->getActionName() != 'login'
&& $auth->hasIdentity() == false) {
$this->_redirect('/index/login');
}
   
Zend_Acl = Autorização
 O Zend_Auth identifica.
 O Zend_Acl permite ou não o acesso
 Tem permissão para visualizar?
 Tem permissão para criar?
 Tem permissão para editar?
 Tem permissão para apagar?
   
Zend_Acl
 Zend_Acl_Role define o que ou quem pode
quer acessar algo (grupo do usuario)
 Admin
 Operador
 Convidado
 Zend_Acl_Resource define o que pode pode
ser acessado (actions)
 Cadastrar
 Deletar
   
Zend_Acl_Role
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('admin'));
$acl->addRole(new Zend_Acl_Role('guest'))
$acl->add(new Zend_Acl_Resource('index'));
$acl->add(new
Zend_Acl_Resource('sempermissao'));
$acl->allow('admin', 'index', array());
$acl->allow('guest', 'sempermissao',
array());
if(!$acl->isAllowed(
$auth->getIdentity()->grupo,
$actionName)) {
$this->_redirect('/index/sempermissao');
}
   
Testes
Zend_Test
   
Testes Unitários
 São testes que escrevemos para testar uma
funcionalidade de um método ou função
 Escrevemos, em geral, uma única vez, e só
modificamos se for prevista a mudança
 Entre seus benefícios podemos citar:
 Garante a evolução sem alterar comportamentos
 Aumenta o bem-estar da equipe (ninguém quebra
funcionalidade de outra pessoa)
   
PHPUnit
 Um framework para
escrita de testes
unitários
 Anda lado a lado com
a evolução do PHP
 Provê relatórios com
cobertura de código
(xDebug)
   
Testes Sistêmicos
 Podemos considerar rusticamente os testes
sistêmicos como um conjunto de testes
unitários
 Testam um conjunto de funcionalidades como
um todo
 Análogo á: entre no sistema, digite vários
valores e verifica o resultado.
 Selenium como plugin do PHPUnit
   
Zend_Test
 Um componente do framework que possibilita
testar algumas funcionalidades sem a
necessidade do Selenium
 É possível testar formatações valores de
entrada, um texto em uma página de retorno,
uma formatação css, etc
 Utiliza o mesmo bootstrap.php para carregar a
aplicação
   
Internalization e Globalization
Zend_Locale e Zend_Translate
   
Globalization
 Identifica o local e as
peculiaridades do
local
 Zend_Locale
 Provê uma
informação aos
diversos
componentes
utilizados no G10n
   
Um local
 Um local ou uma cultura são identificados por
uma combinação de abreviatura:
 pt_BR
 en_US
 au
 A primeira abreviatura refere-se a linguagem
 A segunda abreviatura refere-se ao local
   
Zend_Locale e os demais Zend*
 Registrando o Zend_Locale com o
Zend_Registry::set('Zend_Locale', $locale);
a maioria dos componentes preparados para
trabalhar com locais diferentes estarão
automaticamente utilizando o $locale
configurado
 O locale pode ser setado no código ou usar a
auto-detecção pela ordem:
 Browser do usuário e sistema.
   
Zend_Locale e os demais Zend*
 Alguns componentes comuns para trabalhar
com as diferênças:
 Zend_Currency
 Zend_Measure_Weight
 Zend_Measure_Length
 Zend_Date
 Zend_Translate
   
Intercionalization
 Refere-se a tradução
do software, sendo
acessível em
diversas línguas
 Utiliza-se o
Zend_Translate
 O Zend_Locale
identifica o local da
tradução
   
Zend_Translate
 Resumidamente: procura uma string que foi
indicada para ser traduzida na fonte de
tradução
 Se encontrada, retorna a tradução
 Se não encontrada, retorna a string original
 A fonte de tradução pode ser em diversos
formatos
 Array, Gettext, Xml, Tmf, etc.
   
O processo
 Primeiro se escreve e implementa o software
 Depois de pronto, ele será traduzido
 Serão geradas uma fonte de tradução para
cada cultura (língua + local)
 As fontes são traduzidas, processadas e
incluídas no software
   
Um problema com o ZF
 O ZF suporta internacionalização de suas
mensagens
 Basta incluir na fonte de tradução
 O problema é que algumas fontes de tradução
podem gerar um esqueleto das strings que
terão de ser traduzidas (uma simples busca por
qualquer string entre _() ou ->translate(),
simplesmente o ZF não coloca strings, e sim
variáveis.
   
Uma possível solução
 Extender o adaptador de tradução que você
estiver usando e reescrever os métodos que
são usados para retornar a tradução.
 Verificar se a string está traduzida
 Se estiver, retorne a tradução
 Se não, adiciona a fonte de tradução e retorne a
string original
 Aplicável se utilizar testes unitários com boa
cobertura do código
   
Integração com o Google
Zend_Gdata
   
A grande idéia
 O Google é uma
empresa promissora?
 O Google consegue
inserir (impor)
produtos com mais
facilidade?
 Se não pode com ele,
junte-se á ele.
   
Serviços oferecidos
 Integração com:
 Blogs
 Calendars
 Picasa
 Spreadsheets
 Google Apps
 A comunicação é em Atom ou Rss
 Porém, como o componente nem precisa se
preocupar com isso
   
Como é o acesso
 Para acesso de algumas informações ou
serviços é necessário uma autenticação
 Para as aplicações web, não há necessidade
de armazenamento de usuário e senha
 Apenas um token é armazenado
 Traz muita confiança aos usuários, ou não.
   
E agora?
 Dúvidas?
 Críticas?
 Sugestões?
 Mágoas?
   
Fontes
 Informações Técnicas
 http://framework.zend.com
 Imagens
 Thanks Google!!!
   
Obrigado
Edgar Ferreira da Silva
http://www.edgarfs.com.br
http://www.manjaphp.com.br
contato@edgarfs.com.br
Grupo PHPSP
http://www.phpsp.org.br

Zend Framework - PHPSP - 2009

  • 1.
        I ENCONTRODO PHPSP Zend Framework Edgar Ferreira da Silva Fev/2009
  • 2.
        Quem?  Eng.De Software  6 anos de várias experiências em desenvolvimento  Cientista da Computação  Entusiasta do PHP  Criador e mantenedor do ManjaPHP.com.br
  • 3.
        Objetivo  Discutira arquitetura do Zend Framework  Demonstrar o uso alguns componentes  Discutir boas práticas com o ZF
  • 4.
        Framework?  Frameworkssão softwares ou partes que provêem soluções genéricas e concisas ao escopo definido.  Framework para banco de dados:  Propel  Doctrine  Framework para comércio eletônico:  Magento
  • 5.
        É umnovo conceito? Email Data BD Imagem Login Validação Lógica de  Negócio Personalizada
  • 6.
  • 7.
        Quais suasvantagens?  Utilização de boas práticas de desenvolvimento  Testes Unitários  Design Patterns  Documentação  Oferece bom suporte a evolução e a extensão do próprio framework  Oferece interfaces concisas  Extender ou modificar com muita cautela.
  • 8.
        Zend Framework Escrito em PHP5  Orientado á Objetos  Utiliza a metodologia MVC  Licenciado como Open Source  Tocado pela Zend
  • 9.
        Entendendo eextendendo Models, Views e Controllers
  • 10.
        Model  Éuma camada onde se reúnem as classes que: cuidam do acesso correto das informações  Reúne em si toda a lógica de negócio  Deve receber os dados, validar, e decidir o que fazer com esses dados
  • 11.
        Zend_Db ouZend_Model ?  Zend_Model não existe!  O Zend_Db provê uma camada de abstração de banco de dados que, dependendo como for escrito, poderão ser chamados como models se aplicar os conceitos do slide anterior  Exemplo: Posso escrever meus models utilizando o Zend_Db_Table, implementando as regras de negócio nas tabelas criadas
  • 12.
        Zend_Db_Select  Umaclasse que representa os selects de uma query no banco de dados  Abstrai a escrita de SQL  Os resultados são obtidos como é feito no PHP (método fetch da PDO ou *_fetch_*) podendo ser especificado como parâmetro a forma do fetch
  • 13.
        Zend_Db_Select $sel =new Zend_Db_Select($db); $query = $sel->from('usuarios') ->query(); while ($r = $query->fetch()) { echo $r['username']; }
  • 14.
        Zend_Db_Select $query =$db->select() ->from('usuarios') ->where('id > ?', 0) ->query(); while ($r = $query->fetch()) { echo $r['username']; }
  • 15.
        Zend_Db_Table  Abstraiuma tabela como sendo um objeto  Indicamos qual tabela a classe pertence e qual a chave primária  Possui métodos padrões para inserir, atualizar, consultar e apagar registros da tabela  Os resultados obtidos podem ser Zend_Db_Table_Row, Zend_Db_Table_Rowset ou personalizado, podendo ser um fetch comum
  • 16.
        Zend_Db_Table class Usuarioextends Zend_Db_Table_Abstract { protected $_name = 'usuario'; protected $_primary = 'id'; public function insert() { /** faz algo personalizado **/ } public function buscarAtivos() { /** */ } }
  • 17.
        Usando $usuario =new Usuario(); $result = $usuario->fetchAll(); foreach ($result as $row) { echo $row->username; } $result = $usuario->find(1); $result = $usuario->buscarAtivos();
  • 18.
  • 19.
        Views  AView é a camada responsável pela visualização das informações  Consiste de comandos HTML, XML, ou o que for a saída  PHP pode ser misturado, mas apenas para visualização, ou seja, não processe nada nas views  Pode ser segmentada em vários arquivos
  • 20.
        Uma viewnada especial <form action="" method="post"> <dl> <dt><label for="txtUsername">Username</label> </dt> <dd> <input type="text" name="txtUsername" value="<?php echo $this->username ?>" /> </dd> <dt><label for="txtSenha">Senha</label></dt> <dd> <input type="password" name="txtSenha" /> </dd> </dl> <input type="submit" value="Enviar"/> </form>
  • 21.
        Helpers  Sãocomponentes que são disponibilizado para facilitar a montagem das views  Poupa tempo, é conciso, e oferece muita facilidade para quem for mexer na view  Você pode escrever seu próprio helper, para isso basta usar a interface Zend_View_Helper_Interface ou extender o Zend_View_Helper_Abstract
  • 22.
        Uma viewcom helpers <form action="" method="post"> <dl> <dt><?php echo $this->formLabel('txtUsername', 'Username', array()); ?></dt> <dd><?php echo $this->formText('txtUsername', $this->username, array()); ?></dd> <dt><?php echo $this->formLabel('txtSenha', 'Senha', array()); ?></dt> <dd><?php echo $this->formPassword('txtSenha', '', array()); ?></dd> </dl> <?php echo $this->formSubmit('submit', 'Enviar', array()); ?> </form>
  • 23.
        Partial ouPartialLoop Helper  Partial são helpers que permite você inserir um trecho de uma view em outra view  O Partial inclui apenas uma view uma vez  O PartialLoop inclui várias vezes, dependendo do parâmetro passado  Muito útil para o detalhe de um relatório
  • 24.
        Partial  Oindex.phtml <h1>Teste</h1> <?= $this->partial('index/frase.phtml', array('variavel' => 'Um partial', 'foo' => $bar)); ?>  O frase.phtml <?= $this->partial('index/frase.phtml', array('variavel' => 'Um partial', 'foo' => $bar)); ?>
  • 25.
  • 26.
        PartialLoop  Oindex.phtml <ul> <?= $this->partialLoop( 'index/lista.phtml', array(array('item' => 'arroz'), array('item' => 'pão') )); ?> </ul>  A lista.phtml <li><?= $this->item ?></li>
  • 27.
  • 28.
        Zend_Form  Éum componente direcionado para montar um formulário  Dispõe de validações e filtragem dos dados  Pode ser criado a partir de um arquivo de configuração, ou via codificação
  • 29.
        Uma viewcom Zend_Form [development] login.action = "" login.method = "post" ; username login.elements.txtUsername.type = "text" login.elements.txtUsername.options.label = "Username"
  • 30.
        (continuação) ; senha login.elements.txtSenha.type= "password" login.elements.txtSenha.options.label = "Senha" ; submit login.elements.enviar.type = "submit" login.elements.enviar.options.label = "Enviar"
  • 31.
        Uma viewcom Zend_Form <?php $configForms = new Zend_Config_Ini( APPLICATION_PATH . '/config/forms.ini', 'development'); $form = new Zend_Form($configForms->login); echo $form; ?>
  • 32.
        Requisições atendidasem 1 min Simples Helpers Zend_Form 0 100 200 300 400 500 600 700 800 900 1000
  • 33.
  • 34.
        Zend_Controller_Front  Componenteque implementa o design pattern FrontController  Responsável por instanciar o request, router, dispatcher e actions  Neste ponto a orientação á objeto começa a ser executada
  • 35.
  • 36.
        Zend_Controller_Request  Armazenaas informações recebidas da requisição, como qual módulo, qual controller, qual action  Armazena as variáveis recebidas da requisição: GPCSE  Você pode armazenar parâmetros, que pode ser passado a outros componentes (na mesma requisição)
  • 37.
        Zend_Controller_Router  Partindodo request, é capaz de estabelecer rotas, ou melhor, mapear módulos, controllers e actions para serem dispachados e variáveis que devem ser preenchidas $route = new Zend_Controller_Router_Route( 'archive/:year', array( 'year' => 2006, 'controller' => 'archive', 'action' => 'show' ) );
  • 38.
        Zend_Controller_Dispatcher ● Disparauma requisição recebendo informações do Zend_Controller_Request
  • 39.
        Zend_Controller_Action  Componenteque todos os controllers desenvolvidos devem extender  É um conjunto de ações, que são mapeadas pela URL e estão presentes no objeto de request  Interage com views e models  Onde são escritos o preDispacther() e o postDispatcher()
  • 40.
        Exemplo deum controller <?php class IndexController extends Zend_Controller_Action { public function indexAction () $user = new Usuario(); $resultado = $a->find(1); $this->view->nome = $resultado->nome; } }
  • 41.
        Estrutura deDiretórios - application - config - controllers - models - views - scripts - controller - library - Zend - public
  • 42.
        Configuração daaplicação bootstrap.php Zend_Registry Zend_Config
  • 43.
        bootstrap.php  Dentroda pasta da aplicação  Responsável pela configuração inicial do framework e inicializações  Útil para iniciar componentes que serão utilizados em toda a aplicação  Não deve disparar processamentos dos contollers.
  • 44.
        Zend_Registry  Componenteque pode armazenar valores  Acessado estaticamente, pode oferecer acesso a qualquer variável entre classes e funções diferentes.  Um uso de variáveis globais mais elegante  Uso muito simples:  Zend_Registry::get('foo');  Zend_Registry::set('foo', $bar);
  • 45.
        Zend_Config  Possibilitaa configuração dos formatos:  Ini  Xml  Array  Possibilidade de extender o Zend_Config:  Yml  Implementa o Countable e o Iterator
  • 46.
        Zend_Config  Oarray passa a ser objeto  Perda de performance  A mudança para outra fonte de configuração se torna fácil e transparente
  • 47.
        Zend_Config_Ini  Utilizaarquivos .ini como fonte de configurações  Possibilita a divisão de seções  Possibilita uma seção herdar valores de outra, alterando apenas os valores que interessam  É um formato antigo e comum, o que pode facilitar para algumas pessoas acostumadas em fuçar no computador
  • 48.
        Zend_Config_Ini [development] login.action ="" login.method = "post" [production : development] login.action = "/prod/login"
  • 49.
        Zend_Config_Xml  Utilizaarquivos .xml como fonte de configurações  Possibilita uma seção herdar valores de outra, alterando apenas os valores que interessam  É um formato mais estruturado, que traz clareza sobre a organização das informações  É consideravelmente custoso.
  • 50.
        O xml <?xmlversion="1.0"?> <configdata> <development> <login> <action></action> <method>post</method> </login> </development> <production extends="development"> <login> <action>/prod/login</action> </login> </production> </configdata>
  • 51.
  • 52.
        Zend_Auth =Autenticação  O processo de autenticação é definido por identificar algo ou alguém que requer o acesso a algum local ou recurso  Exemplo do mundo real:  Ao chegar no seu trabalho, você é identificado como “Fulano – O Funcionário”.  Ao entrar em um hospital, você pode ser identificado como “Cicrano – O Paciente”
  • 53.
        Zend_Auth  Provêdiversos adaptadores para acesso a diversos tipos de fontes de dados:  LDAP  DB  HTTP  OpenID  Ou você pode escrever o seu  Sugestão: Zend_Auth_Adapter_Txt (;P)
  • 54.
        Minha tabelade usuários  Nome da tabela: Usuários  Campos:  id: serial  username: varchar(25)  senha: char(32);
  • 55.
        Zend_Auth comDbTable $authAdapter = new Zend_Auth_Adapter_DbTable( $db, 'usuarios', 'username', 'senha'); Zend_Registry::set('authAdapter', $authAdapter);
  • 56.
        Autenticando como Zend_Auth if ($this->_request->isPost()) { $db = Zend_Registry::get('db'); $authAdapter = new Zend_Auth_Adapter_DbTable( $db, 'usuarios', 'username', 'senha', 'md5(?)'); $authAdapter->setIdentity($username); $authAdapter->setCredential($senha); $resultado = $authAdapter->authenticate();
  • 57.
        Autenticando como Zend_Auth if ($resultado->isValid()) { $auth = Zend_Auth::getInstance(); $storage = $auth->getStorage(); //importante //armazena a identidade para resgate mais //tarde $storage->write( $authAdapter->getResultRowObject( null, 'senha')); $this->_redirect('/'); }
  • 58.
        Está autenticado? $auth= Zend_Auth::getInstance(); if ($this->_request->getActionName() != 'login' && $auth->hasIdentity() == false) { $this->_redirect('/index/login'); }
  • 59.
        Zend_Acl =Autorização  O Zend_Auth identifica.  O Zend_Acl permite ou não o acesso  Tem permissão para visualizar?  Tem permissão para criar?  Tem permissão para editar?  Tem permissão para apagar?
  • 60.
        Zend_Acl  Zend_Acl_Roledefine o que ou quem pode quer acessar algo (grupo do usuario)  Admin  Operador  Convidado  Zend_Acl_Resource define o que pode pode ser acessado (actions)  Cadastrar  Deletar
  • 61.
        Zend_Acl_Role $acl =new Zend_Acl(); $acl->addRole(new Zend_Acl_Role('admin')); $acl->addRole(new Zend_Acl_Role('guest')) $acl->add(new Zend_Acl_Resource('index')); $acl->add(new Zend_Acl_Resource('sempermissao')); $acl->allow('admin', 'index', array()); $acl->allow('guest', 'sempermissao', array()); if(!$acl->isAllowed( $auth->getIdentity()->grupo, $actionName)) { $this->_redirect('/index/sempermissao'); }
  • 62.
  • 63.
        Testes Unitários São testes que escrevemos para testar uma funcionalidade de um método ou função  Escrevemos, em geral, uma única vez, e só modificamos se for prevista a mudança  Entre seus benefícios podemos citar:  Garante a evolução sem alterar comportamentos  Aumenta o bem-estar da equipe (ninguém quebra funcionalidade de outra pessoa)
  • 64.
        PHPUnit  Umframework para escrita de testes unitários  Anda lado a lado com a evolução do PHP  Provê relatórios com cobertura de código (xDebug)
  • 65.
        Testes Sistêmicos Podemos considerar rusticamente os testes sistêmicos como um conjunto de testes unitários  Testam um conjunto de funcionalidades como um todo  Análogo á: entre no sistema, digite vários valores e verifica o resultado.  Selenium como plugin do PHPUnit
  • 66.
        Zend_Test  Umcomponente do framework que possibilita testar algumas funcionalidades sem a necessidade do Selenium  É possível testar formatações valores de entrada, um texto em uma página de retorno, uma formatação css, etc  Utiliza o mesmo bootstrap.php para carregar a aplicação
  • 67.
        Internalization eGlobalization Zend_Locale e Zend_Translate
  • 68.
        Globalization  Identificao local e as peculiaridades do local  Zend_Locale  Provê uma informação aos diversos componentes utilizados no G10n
  • 69.
        Um local Um local ou uma cultura são identificados por uma combinação de abreviatura:  pt_BR  en_US  au  A primeira abreviatura refere-se a linguagem  A segunda abreviatura refere-se ao local
  • 70.
        Zend_Locale eos demais Zend*  Registrando o Zend_Locale com o Zend_Registry::set('Zend_Locale', $locale); a maioria dos componentes preparados para trabalhar com locais diferentes estarão automaticamente utilizando o $locale configurado  O locale pode ser setado no código ou usar a auto-detecção pela ordem:  Browser do usuário e sistema.
  • 71.
        Zend_Locale eos demais Zend*  Alguns componentes comuns para trabalhar com as diferênças:  Zend_Currency  Zend_Measure_Weight  Zend_Measure_Length  Zend_Date  Zend_Translate
  • 72.
        Intercionalization  Refere-sea tradução do software, sendo acessível em diversas línguas  Utiliza-se o Zend_Translate  O Zend_Locale identifica o local da tradução
  • 73.
        Zend_Translate  Resumidamente:procura uma string que foi indicada para ser traduzida na fonte de tradução  Se encontrada, retorna a tradução  Se não encontrada, retorna a string original  A fonte de tradução pode ser em diversos formatos  Array, Gettext, Xml, Tmf, etc.
  • 74.
        O processo Primeiro se escreve e implementa o software  Depois de pronto, ele será traduzido  Serão geradas uma fonte de tradução para cada cultura (língua + local)  As fontes são traduzidas, processadas e incluídas no software
  • 75.
        Um problemacom o ZF  O ZF suporta internacionalização de suas mensagens  Basta incluir na fonte de tradução  O problema é que algumas fontes de tradução podem gerar um esqueleto das strings que terão de ser traduzidas (uma simples busca por qualquer string entre _() ou ->translate(), simplesmente o ZF não coloca strings, e sim variáveis.
  • 76.
        Uma possívelsolução  Extender o adaptador de tradução que você estiver usando e reescrever os métodos que são usados para retornar a tradução.  Verificar se a string está traduzida  Se estiver, retorne a tradução  Se não, adiciona a fonte de tradução e retorne a string original  Aplicável se utilizar testes unitários com boa cobertura do código
  • 77.
        Integração como Google Zend_Gdata
  • 78.
        A grandeidéia  O Google é uma empresa promissora?  O Google consegue inserir (impor) produtos com mais facilidade?  Se não pode com ele, junte-se á ele.
  • 79.
        Serviços oferecidos Integração com:  Blogs  Calendars  Picasa  Spreadsheets  Google Apps  A comunicação é em Atom ou Rss  Porém, como o componente nem precisa se preocupar com isso
  • 80.
        Como éo acesso  Para acesso de algumas informações ou serviços é necessário uma autenticação  Para as aplicações web, não há necessidade de armazenamento de usuário e senha  Apenas um token é armazenado  Traz muita confiança aos usuários, ou não.
  • 81.
        E agora? Dúvidas?  Críticas?  Sugestões?  Mágoas?
  • 82.
        Fontes  InformaçõesTécnicas  http://framework.zend.com  Imagens  Thanks Google!!!
  • 83.
        Obrigado Edgar Ferreirada Silva http://www.edgarfs.com.br http://www.manjaphp.com.br contato@edgarfs.com.br Grupo PHPSP http://www.phpsp.org.br