Zend Framework repaginado, o que esperar
da nova versão
Domingos Teruel
1quarta-feira, 29 de agosto de 12
O Palestrante
2quarta-feira, 29 de agosto de 12
Agenda
• Um pouco de história
• O Futuro
• Novos padrões e velhos padrões
• Novos componentes
• Outras coisas
3quarta-feira, 29 de agosto de 12
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
4quarta-feira, 29 de agosto de 12
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
5quarta-feira, 29 de agosto de 12
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)
6quarta-feira, 29 de agosto de 12
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
7quarta-feira, 29 de agosto de 12
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)
8quarta-feira, 29 de agosto de 12
Um pouco de história
• Abril de 2009
• Released 1.8.0
• Zend_Tool e Zend_Aplication
• Full Stack
9quarta-feira, 29 de agosto de 12
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
10quarta-feira, 29 de agosto de 12
Um pouco de história
• Em Outubro de 2009 foi iniciada uma verdadeira caça a bugs incentivada pela comunidade
11quarta-feira, 29 de agosto de 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
12quarta-feira, 29 de agosto de 12
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
13quarta-feira, 29 de agosto de 12
Um pouco de história
• Novembro de 2010
• Novo release, 1.11
• Zend_Http_UserAgent
• Zend_Cloud
• API SimpleCloud
14quarta-feira, 29 de agosto de 12
Futuro?
15quarta-feira, 29 de agosto de 12
Daqui vamos para onde?
16quarta-feira, 29 de agosto de 12
Revolução17quarta-feira, 29 de agosto de 12
Evolução18quarta-feira, 29 de agosto de 12
“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”
19quarta-feira, 29 de agosto de 12
Melhorias incrementais
20quarta-feira, 29 de agosto de 12
Focar na melhoria da consistência e perfomance
21quarta-feira, 29 de agosto de 12
Passos de bebê
22quarta-feira, 29 de agosto de 12
• 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
23quarta-feira, 29 de agosto de 12
Reescrever somenteonde faz sentido
24quarta-feira, 29 de agosto de 12
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
25quarta-feira, 29 de agosto de 12
Zend_Session
• Padrão caixa-preta != testável
• Armazenamento do Namespace incompatível com $_SESSION
• Grandes incompatibilidades com ext/session
26quarta-feira, 29 de agosto de 12
<?phpuse Zend\Session\SessionManager, Zend\Session\SessionContainer as SessionContainer; $manager = new SessionManager(array( 'class' => 'Minha\Implementacao\SessionConfiguration', 'storage' => 'Minha\Implementacao\SessionStorage'));
$container = new SessionContainer('SessionIndex', $manager);$container['meuindice'] = 'meu conteudo';$container->setExpirationHops(20);
27quarta-feira, 29 de agosto de 12
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
28quarta-feira, 29 de agosto de 12
<?phpnamespace Zend\Validator;
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}
29quarta-feira, 29 de agosto de 12
Adição de novas funcionalidades que favoreçam a extensibilidade
30quarta-feira, 29 de agosto de 12
Exemplos
• SignalSlot
• FilterChain
• SPL Extension (SplStack, SplQueue)
• PluginBroker
31quarta-feira, 29 de agosto de 12
Explicitação de código
32quarta-feira, 29 de agosto de 12
Magia por muitas vezes pode ser
muito inigmática
33quarta-feira, 29 de agosto de 12
echo $this->headLink()->appendStylesheet('meuarquivo.css');/*** Hits Zend_View::_call()* Calls Zend_View::getHelper()* Calls Zend_View::getPlugin()* Calls Zend_Loader_PluginLoader::load()* Calls Zend_Loader::isReadable()* Calls call_user_function(hits autoloader..)* which calls Zend_Loader::loadClass* ...*/
34quarta-feira, 29 de agosto de 12
Mágica? Bruxaria?35quarta-feira, 29 de agosto de 12
class MeuController extends Zend_Controller_Action{ public function meuObjetoAction() { $this->view->meuobjeto = 'uma string qualquer'; }}
Quando entra os layouts?Quando
renderizar?
Onde isso está definido?
36quarta-feira, 29 de agosto de 12
• Código explícito
• Melhora o entendimento
• É mais fácil
• Facilita a análise
• Facilita sua manutenção
37quarta-feira, 29 de agosto de 12
Otimização para perfomance
38quarta-feira, 29 de agosto de 12
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
Requisições/Segundo
39quarta-feira, 29 de agosto de 12
Namespaces
40quarta-feira, 29 de agosto de 12
• Nomes de classes relativamente grandes
• Zend_Form_Element_HtmlArea_Interface
Namespaces
41quarta-feira, 29 de agosto de 12
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
42quarta-feira, 29 de agosto de 12
Importe classes com o comando use em vez de
fazer chamadas a require_once em seu código
43quarta-feira, 29 de agosto de 12
Exceções44quarta-feira, 29 de agosto de 12
• 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
Antigamente
45quarta-feira, 29 de agosto de 12
Nova abordagem
• Eliminação da Zend_Exception
• Interface Exception marcada por componente
• Exceções concretas residem em um subnamespace Exception estendendo da SPL Exception
46quarta-feira, 29 de agosto de 12
namespace Zend\EventManager\Exception;
use Zend\EventManager\Exception;
class InvalidaArgumentException extends \InvalidArgumentException implements Exception{ }
47quarta-feira, 29 de agosto de 12
namespace Zend\EventManager\Exception;
use Zend\EventManager\Exception;
try { $events->trigger('gera-exception',$objeto);}catch (InvalidArgumentException $e) { }catch (Exception $e) { }catch (\InvalidArgumentException $e) { }catch (\Exception $e) { }
48quarta-feira, 29 de agosto de 12
Autocarregamento
49quarta-feira, 29 de agosto de 12
• 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
Autocarregamento: Problemas
50quarta-feira, 29 de agosto de 12
• Fim dos require_once
• Múltipla abordagem de autocarregamento
• via include_path (ZF 1)
• Namespace / prefixo do fornecedor
• Mapa de Classes (Novo)
Autocarregamento: nova abordagem
51quarta-feira, 29 de agosto de 12
return array( 'Index/MeuController' => __DIR__ . 'index\controllers\MeuController.php' . 'Index\Model\Objeto' => __DIR__ . '\index\models\Objeto.php');
//Mapa de Classesrequire_once 'Zend/Loader/ClassMapAutoloader.php';
$loader = new \Zend\Loader\ClassMapAutoloader ( './.classmap.php');
$loader->register();
$objeto = new Index\Model\Objeto();
52quarta-feira, 29 de agosto de 12
Carregamento de Plugins
53quarta-feira, 29 de agosto de 12
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
54quarta-feira, 29 de agosto de 12
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
55quarta-feira, 29 de agosto de 12
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
56quarta-feira, 29 de agosto de 12
namespace Meu\Componente
use \Zend\Loader\PluginClassLoader, \Zend\Loader\PluginBroker; class ComponentLoader extends PluginClassLoader{ protected $plugins = arry( 'soo' => 'Meu\Componente\Bla', 'soo_bla' => '\Meu\Componente\SooBla' );}
57quarta-feira, 29 de agosto de 12
Novos Componentes58quarta-feira, 29 de agosto de 12
Zend\EventManager
59quarta-feira, 29 de agosto de 12
• Como introduzir debug/logging na aplicação?
• Como permitir implementação de caches pelos utilizadores?
• Como permitir utilizadores introduzam filtros e validação?
60quarta-feira, 29 de agosto de 12
• 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
EventManager: Premissas
61quarta-feira, 29 de agosto de 12
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
62quarta-feira, 29 de agosto de 12
EventManager: Casos de uso
• Implementação simples do padrão (pattern) observer;
• Implementação Orientada a Aspectos;
• Implementação de event-driven arquiteturas
63quarta-feira, 29 de agosto de 12
Dependency Injection (DI)
64quarta-feira, 29 de agosto de 12
DI - Simples definição
• Define maneiras de passar as dependências a um objeto
65quarta-feira, 29 de agosto de 12
DI vs DIC
• Di é um pattern;
• Dic (Container) é uma ferramenta
66quarta-feira, 29 de agosto de 12
• ZendDiDefinition
• Definições é o lugar onde ZendDi tenta compreender a estrutura do código.
67quarta-feira, 29 de agosto de 12
• Tirar os controladores MVC do container
Zend\Di: Caso de uso
68quarta-feira, 29 de agosto de 12
namespace Index\Controller; 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) } }
69quarta-feira, 29 de agosto de 12
class FrontController implements Dispatchable { public function __construct(DependencyInjection $di) { $this->id = $id; } public function dispatch(Request $request, Response = null) { /*...*/ $controller = $this->di->get($controllerName); /**..**/ } }
70quarta-feira, 29 de agosto de 12
• Perfomance
• Desacoplamento de código
• Simplificação do código do controlador
71quarta-feira, 29 de agosto de 12
• Refatoração e reescrita do MVC
• Internacionalização e Localização
• Testing
• Documentação
• Empacotamento
• Ferramentas de migração
Outras coisas
72quarta-feira, 29 de agosto de 12
ZF II Git
• Guia do git
• http://bit.ly/zf2gitguide
• GitHub
• http://github.com/zendframework/zf2
• CLA ainda necessário
73quarta-feira, 29 de agosto de 12
74quarta-feira, 29 de agosto de 12
PHPSC Conf 2012Sábado, 27 de outubro de 2012
http://conf.phpsc.com.br
75quarta-feira, 29 de agosto de 12
Obrigado!
http://about.me/mingomax
http://slideshare.net/mingomax
76quarta-feira, 29 de agosto de 12