SlideShare uma empresa Scribd logo
1 de 83
   
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

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Modulos SNEP
Modulos SNEPModulos SNEP
Modulos SNEP
 
Php 05 Mvc
Php 05 MvcPhp 05 Mvc
Php 05 Mvc
 
Slides
SlidesSlides
Slides
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados
 
Snep arquitetura
Snep arquiteturaSnep arquitetura
Snep arquitetura
 
Sql - Comandos dml do mysql - parte 1
Sql - Comandos dml do mysql - parte 1Sql - Comandos dml do mysql - parte 1
Sql - Comandos dml do mysql - parte 1
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Hibernate-consultas
Hibernate-consultasHibernate-consultas
Hibernate-consultas
 
Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in Javascript
 
um breve treinamento sobre SQL e suas funcionalidades
um breve treinamento sobre SQL e suas funcionalidadesum breve treinamento sobre SQL e suas funcionalidades
um breve treinamento sobre SQL e suas funcionalidades
 
PHP 7
PHP 7PHP 7
PHP 7
 
Funcao PHP
Funcao PHPFuncao PHP
Funcao PHP
 
Views Oracle Database
Views Oracle DatabaseViews Oracle Database
Views Oracle Database
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Php 02 Primeiros Passos
Php 02 Primeiros PassosPhp 02 Primeiros Passos
Php 02 Primeiros Passos
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Aula 7 pc - estrutura
Aula 7   pc - estruturaAula 7   pc - estrutura
Aula 7 pc - estrutura
 

Destaque

Faixas de Transicao
Faixas de Transicao Faixas de Transicao
Faixas de Transicao Laguat
 
Arquitetura da Informação
Arquitetura da InformaçãoArquitetura da Informação
Arquitetura da InformaçãoKarine Drumond
 
MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)
MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)
MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)MonkeyBusiness
 
A Administração Estratégica e as estratégias organizacionais
A Administração Estratégica e as estratégias organizacionaisA Administração Estratégica e as estratégias organizacionais
A Administração Estratégica e as estratégias organizacionaisAntonio Marcos Montai Messias
 
Fundamentos de arquitetura
Fundamentos de arquiteturaFundamentos de arquitetura
Fundamentos de arquiteturaHeldio Carneiro
 
Presentación1
Presentación1Presentación1
Presentación1sheybuen
 
Arte do renascimento - arquitetura
Arte do renascimento - arquiteturaArte do renascimento - arquitetura
Arte do renascimento - arquiteturaCarlos Vieira
 
Necropsia Medico Legal
Necropsia Medico LegalNecropsia Medico Legal
Necropsia Medico LegalNadson Joseph
 
15 Quotes To Nurture Your Creative Soul!
15 Quotes To Nurture Your Creative Soul!15 Quotes To Nurture Your Creative Soul!
15 Quotes To Nurture Your Creative Soul!DesignMantic
 
Leader's Guide to Motivate People at Work
Leader's Guide to Motivate People at WorkLeader's Guide to Motivate People at Work
Leader's Guide to Motivate People at WorkWeekdone.com
 

Destaque (13)

Faixas de Transicao
Faixas de Transicao Faixas de Transicao
Faixas de Transicao
 
Arquitetura da Informação
Arquitetura da InformaçãoArquitetura da Informação
Arquitetura da Informação
 
MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)
MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)
MonkeyBusiness – O Slide Perfeito (Revista Super Interessante)
 
A Administração Estratégica e as estratégias organizacionais
A Administração Estratégica e as estratégias organizacionaisA Administração Estratégica e as estratégias organizacionais
A Administração Estratégica e as estratégias organizacionais
 
Fundamentos de arquitetura
Fundamentos de arquiteturaFundamentos de arquitetura
Fundamentos de arquitetura
 
Presentación1
Presentación1Presentación1
Presentación1
 
Arte do renascimento - arquitetura
Arte do renascimento - arquiteturaArte do renascimento - arquitetura
Arte do renascimento - arquitetura
 
CORES
CORESCORES
CORES
 
Necropsia Medico Legal
Necropsia Medico LegalNecropsia Medico Legal
Necropsia Medico Legal
 
