O Objetivo desta palestra é discutir um pouco da história do Zend Framework e sua caminhada até o presente momento, e seus caminhos que estão impulsionando a reescrita da Versão 2.0, os velhos e os novos paradgmas e os desafios que a nova versão vem colocando à tona frente aos paradgmas do desenvolvimento web.
3. Agenda
• Um pouco de história
• O Futuro
• Novos padrões e velhos padrões
• Novos componentes
• Outras coisas
quarta-feira, 29 de agosto de 12 3
4. Um pouco de história
• Verão de 2005
• Inicio da codificação do Zend Framework com
um seleto grupo de parceiros
• Outono de 2005
• Durante a conferência anual ZendCon é
anunciado o processo de Comunidade PHP, que
entre outras coisas envolveu a Fundação
Eclipse, o relançamento da Zend Developers
Zone, e o Zend Framework
quarta-feira, 29 de agosto de 12 4
5. Um pouco de história
• Julho de 2007
• Liberada a primeira versão estável do Zend Framework
(1.0.0)
• Incluindo uma implementação basica do Padrão MVC,
com plugins, action helpers, renderização automatica,
entre outros
• Várias APIs de consumo de Webservices, camadas de
autenticação e autorização, Table, Row, Data Gateways,
etc
• Componente servidor para XML-RPC e REST
quarta-feira, 29 de agosto de 12 5
6. Um pouco de história
• Março de 2008
• Liberada a versão 1.5.0
• Zend_Form e Zend_Layout foram os
carros chefes
• Muitas melhorias no Zend_View (Agora
com entendimento do layout)
quarta-feira, 29 de agosto de 12 6
7. Um pouco de história
• Setembro de 2008
• Zend Framework 1.6.0
• Integração com o Dojo Toolkit
• Zend_Test, implementação ou extensão
do PHPUnit
• Novos Actions Helper e a introdução do
ContextSwitch
quarta-feira, 29 de agosto de 12 7
8. Um pouco de história
• Novembro de 2008
• Versão 1.7.0
• Melhorias de perfomance
• Atenção especial ao AMF (Adobe Action
Message)
• Grande interação com o protocolo da
Adobe (Action Script do Flash e mais tarde
Adobe Air)
quarta-feira, 29 de agosto de 12 8
9. Um pouco de história
• Abril de 2009
• Released 1.8.0
• Zend_Tool e Zend_Aplication
• Full Stack
quarta-feira, 29 de agosto de 12 9
10. Um pouco de história
• 1.9.0 em Julho de 2009
• Reescrita do Zend_Feed_Reader
• PHP 5.3 Compatible
• Adições da Comunidade
quarta-feira, 29 de agosto de 12 10
11. Um pouco de história
• Em Outubro de 2009 foi iniciada uma
verdadeira caça a bugs incentivada pela
comunidade
quarta-feira, 29 de agosto de 12 11
12. Um pouco de história
• Janeiro de 2010
• Chega a versão 1.10
• Novos componentes de testes
• ZendTestCase com Zend_Application
• Virada na Documentação, além da
reorganização, adoção do PhD para redenrizar
o manual, quickstart no sistema de comentários.
• Learning Zend Framework Section
quarta-feira, 29 de agosto de 12 12
13. Um pouco de história
• Fevereiro de 2010 marcou o inicío do
desenvolvimento em cima do Zend
Framework 2.0
• Junho de 2010 Formação do Time de
Revisão da Comunidade
quarta-feira, 29 de agosto de 12 13
14. Um pouco de história
• Novembro de 2010
• Novo release, 1.11
• Zend_Http_UserAgent
• Zend_Cloud
• API SimpleCloud
quarta-feira, 29 de agosto de 12 14
19. “A mutação é a chave para a nossa evolução. Ela
nos permitiu evoluir de organismo unicelular à
espécia dominante do planeta. Este processo foi
e é lento, milhares de anos podem se passar. Mas
em algumas centenas de milênios, a evolução dá
um salto”
quarta-feira, 29 de agosto de 12 19
23. • Autoload (extipar chamadas require_once)
• Conversão para namespaces
• Refatoração e padronização do uso de
exceptions
• Refatoração e implementação consistente de
uma estratégia de carregamento de plugins
• Refatorar para uso dos paradigmas especificos
do PHP 5.3/5.4 onde se fizer necesário
quarta-feira, 29 de agosto de 12 23
25. Zend_Db
• Dificuldade em obter conexões persistentes
e compartilhá-la com outras instâncias ou de
diferentes classes
• Dificuldades em obter os metadados de
forma consistente
• Dificuldades em extender
• Complexidade em adicionar tarefas pre|pos
quarta-feira, 29 de agosto de 12 25
26. Zend_Session
• Padrão caixa-preta != testável
• Armazenamento do Namespace
incompatível com $_SESSION
• Grandes incompatibilidades com ext/
session
quarta-feira, 29 de agosto de 12 26
27. <?php
use ZendSessionSessionManager,
ZendSessionSessionContainer as SessionContainer;
$manager = new SessionManager(array(
'class' => 'MinhaImplementacaoSessionConfiguration',
'storage' => 'MinhaImplementacaoSessionStorage'
));
$container = new SessionContainer('SessionIndex', $manager);
$container['meuindice'] = 'meu conteudo';
$container->setExpirationHops(20);
quarta-feira, 29 de agosto de 12 27
28. Filtros e Validadores
• Acessos estáticos e uso em cadeias estão
mixados no mesmo objeto
• Não utilizar a metodologia comum de
carregamento de plugin
• Padrões required em Filter_Input
e Form não são mais suportados
quarta-feira, 29 de agosto de 12 28
29. <?php
namespace ZendValidator;
if(StaticValidator::execute($value,'int')) {
//Validação Passou
}
$chain = new ValidatorChain();
$chain->addValidator(new Int(),true)
->addValidator(new GreaterThan(5));
if($chain->isValid($value)) {
//Validação Passou novamente
}
quarta-feira, 29 de agosto de 12 29
30. Adição de novas funcionalidades que
favoreçam a extensibilidade
quarta-feira, 29 de agosto de 12 30
31. Exemplos
• SignalSlot
• FilterChain
• SPL Extension (SplStack, SplQueue)
• PluginBroker
quarta-feira, 29 de agosto de 12 31
36. class MeuController extends Zend_Controller_Action
{
public function meuObjetoAction()
{
$this->view->meuobjeto = 'uma string qualquer';
}
}
Quando
Onde isso está Quando entra os layouts?
definido? renderizar?
quarta-feira, 29 de agosto de 12 36
37. • Código explícito
• Melhora o entendimento
• É mais fácil
• Facilita a análise
• Facilita sua manutenção
quarta-feira, 29 de agosto de 12 37
38. Otimização para
perfomance
quarta-feira, 29 de agosto de 12 38
39. Requisições/Segundo
0 150 300 450 600
1.0.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.10.0
quarta-feira, 29 de agosto de 12 39
41. Namespaces
• Nomes de classes relativamente grandes
• Zend_Form_Element_HtmlArea_Interface
quarta-feira, 29 de agosto de 12 41
42. Namespace
• Um namespace declara um arquivo de classe
• Um namespace por arquivo
• Qualquer classe usada que não estiver no
namespace atual (ou em um subnamespace)
é importado e tipicamente apelidada
• Resolução global totalmente desencorajada,
exceto nos casos de classes referenciadas
em strings
quarta-feira, 29 de agosto de 12 42
43. Importe classes com o
comando use em vez de
fazer chamadas a
require_once em seu código
quarta-feira, 29 de agosto de 12 43
45. Antigamente
• Exceções derivavam de uma classe
• Não tinha capacidade de extender os tipos
de exceções semânticas oferecidas pela SPL
• Estratégias de captura limitada
• Forte depêndencia entre classes e o todo
quarta-feira, 29 de agosto de 12 45
46. Nova abordagem
• Eliminação da Zend_Exception
• Interface Exception marcada por
componente
• Exceções concretas residem em um
subnamespace Exception estendendo da SPL
Exception
quarta-feira, 29 de agosto de 12 46
47. namespace ZendEventManagerException;
use ZendEventManagerException;
class InvalidaArgumentException extends
InvalidArgumentException implements
Exception
{
}
quarta-feira, 29 de agosto de 12 47
48. namespace ZendEventManagerException;
use ZendEventManagerException;
try {
$events->trigger('gera-exception',$objeto);
}catch (InvalidArgumentException $e) {
}catch (Exception $e) {
}catch (InvalidArgumentException $e) {
}catch (Exception $e) {
}
quarta-feira, 29 de agosto de 12 48
50. Autocarregamento:
Problemas
• Problemas de perfomance
• A maioria das classes são utilizadas
somente no momento adequado e não
devem ser carregadas até que seja
necessário
• A falta de chamadas require_once leva a
erros
quarta-feira, 29 de agosto de 12 50
51. Autocarregamento: nova
abordagem
• Fim dos require_once
• Múltipla abordagem de autocarregamento
• via include_path (ZF 1)
• Namespace / prefixo do fornecedor
• Mapa de Classes (Novo)
quarta-feira, 29 de agosto de 12 51
52. return array(
'Index/MeuController' => __DIR__ .
'indexcontrollersMeuController.php' .
'IndexModelObjeto' => __DIR__ . 'indexmodels
Objeto.php'
);
//Mapa de Classes
require_once 'Zend/Loader/ClassMapAutoloader.php';
$loader = new ZendLoaderClassMapAutoloader (
'./.classmap.php'
);
$loader->register();
$objeto = new IndexModelObjeto();
quarta-feira, 29 de agosto de 12 52
54. Carregamento de
plugin: definição
• Plugin é qualquer classe que é determinada
em tempo de execução
• Auxiliares de controle de visão
• Adaptadores
• Filtros e Validadores
quarta-feira, 29 de agosto de 12 54
55. Carregamento de plugins:
Problema
• Várias abordagens para descobrir as classes plugin
• Caminhos relativos para as classes chamadas
• Pilhas do tipo prefixo-caminho (comum)
• Modificadores para indicar classes
• O jeito tradicional é uma m%$â
• Péssimo para a perfomance
• Depuração complicada
• Problemas de caching de plugins descobertos
quarta-feira, 29 de agosto de 12 55
56. Carregamento de plugins:
Soluções
• Interface de localização de Plugins
• Permite variar a implementação de
pesquisa de plugins
• Interface de agente de plugins
• Compõe um Localizador de Plugins
quarta-feira, 29 de agosto de 12 56
57. namespace MeuComponente
use ZendLoaderPluginClassLoader,
ZendLoaderPluginBroker;
class ComponentLoader extends PluginClassLoader
{
protected $plugins = arry(
'soo' => 'MeuComponenteBla',
'soo_bla' => 'MeuComponenteSooBla'
);
}
quarta-feira, 29 de agosto de 12 57
60. • Como introduzir debug/logging na aplicação?
• Como permitir implementação de caches
pelos utilizadores?
• Como permitir utilizadores introduzam
filtros e validação?
quarta-feira, 29 de agosto de 12 60
61. EventManager: Premissas
• Razoavelmente simples de entender
• Permitir a interrupção da execução
• Capacidade de anexar ao evento muitos
componentes de emissão de uma só vez
quarta-feira, 29 de agosto de 12 61
62. EventManager: Definição
• Um Event Manager é um objeto que agrega
os ouvintes com nome, e que desencadeia
eventos;
• Um Listener é um retorno que pode reagir a
um Evento
• Um Evento é uma ação
quarta-feira, 29 de agosto de 12 62
63. EventManager: Casos de uso
• Implementação simples do padrão (pattern)
observer;
• Implementação Orientada a Aspectos;
• Implementação de event-driven arquiteturas
quarta-feira, 29 de agosto de 12 63
65. DI - Simples definição
• Define maneiras de passar as dependências a
um objeto
quarta-feira, 29 de agosto de 12 65
66. DI vs DIC
• Di é um pattern;
• Dic (Container) é uma ferramenta
quarta-feira, 29 de agosto de 12 66
67. • ZendDiDefinition
• Definições é o lugar onde ZendDi tenta
compreender a estrutura do código.
quarta-feira, 29 de agosto de 12 67
68. ZendDi: Caso de uso
• Tirar os controladores MVC do container
quarta-feira, 29 de agosto de 12 68
69. namespace IndexController;
Class Entry implements Dispatchable
{
public function setResource(Resource $resource)
{
$this->resource = $resource;
}
public function dispatch(Request $request, Response $response =
null)
{
$entry = $this->resource->get($id)
}
}
quarta-feira, 29 de agosto de 12 69
70. class FrontController implements Dispatchable
{
public function __construct(DependencyInjection $di)
{
$this->id = $id;
}
public function dispatch(Request $request, Response =
null)
{
/*...*/
$controller = $this->di->get($controllerName);
/**..**/
}
}
quarta-feira, 29 de agosto de 12 70
71. • Perfomance
• Desacoplamento de código
• Simplificação do código do controlador
quarta-feira, 29 de agosto de 12 71
72. Outras coisas
• Refatoração e reescrita do MVC
• Internacionalização e Localização
• Testing
• Documentação
• Empacotamento
• Ferramentas de migração
quarta-feira, 29 de agosto de 12 72
73. ZF II Git
• Guia do git
• http://bit.ly/zf2gitguide
• GitHub
• http://github.com/zendframework/zf2
• CLA ainda necessário
quarta-feira, 29 de agosto de 12 73