as novidades do   PHP
            eo
Zend Framework 2
Elton Minetto
              Graduado/pós-graduado em Ciência da Computação
                        Desenvolvedor desde 1997
                           Professor desde 2004
                       Autor de dois livros sobre PHP


Sócio da   Coderockr
                                 Instrutor do   Code Squad
PHP
Namespaces
<?php
namespace CoreService;

use ZendHttpClient as HttpClient;
use ZendHttpRequest;
class Auth
{
    public function __construct($apiKey, $apiUri, $rpcUri)
    {
        $this->httpClient = new HttpClient();
    }
}
Traits
trait Veiculo {
    public function rodar(){
        /* x */
    }
}

trait Aeronave {
    public function voar(){
        /* x */
    }
}

trait Brinquedo {
    private $pedagogico;

    public function isPedagogico(){
        return $this->pedagogico;
    }
}
class Carrinho {
    use Veiculo, Brinquedo;
}

class Aviaozinho {
    use Aeronave, Brinquedo;
}

class Helicoptero {
    use Aeronave;
}

class TanqueDeGuerra {
    use Veiculo;
}
Servidor embutido
php -S localhost:8080 -t /var/www/projeto
PSR
PSR - 0: regras de autoloader de classes
 PSR - 1: regras básicas de codificação
PSR - 2: regras avançadas de codificação
Composer
Ferramenta que facilita a instalação e
    atualização de dependências
Funções anônimas
public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Cache' => function($sm) {
                $config = include __DIR__ . 'config.php';
                $cache = StorageFactory::factory(
                    array(
                       'adapter' => $config['cache'])
                );
                return $cache;
            }
        ),
    );
}
Frameworks
Uma base de onde pode-se desenvolver
  algo maior ou mais específico. É uma
 coleção de códigos, classes, funções,
técnicas e metodologias que facilitam o
 desenvolvimento de novos softwares.
Zend Framework
       2
Desenvolvido pela Zend junto com a
          comunidade PHP
 Mais de 2 anos de desenvolvimento
Mais de 200 profissionais envolvidos
Apoio Google, Microsoft, entre outras
Vantagens
Usa recursos mais avançados do PHP
          5.3.3 em diante
Processo de contribuição mais simples
       Pull-requests no Github
     Não precisa assinar termos
Fácil instalação e atualização
         via Composer
No more magic!
Tudo é mais explícito, fácil de manter e
                testar
//ZF1
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
      $this->view->message = “Hello World”;
  }
}


      Onde foi definido?
//ZF2
namespace ApplicationController;

use ZendViewModelViewModel;
use ZendMvcControllerAbstractActionController;

class Index extends AbstractActionController
{
  public function indexAction()
  {
     return new ViewModel(
        array('message' => “Hello World”)
     );
}
Fácil integração com frameworks e
 componentes compatíveis com o
          PSR-0 e Composer
    (Symfony, Doctrine, Monolog, etc)
Desvantagens
Pouca documentação
Módulos
"[] um módulo é uma coleção de código
e outros arquivos que resolve um
problema específico de uma aplicação ou
site."
    Mattew O'Phinney. Zend Framework project leader
Totalmente reutilizáveis
Dezenas de módulos desenvolvidos no
    http://modules.zendframework.com
Eventos
Como introduzir logs e debugs no códido da aplicação?
Como introduzir cache na aplicação como um todo?
Como introduzir validações, filtros, ACL?

Soluções: traits (somente PHP 5.4), PubSub pattern, eventos
Um EventManager é um objeto que agrega listeners para
um ou mais eventos e que gera (trigger) outros eventos.
Um listener é uma função/método (callback) que reage a
um evento
Injeção de
dependências
class User
{
  protected $storage;

    public function __construct()
    {
       $this->storage = new SessionStorage();
    }
}

$user = new User();                 Difícil de customizar




                    Fácil de usar
class User
{
  protected $storage;

    public function __construct($storage)
    {
       $this->storage = $storage;
    }
}
                                          Fácil de customizar
$storage = new SessionStorage()
$user = new User($storage);


                          Mais difícil de usar
//formas de injeção de dependências
$storage = new SessionStorage();

//injeção pelo construtor
$user = new User($storage);

//injeção usando setters
$user = new User();
$user->setStorage($storage);

//injeção por propriedade
$user = new User();
$user->storage = $storage;
ServiceManager
"[] é um registro, ou container que armazena
os vários objetos necessários para a sua
aplicação[] armazena a informação necessária
para instanciar estes objetos conforme forem
necessários [] é um gerenciador de objetos, ou
gerenciador de instâncias."
                     Evan Coury, software engineer.
/**
  * Retorna a configuração do service manager do módulo
  * @return array
  */
public function getServiceConfig()
{
     return array(
         'factories' => array(
             'ApplicationServiceAuth' => function($sm) {
                  $dbAdapter = $sm->get('DbAdapter');
                  return new ServiceAuth($dbAdapter);
             },
         ),
     );
}

//uso em um controller
$auth = $this->getServiceManager()->get('Application
ServiceAuth');
MVC
Tudo é um evento
Controllers são serviços
Referências
http://www.slideshare.net/weierophinney/zend-
framework-20-patterns-tutorial
http://www.slideshare.net/fabpot/dependency-
injectionzendcon2010
http://diogobesson.com.br/programacao/php-traits/
http://code-squad.com/screencast/composer
http://mwop.net/blog/267-Getting-started-writing-
ZF2-modules.html
http://static.zend.com/topics/ZF2-Getting-
Contato
@eminetto
http://www.eltonminetto.net
    http://coderockr.com
   http://code-squad.com

Introdução ao Zend Framework 2