Aplicações Profissionais 
   para Internet com 
    Zend Framework
      Flávio Gomes da Silva Lisboa
             www.fgsl.eti.br
                @fgsl
Aviso
Você pode copiar e distribuir livremente esta 
      apresentação, mas cite a fonte.




                     noteaqui.com
Nossa agenda



1)Breve currículo
2)Internet
3)PHP
4)Problemas de Construção de Software
5)Zend Framework
Breve currículo




           http://www.temporealeventos.com.br
Internet
 GUERRA FRIA




infoescola.com
Internet   oliveirarock.blogspot.com
Internet
Werner Von Braun




   http://pt.wikipedia.org/wiki/Wernher_von_Braun
Internet
Foguetes V1 e V2



            bloggeae.blogspot.com




                  mediastorehouse.com
Internet




history.nasa.gov
                              anti­­illuminati.blogspot.com
Internet




                   obviousmag.org




            Sergei Korolev
aps.org
Internet




  hardware.com.br
Internet
     ARPANET (1969)




      infoescola.com
personalpages.manchester.ac.uk
Internet
NSFNET (1985)




computerhistory.or
g
Internet
                                 World Wide Web (1990)




http://en.wikipedia.org/wiki/File:First_Web_Server.jpg   Sir Tim Berners­Lee
Internet
                  World Wide Web (1990)

   Tim Berners­Lee especificou a HTML – 
    Hypertext Markup Language, e escreveu um 
    browser e um web server.




                       en.kioskea.net
Internet
CERN publica o projeto WWW (1991)




         askamathematician.com
Internet
NCSA Mosaic (1993) 




    appleinsider.com
Internet
Netscape (1994) 




      supportcave.com
Internet
                    Javascript (1995) 

   Javascript é uma linguagem de script 
    padronizada pela especificação ECMA­262 e 
    pela norma ISO/IEC 16262.
   Ela permite o processamento de eventos no 
    cliente.



                      marketingshift.com
Internet
                Internet Explorer (1995) 




http://en.wikipedia.org/wiki/File:Internet_Explorer_1.0.png
Internet
                     Internet Explorer (1995) 




gednt.blogspot.com




                                                 operawatch.com
Internet
Conseqüências da Internet




  www.fgsl.eti.br
PHP
Personal Home Page (1995) 
PHP




Fonte: Zend Whitepaper PHP
PHP




Fonte: Zend Whitepaper PHP
PHP

PHP  (hoje  PHP  Hypertext  Preprocessor)  é  uma 
linguagem  de  programação  compreensiva  e 
completa  em  funcionalidades  com  sólido  suporte 
a orientação a objetos. 

PHP não precisa tem de ser compilado porque o 
Zend Engine compila o código em tempo real.

PHP  é  livre  e  aberta,  bem  documentada  e 
mantida em comunidade (www.php.net). 
PHP




Ocorrências do PHP em tipos de aplicação
PHP


A    solução    mais    complexa    raramente    é    a   
certa. (...)  enquanto  outras  soluções  que  nos  
cercam  parecem    ficar    maiores    e    mais   
complexas,  estamos    nos    esforçando    para   
simplificar  e racionalizar o PHP (...).

                  Rasmus Lerdorf
PHP
          PHP trata a imprevisibilidade

Independente da classe a ser usada:

$object = new $class();

Independente do método a ser executado:

$result = $object->$method();
PHP
               PHP generaliza o código
Métodos dinâmicos:

public function __call($method,$arguments)
public      function    __callStatic($method,
$arguments)

public function __invoke()


$result = $object();
Leitura, gravação e criação dinâmica de atributos:

public function __get($attribute)
public function __set($attribute,$value)
PHP
Quem usa PHP
PHP
Utilização do PHP no mundo




            Em 12 milhões de domínios.
            Fonte: http://phpadvent.org/2010/usage­statistics­by­ilia­alshanetsky
PHP
Combinação poderosa
Problemas na Construção de Software
    Não basta o anel do Lanterna Verde




          http://aneldolanternaverde.blogspot.com/
Problemas na Construção de Software
      É preciso alguém preparado.




                                museudoheroi.blogspot.com
Problemas na Construção de Software
      Senão qualquer um podia ser.




                                     emeralddawn.com
Problemas na Construção de Software




Estamos falando de aplicações profissionais para 
        Internet e não de “sitiozinhos”.

 Estamos falando de sistemas de informação e 
          não de páginas pessoais.
Problemas na Construção de Software

  Não somos capazes de escrever programas 
              isentos de falhas
        Jocélio Passos. Msc (UFPE)

Ninguém tem um cérebro grande o bastante para 
  conter um programa de computador moderno
            Edsger Djikstra (1972)
Problemas na Construção de Software


 O trabalho do programador é desumano porque 
    se exige que eles (sic) escrevam grandes 
quantidades de código complexo sem erros e em 
           um curto espaço de tempo
          Jocélio Passos. Msc (UFPE)
Problemas na Construção de Software


             O software muda...

    A evolução de software reflete­se numa 
