O documento descreve o I Encontro do PHPSP sobre o framework Zend. Ele apresenta os objetivos do encontro que são discutir a arquitetura e componentes do Zend Framework e boas práticas de desenvolvimento. Também resume os principais conceitos e componentes do framework como MVC, models, views, controllers, autenticação e autorização.
1.
I ENCONTRO DO 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
Discutir a arquitetura
do Zend Framework
Demonstrar o uso
alguns componentes
Discutir boas práticas
com o ZF
4.
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
5.
É um novo conceito?
Email
Data
BD
Imagem
Login
Validação
Lógica de
Negócio
Personalizada
7.
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.
8.
Zend Framework
Escrito em PHP5
Orientado á Objetos
Utiliza a metodologia
MVC
Licenciado como
Open Source
Tocado pela Zend
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 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
12.
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
13.
Zend_Db_Select
$sel = new Zend_Db_Select($db);
$query = $sel->from('usuarios')
->query();
while ($r = $query->fetch()) {
echo $r['username'];
}
15.
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
16.
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() { /** */ }
}
19.
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
21.
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
23.
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
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 view com Zend_Form
[development]
login.action = ""
login.method = "post"
; username
login.elements.txtUsername.type = "text"
login.elements.txtUsername.options.label =
"Username"
34.
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
36.
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)
37.
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'
)
);
39.
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()
40.
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;
}
}
42.
Configuração da aplicação
bootstrap.php
Zend_Registry
Zend_Config
43.
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.
44.
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);
45.
Zend_Config
Possibilita a configuração dos formatos:
Ini
Xml
Array
Possibilidade de extender o Zend_Config:
Yml
Implementa o Countable e o Iterator
46.
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
47.
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
49.
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.
50.
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>
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 tabela de usuários
Nome da tabela: Usuários
Campos:
id: serial
username: varchar(25)
senha: char(32);
55.
Zend_Auth com DbTable
$authAdapter = new
Zend_Auth_Adapter_DbTable(
$db,
'usuarios',
'username',
'senha');
Zend_Registry::set('authAdapter',
$authAdapter);
56.
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();
57.
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('/');
}
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_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
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
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)
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
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
68.
Globalization
Identifica o 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 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.
71.
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
72.
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
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 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.
76.
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
78.
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.
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.