Enabling Autonomy
Enabling AutonomyEnabling Autonomy
Enabling Autonomy
 
15 Quotes To Nurture Your Creative Soul!
15 Quotes To Nurture Your Creative Soul!15 Quotes To Nurture Your Creative Soul!
15 Quotes To Nurture Your Creative Soul!
 
Bill Aulet GEC2016 keynote speech March 16 2016 Medellin Colombia
Bill Aulet GEC2016 keynote speech March 16 2016 Medellin ColombiaBill Aulet GEC2016 keynote speech March 16 2016 Medellin Colombia
Bill Aulet GEC2016 keynote speech March 16 2016 Medellin Colombia
 
Leader's Guide to Motivate People at Work
Leader's Guide to Motivate People at WorkLeader's Guide to Motivate People at Work
Leader's Guide to Motivate People at Work
 

Semelhante a Zend Framework - PHPSP - 2009

Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Desfrutando os Componentes do Zend Framework
Desfrutando os Componentes do Zend FrameworkDesfrutando os Componentes do Zend Framework
Desfrutando os Componentes do Zend FrameworkFernando Geraldo Mantoan
 
ZF Básico - 1. Introdução
ZF Básico - 1. IntroduçãoZF Básico - 1. Introdução
ZF Básico - 1. IntroduçãoMarcos Bezerra
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
Desmistificando o Framework da Zend
Desmistificando o Framework da ZendDesmistificando o Framework da Zend
Desmistificando o Framework da ZendDomingos Teruel
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Israel Messias
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraDavid O'Keefe
 
O que esperar do Zend Framework 2
O que esperar do Zend Framework 2O que esperar do Zend Framework 2
O que esperar do Zend Framework 2Flávio Lisboa
 
Curso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkCurso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkEvandro Klimpel Balmant
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpRodrigo Aramburu
 

Semelhante a Zend Framework - PHPSP - 2009 (20)

Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Desfrutando os Componentes do Zend Framework
Desfrutando os Componentes do Zend FrameworkDesfrutando os Componentes do Zend Framework
Desfrutando os Componentes do Zend Framework
 
ZF Básico - 1. Introdução
ZF Básico - 1. IntroduçãoZF Básico - 1. Introdução
ZF Básico - 1. Introdução
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Desmistificando o Framework da Zend
Desmistificando o Framework da ZendDesmistificando o Framework da Zend
Desmistificando o Framework da Zend
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Palestra
PalestraPalestra
Palestra
 
Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
O que esperar do Zend Framework 2
O que esperar do Zend Framework 2O que esperar do Zend Framework 2
O que esperar do Zend Framework 2
 
Curso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkCurso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend Framework
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 

Zend Framework - PHPSP - 2009

  • 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
  • 9.     Entendendo e extendendo 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 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']; }
  • 14.     Zend_Db_Select $query = $db->select() ->from('usuarios') ->where('id > ?', 0) ->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() { /** */ } }
  • 17.     Usando $usuario = new Usuario(); $result = $usuario->fetchAll(); foreach ($result as $row) { echo $row->username; } $result = $usuario->find(1); $result = $usuario->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
  • 20.     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>
  • 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
  • 22.     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>
  • 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
  • 24.     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)); ?>
  • 26.     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>
  • 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"
  • 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 view com 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 atendidas em 1 min Simples Helpers Zend_Form 0 100 200 300 400 500 600 700 800 900 1000
  • 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' ) );
  • 38.     Zend_Controller_Dispatcher ● Dispara uma requisição recebendo informações do Zend_Controller_Request
  • 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; } }
  • 41.     Estrutura de Diretórios - application - config - controllers - models - views - scripts - controller - library - Zend - public
  • 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
  • 48.     Zend_Config_Ini [development] login.action = "" login.method = "post" [production : development] login.action = "/prod/login"
  • 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
  • 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'); }
  • 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
  • 67.     Internalization e Globalization Zend_Locale e Zend_Translate
  • 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
  • 77.     Integração com o Google Zend_Gdata
  • 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.
  • 81.     E agora?  Dúvidas?  Críticas?  Sugestões?  Mágoas?
  • 82.     Fontes  Informações Técnicas  http://framework.zend.com  Imagens  Thanks Google!!!
  • 83.     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