necessidade intrínseca pelo desenvolvimento e a 
    manutenção contínua de sistemas, para 
   endereçar uma aplicação, ou resolver um 
     problema no domínio do mundo real
  Lehman e Ramil 2001 APUD Hattori 2008
Problemas na Construção de Software

E de acordo com a arquitetura do software, a 
      mudança pode ser complicada...
Problemas na Construção de Software

                                     Fatos:

A manutenção é a fase mais longa do desenvolvimento 
                  de um software.

       Manutenções podem gerar problemas. [1]

Mudanças triviais podem gerar uma reação em cadeia de 
                      erros. [2]

Se o software é feito em grupo, os erros aumentam. [3]
       [1],[2].[3]: Jocélio Passos
Problemas na Construção de Software

                            Solução:

 Construir software a partir de blocos de construção 
            complexos (componentes). [1]

Construir coisas complexas a partir de coisas simples.

 Construir coisas mais complexas a partir de coisas 
                    complexas.




      [1]: Jocélio Passos
Problemas na Construção de Software

           Novo problema:
       Como aplicar essa solução?
Zend Framework



         Padrão de Codificação
  Modelo de Criação de Componentes
Biblioteca de Componentes Reutilizáveis

            Livre e Aberto

     Baseado em Padrões Abertos

            Documentado
Para que um framework?




☻Projeto modular
►Evita a complexidade que advém com o crescimento
                                                                 carpediem­lica.blogspot.com


☻Melhores práticas
►Você absorve as práticas e bons hábitos dos criadores do framework

☻Componentes
►Mantém você com novas tecnologias
Por que Zend Framework?




☻Nenhum framework é completo
►Nenhum software é completo

☻Frameworks devem ser mínimos                        school.discoveryeducation.com

►Fuja de soluções completas e definitivas

☻Como eu integro o framework X dentro do framework que eu escolhi
►Se ele não for fracamente acoplado, você não integra!
Zend Framework Features



☻Um ponto de partida para aplicações PHP, que provê:
►Características de segurança;
►Projeto modular

☻Uma coleção de mais de 70 componentes PHP para simplificar tarefas comuns, incluindo alguns 
para:
►Criação (e reuso) de formulários
►Logging
►Acesso a banco de dados
☻Uma demonstração das melhores práticas de PHP 5
☻Provê padrões e grande funcionalidade mas não cria dificuldades para seu estilo de programação. 
Seu desenvolvimento não é limitado de forma alguma.
Zend Tool


☻Criação da estrutura e componentes de um projeto PHP OO MVC
►Ferramenta para linha de comando
►Pode ser integrado com uma IDE, como Eclipse
MVC                         


☻Modelo                                               oglobo.globo.com
Classes reusáveis que acessam dados e regras de negócio
Mantém SQL e detalhes da aplicação em um só lugar

☻Visão
Templates contendo HTML ou outra saída, com poucos trechos de PHP
                                                                         bignadaquasar.wordpress.com
Coloca seu HTML em uma “visão” sem preocupação em sobrescrever o código PHP principal – e 
ajuda web designers a trabalharem com programadores de regras de negócio

☻Controlador (controlador de página)
Fluxo da aplicação
Conecta modelo e visão
Não confunda com “controlador frontal”, que apenas inicializa o  MVC




                                                                                    enciclopedia.com.pt
Do Controlador Frontal para o Controlador de Página
Controlador Frontal roteia URLs amigáveis


Convenção de roteamento padrão:
    http://exemplo.com.br/controller/action/param1/value1...


      controller mapeia                            Pares param/value 
       para o nome da                             são passados para a 
           classe            action mapeia 
                                                          ação
                             para o nome do 
                                 método
                                                                         Controller1
                                                                          action1()
 HTTP                                                                     action2()
request
                      Bootstrap:                 Front
                      index.php                Controller

                                                                         Controller2
                                                                          action1()
                                                                          action2()
index.php: passagem obrigatória

Todas as requisições passam por index.php no 
doc root. Este é o único diretório público.
index.php inicializa a aplicação e instancia o 
Zend_Controller_Front.
O roteamento depende do módulo mod_rewrite 
estar disponível. A regra de reescrita pode ser 
definida no arquivo httpd.conf (ou em outro .conf ) 
ou por meio de arquivos .htaccess (o que exige 
AllowOverride All).
Zend_Application

 Deixa a configuração e inicialização separadas

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH .
'/configs/application.ini'
);
$application->bootstrap()
            ->run();
Zend_Application
 [production]
 phpSettings.display_startup_errors = 0
 phpSettings.display_errors = 0
 includePaths.library = APPLICATION_PATH "/../library"
 bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
 bootstrap.class = "Bootstrap"
 appnamespace = "Application"
 resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
 resources.frontController.params.displayExceptions = 0
 resources.frontController.baseUrl = BASE_URL
 resources.frontController.plugins.controller = "Fgsl_Plugin_Controller"
 resources.layout.layout = "layout"
 resources.db.adapter = "pdo_pgsql"
 resources.db.params.host = "localhost"
 resources.db.params.username = "postgres"
 resources.db.params.password = "postgres"
 resources.db.params.dbname = "tudodb"
 resources.db.isDefaultTableAdapter = true

 [staging : production]

 [testing : production]
 phpSettings.display_startup_errors = 1
 phpSettings.display_errors = 1

 [development : production]
 phpSettings.display_startup_errors = 1
 phpSettings.display_errors = 1
 resources.frontController.params.displayExceptions = 1
Zend_Controller_Action
   Classes de controle manipulam grupos de requisições
http://exemplo.com/controller/action
Padrão: IndexController
      Organiza e agrupa funcionalidades
      Uma classe (herdeira de Zend_Controller_Action) para cada controlador
   Métodos de ação em cada classe de controle manipulam requisições
http://exemplo.com.br/controller/action
Padrão: indexAction()
      Algo como actionAction()
         Exemplo: Se action é “edit” então o método é editAction()
Zend_Controller_Action
Zend_Loader_Autoloader

Na verdade, não é preciso usar require ou 
include... pelo menos não mais que uma vez!
No index.php, coloque isto:
require_once 'Zend/Loader/Autoloader.php';

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Zend');
Zend_View
Scripts (templates)
      Templates baseados em scripts PHP para apresentação de dados
      Devem conter somente lógica de exibição, não lógica de negócio
      Nomeação padrão: “myaction.phtml” 


Helpers
      Classes e métodos que provêem funcionalidade de visão reutilizável
        Exemplos helpers embutidos: escape(), formText(), partial(), 
        partialLoop(), headTitle()
        Escreva os seus também
Layout: Zend_Layout
Zend_View

Você pode substituir literais HTML no script de
visão por comandos PHP echo:
   <?php echo $this->productNum ?>

ZF provê padrões inteligentes
   O view helper $this->escape() usa a função 
   htmlentities() recomendada pela maioria dos especialistas 
   em segurança. 
Faça seu view helper
class Zend_View_Helper_Title_Case {


       public $view;


       public function titleCase($string = '')
       {
           return ucwords(strtolower(trim($string)));


       } //(public function titleCase())


       public function setView(Zend_View_Interface $view) {
               $this->view = $view;
       }
}
                                                  Uso:
                                                  echo $this->titleCase(‘mozilla
                                                  firefox’);
Controlador chama visão... 
...automaticamente
Zend_Layout
Dá a seu site uma aparência consistente enquanto
 retém a flexibilidade

Padrão Two-step view
    Usa Zend_View para renderização

Marcadores úteis para configurar javascript, títulos e
 outros dados variáveis
Zend_Layout
Zend_... Model?
Classes modelo são representações abstratas de
dados
    Podem ser estendidas de:
      Zend_Db_Table – Para abstração de banco de dados
      Ou qualquer outra classe que se encaixe em sua necessidade
      Ou construa suas próprias representações abstratas de seus 
      dados

Classes modelo podem conter lógica de negócio para
preparar dados complexos para apresentação
Código que seja estranho ao controlador e a visão é
um bom candidato a ficar no modelo.
Zend_Form
Cria o HTML para seus formulários de entrada
    $form = new Zend_Form();
    $form->addElement(‘text’, ‘ordernum‘);
    $form->addElement(‘text’, ‘date‘);


Vários modos de imprimir os elementos de formulário
    echo $form; // tudo ou
    echo $form->ordernum; // só o especificado ou
    echo $form->getElement(‘ordernum’);

HTML gerado pelo último  echo
    <input type=“text” name=“ordernum” id=“ordernum”>
Zend_Form

Pode ser integrado com Zend_Filter, para fazer 
conversões de dados
Pode ser integrado com Zend_Validate, para 
fazer validação de dados.
Pode ser integrado com o Dijit do Dojo Toolkit 
para implementar RIA.
Zend_Db
Zend_Db pode criar SQL para você
 Strings SQL tendem a causar erros e não são curtas


Zend_Db oferece muito mais do que apenas criar SQL
  quoting consistente
  escaping
  prepared statements (substituições para “?”)
  profiler
Zend_Db
Zend_Db implementa padrões para acesso a dados
 Data Table Gateway
 Data Row Gateway
 Data Mapper
 Active Record
Muitos componentes...
Segurança

Autenticação, Autorização, Filtragem, Validação




                     bahianoticias.com.br
Infraestrutura

Registro Global, Sessão, Carregador de 
classes...




                   odebrechtonline.com.br
Performance

Cache, memória...




                    automaistv.com.br
Web Services

XML­RPC, SOAP, REST
Nuvem

Zend_GData, Zend_Service_Amazon, 
Zend_Service_WindowsAzure,  Zend_Cloud




                 pela­positiva.blogspot.com
Integração com Dojo Toolkit

Frontend dinâmico, com animações e gráficos.
Mais informações:

http://framework.zend.com 
http://www.fgsl.eti.br
http://www.temporealeventos.com.br 
Referências
http://www.facape.br/jocelio/es/material_em_pdf_conceitual/ESFuturoSW.pdf

http://www.inf.usi.ch/phd/hattori/downloads/Dissertacao_LilePalmaHattori.pdf    
im.ufba.br/pub/MATA63/.../MATA63 ProjetoDeSoftware­01.ppt

Aplicações Profissionais para Internet com Zend Framework