Desenvolvendo um Blog com 
Zend Framework 2 
$ Cezar Junior de Souza - 2014
Quem sou eu? 
$ Bacharel em Sistemas de Informação; 
$ Especialista em Engenharia e Qualidade de 
Software; 
$ Programador Web desde 2010; 
$ Mais informações: LinkeDin
Cronograma 
$ Visão geral do ZF2; 
$ Principais características do 
ZF2; 
$ Preparando o Ambiente de 
desenvolvimento; 
$ Criando o projeto Blog com 
ZF2; 
$ Configurando o banco de 
dados postgresql; 
$ Criando o module Core; 
$ Criando o module Admin; 
$ Configurando o module Admin 
e seus Testes; 
$ Criando os testes da Model 
User, e após, a Model User; 
$ Criando os testes para o 
Controller Users, o Controller 
Users, seu Form e views;
Cronograma 
$ Utilizando Session; 
$ Criando um serviço de 
autenticação e seus testes; 
$ Criando controller para 
Autenticação, form e testes; 
$ Criando os testes da Model 
Categorie, e após, a Model 
Categorie; 
$ Criando os testes para o 
Controller Categories, o Controller 
Categories, seu Form e views; 
$ Criando os testes da Model 
Post, e após, a Model Post; 
$ Criando os testes para o 
Controller Posts, o Controller 
Posts, seu Form e views; 
$ Criando o módulo main 
$ Criando o IndexController do 
módulo Main, seu teste e exibindo 
os posts em sua view;
Cronograma 
$ Criando os testes da Model 
Comment, e após, a Model 
Comment; 
$ Criando os testes para o 
Controller Comments, o Controller 
Comments, seu Form e views; 
$ Fazendo comentários por Ajax; 
$ Definindo o módulo Main como o 
módulo principal; 
$ Criando o layout para o blog; 
$ Criando ViewHelper de sessão; 
$ Alterando menu de acordo com a 
role do usuário autenticado; 
$ Adicionar join com a entity user na 
query de posts no IndexController do 
módulo main 
$ Exibir dados do usuário que criou o 
post na view do IndexController do 
módulo main;
Cronograma 
$ Criando o controle de acesso 
com ACLs;
Visão geral do ZF2 
$ O que é um Framework?
Visão geral do ZF2 
$ Um pouco da história do Zend Framework
Visão geral do ZF2 
$ Por que usar o ZF2? 
● É modular e funciona como blocos de concreto que podem ser 
usados peça por peça com outras aplicações ou frameworks; 
● Extensível: fácil de adaptar o framework para suas necessidades; 
● Alta performasse: Projetado pensando em desempenho; 
● Segurança: Todas as criptografias de segurança que você precisa; 
● Comunidade: Uma extensa comunidade e uma grande base de 
colaboradores e usuários; 
● Pronto para o negócio: Uma história de sucesso provada e 
executada em aplicações de alto uso e negócio critico.
Visão geral do ZF2 
$ Sistema de Autoloading 
$ Namespaces: 
namespace ModuleFolder; 
namespace AdminModel; 
namespace ClienteController; 
$ Class-Maps 
No arquivo autoload_classmap.php do módulo: 
return array( 
'MinhaClasse1' => 'minha_classe1.php', 
'MinhaClasse2' => 'minha_classe2.php', 
);
Visão geral do ZF2 
$ Dependency injection (Di) 
$ é um design pattern com o proposito de diminuir o 
acoplamento entre os componentes do software.
Visão geral do ZF2 
$ Dependency injection (Di) 
$ Sem DI 
class Foo { 
protected $bar; 
… public function _construct(){ 
$this->bar = new Bar(); 
} 
... 
} 
Contras: 
Dificuldades para os testes 
Código não isolado 
Dificuldade para reusar o código 
$ Com DI 
class Foo { 
protected $bar; 
… public function _construct(Bar 
$bar){ 
$this->bar = $bar; 
} 
... 
} 
Pros: 
Facilidade nos testes 
Flexibilidade na arquitetura
Visão geral do ZF2 
$ Gerenciador de eventos
Visão geral do ZF2 
$ Table Gateway
Visão geral do ZF2 
$ O novo MVC do ZF2
Visão geral do ZF2 
$ Modulos
Preparando o Ambiente de 
desenvolvimento 
ATENÇÃO 
Este processo de configuração do Ambiente de desenvolvimento 
irá funcionar nas versões do Ubuntu acima da 12.04, foi testado 
até a 14.04.
Preparando o Ambiente de 
desenvolvimento 
$ sudo apt-get moo 
(__) 
(oo) 
/------/ 
/ | || 
* /---/ 
~~ ~~ 
..."Have you mooed today?"...
Preparando o Ambiente de 
desenvolvimento 
$ Instalando o sublime text 3 
$ sudo add-apt-repository ppa:webupd8team/sublime-text-3 
$ sudo apt-get update 
$ sudo apt-get install sublime-text-installer
Preparando o Ambiente de 
desenvolvimento 
$ Instalando o postgresql e seu cliente pgadmin3 
$ sudo apt-get install postgresql 
$ sudo apt-get install pgadmin3 
$ Alterando a senha do usuário postgres 
$ sudo -su postgres 
$ psql template1 
template1=# ALTER USER postgres WITH PASSWORD 'root';
Preparando o Ambiente de 
desenvolvimento 
$ Instalando o git 
$ sudo apt-get install git 
$ Instalando o php5 e a pdo do postgres para php 
$ sudo apt-get install php5 
$ sudo apt-get install php5-pgsql
Criando o projeto Blog
Criando o projeto Blog 
$ Baixar o Skeleton Application 
cd ~ 
mkdir workspace 
git clone 
git://github.com/zendframework/ZendSkeletonApplication.git 
cp -R ZendSkeletonApplication Blog
Criando o projeto Blog 
$ Baixar o Skeleton Application 
$ cd ~ 
$ mkdir workspace 
$ cd workspace 
$ git clone 
$ git://github.com/zendframework/ZendSkeletonApplication.git 
$ cp -R ZendSkeletonApplication Blog
Criando o projeto Blog 
$ Baixar as dependências do projeto pelo composer 
$ cd Blog 
$ php composer.phar self-update 
$ php composer.phar install
Criando o projeto Blog 
$ Baixar o ZFTool 
$ php composer.phar require zendframework/zftool:dev-master
Criando o projeto Blog 
$ Baixar o phpunit 
$ nano composer.json 
$ Adicionar a dependência do phpunit nos pacotes requeridos 
"require": { 
"php": ">=5.3.3", 
..., 
..., 
"phpunit/phpunit": "4.1.*" 
} 
$ php composer.phar update
Configurando o Banco de dados 
$ Configurando o Banco de dados 
$ global.php 
$ local.php 
$ /config/test.config.php
Criando o módulo Core 
$ cd ~/workspace/Blog 
$ php vendor/zendframework/zftool/zf.php create module core
Criando o módulo Admin 
$ php vendor/zendframework/zftool/zf.php create module core
Configurando os testes para o 
módulo admin 
$ mkdir -p module/Admin/tests/src/Admin 
$ gedit module/Admin/tests/Bootstrap.php 
$ gedit module/Admin/tests/phpunit.xml 
$ mkdir module/Admin/tests/src/Admin/Model 
$ mkdir module/Admin/data 
$ gedit module/Admin/data/test.data.php
Criando os testes da Model User, e 
após, a Model User; 
$ gedit module/Admin/tests/src/Admin/Model/UserTest.php 
$ Executar o teste 
$ php vendor/phpunit/phpunit/phpunit -c module/Admin/tests/phpunit.xml 
$ Criando a model User 
$ gedit module/Admin/src/Admin/Model/User.php 
$ Executar o teste novamente 
$ php vendor/phpunit/phpunit/phpunit -c module/Admin/tests/phpunit.xml
Criando os testes para o Controller Users, o 
Controller Users, seu Form e views; 
$ Criando os testes para o controller User 
$ gedit module/Admin/tests/src/Admin/Controller/UsersControllerTest.php 
$ php vendor/phpunit/phpunit/phpunit -c module/Admin/tests/phpunit.xml 
$ Criando o controller Users 
$ gedit module/Admin/src/Admin/Controller/UsersController.php 
$ Form User 
$ View
Utilizando Session 
$ Adicionando serviço de sessão e 
dependência para o serviço de autenticação 
$ module/Admin/module.conf.php
Criando um serviço de autenticação 
e seus testes; 
$ Teste do Serviço de autenticação 
$ Serviço de autenticação
Criando controller para Autenticação, form e 
testes; 
$ Form de login 
$ Teste AuthController 
$ AuthController 
$ Adicionar AuthController as rotas
Criando controller para Autenticação, form e 
testes; 
$ Form de login 
$ Teste AuthController 
$ AuthController 
$ Adicionar AuthController as rotas
Criando os testes da Model 
Categorie, e após, a Model 
Categorie 
$ Criando os testes para a model Categorie 
$ Criando a model Categorie
Criando os testes para o Controller Categories, o 
Controller Categories, seu Form e views 
$ Criando os testes para o CategoriesController 
$ Criando o Form Categorie 
$ Criando o CategoriesController 
$ Criando as visões do Categories
Criando os testes da Model Post, e 
após, a Model Post 
$ Criando os testes para a model Post 
$ Criando a model post 
$ Criando os testes para o post categories 
$ Criando a model post categories
Criando os testes para o Controller 
Posts, o Controller Posts, seu Form 
e views; 
$ Criando os Tests para o PostsController 
$ Criando o Form Post 
$ Criando o PostsController 
$ Criando as visões do Posts
Criando o módulo main 
$ php vendor/zendframework/zftool/zf.php create module main 
$ Copiar modulo.config.php do módulo admin e mudar onde estiver 
escrito admin para main 
$ Copiar estrutura de testes do module admin, inclusive o test.data.php 
$ mkdir module/Main/data 
$ cp -p module/Admin/data/test.data.php module/Main/data/test.data.php
Criando o IndexController do módulo Main, seu 
teste e exibindo os posts em sua view 
$ Criando o teste do index controller 
$ Criando o index controller 
$ Criando a visão e a partial de paginação
Criando os testes da Model Comment, e após, a 
Model Comment 
$ Criando os testes para a model Comment 
$ Criando a model comment
Criando os testes para o Controller Comments, o 
Controller Comments, seu Form e views; 
$ Criando os testes para o CommentsController 
$ Criando o form dos comentarios 
$ Criando o CommentsController 
$ Adicionando o comments no more do Index do 
main utilizando ajax
Definindo o módulo main como o principal 
$ Recortar do module.config.php do modulo application e colar no modulo main 
'home' => array( 
'type' => 'ZendMvcRouterHttpLiteral', 
'options' => array( 
'route' => '/', 
'defaults' => array( 
'controller' => 'MainControllerIndex', 
'action' => 'index', 
), 
), 
), 
$ Mover view auxiliares 
$ mv module/Application/ew/error/ module/Main/view/error 
$ mv module/Application/view/layout/ module/Main/view/layout
Definindo o módulo main como o principal 
$ Adicionar view manager no modulo.config.php do modulo main e deixar em branco o do modulo application 
'view_manager' => array( 
'display_not_found_reason' => true, 
'display_exceptions' => true, 
'doctype' => 'HTML5', 
'not_found_template' => 'error/404', 
'exception_template' => 'error/index', 
'template_map' => array( 
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 
'main/index/index' => __DIR__ . '/../view/main/index/index.phtml', 
'error/404' => __DIR__ . '/../view/error/404.phtml', 
'error/index' => __DIR__ . '/../view/error/index.phtml', 
), 
$ Alterar layout
ViewHelper de sessão 
$ module/Core/src/Core/View/Helper/Session.php 
$ Adicionar helper no module.config.php do 
Modulo Core 
$ Criando menu de acordo com o perfil de usuário 
autenticado
Adicionar join com a entity user na query de posts 
no IndexController do módulo main 
$ module/Main/src/Main/Controller/IndexController.php
ACLs 
$ Adicionando listeners 
$ module/Admin/Module.php 
$ Adicionar teste authorize no service Auth 
$ Configurando roles, resources e privelegies no 
global.php
ACLs 
$ Construir às ACLs no arquivo 
moduleCoresrcCoreAclBuilder.php 
$ Adicionar o método authorize no Service 
AdminAuth.php 
$ Executar os testes 
$ Adicionar AuthController como rota padrão do modulo 
Admin
Referências 
$ Zend Framework 2 na prática; Minetto; 2012 
$ http://framework.zend.com/manual 
$ Enrico Zimuel Senior Software Engineer, Zend 
Framework Core Team

ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2

  • 1.
    Desenvolvendo um Blogcom Zend Framework 2 $ Cezar Junior de Souza - 2014
  • 2.
    Quem sou eu? $ Bacharel em Sistemas de Informação; $ Especialista em Engenharia e Qualidade de Software; $ Programador Web desde 2010; $ Mais informações: LinkeDin
  • 3.
    Cronograma $ Visãogeral do ZF2; $ Principais características do ZF2; $ Preparando o Ambiente de desenvolvimento; $ Criando o projeto Blog com ZF2; $ Configurando o banco de dados postgresql; $ Criando o module Core; $ Criando o module Admin; $ Configurando o module Admin e seus Testes; $ Criando os testes da Model User, e após, a Model User; $ Criando os testes para o Controller Users, o Controller Users, seu Form e views;
  • 4.
    Cronograma $ UtilizandoSession; $ Criando um serviço de autenticação e seus testes; $ Criando controller para Autenticação, form e testes; $ Criando os testes da Model Categorie, e após, a Model Categorie; $ Criando os testes para o Controller Categories, o Controller Categories, seu Form e views; $ Criando os testes da Model Post, e após, a Model Post; $ Criando os testes para o Controller Posts, o Controller Posts, seu Form e views; $ Criando o módulo main $ Criando o IndexController do módulo Main, seu teste e exibindo os posts em sua view;
  • 5.
    Cronograma $ Criandoos testes da Model Comment, e após, a Model Comment; $ Criando os testes para o Controller Comments, o Controller Comments, seu Form e views; $ Fazendo comentários por Ajax; $ Definindo o módulo Main como o módulo principal; $ Criando o layout para o blog; $ Criando ViewHelper de sessão; $ Alterando menu de acordo com a role do usuário autenticado; $ Adicionar join com a entity user na query de posts no IndexController do módulo main $ Exibir dados do usuário que criou o post na view do IndexController do módulo main;
  • 6.
    Cronograma $ Criandoo controle de acesso com ACLs;
  • 7.
    Visão geral doZF2 $ O que é um Framework?
  • 8.
    Visão geral doZF2 $ Um pouco da história do Zend Framework
  • 9.
    Visão geral doZF2 $ Por que usar o ZF2? ● É modular e funciona como blocos de concreto que podem ser usados peça por peça com outras aplicações ou frameworks; ● Extensível: fácil de adaptar o framework para suas necessidades; ● Alta performasse: Projetado pensando em desempenho; ● Segurança: Todas as criptografias de segurança que você precisa; ● Comunidade: Uma extensa comunidade e uma grande base de colaboradores e usuários; ● Pronto para o negócio: Uma história de sucesso provada e executada em aplicações de alto uso e negócio critico.
  • 10.
    Visão geral doZF2 $ Sistema de Autoloading $ Namespaces: namespace ModuleFolder; namespace AdminModel; namespace ClienteController; $ Class-Maps No arquivo autoload_classmap.php do módulo: return array( 'MinhaClasse1' => 'minha_classe1.php', 'MinhaClasse2' => 'minha_classe2.php', );
  • 11.
    Visão geral doZF2 $ Dependency injection (Di) $ é um design pattern com o proposito de diminuir o acoplamento entre os componentes do software.
  • 12.
    Visão geral doZF2 $ Dependency injection (Di) $ Sem DI class Foo { protected $bar; … public function _construct(){ $this->bar = new Bar(); } ... } Contras: Dificuldades para os testes Código não isolado Dificuldade para reusar o código $ Com DI class Foo { protected $bar; … public function _construct(Bar $bar){ $this->bar = $bar; } ... } Pros: Facilidade nos testes Flexibilidade na arquitetura
  • 13.
    Visão geral doZF2 $ Gerenciador de eventos
  • 14.
    Visão geral doZF2 $ Table Gateway
  • 15.
    Visão geral doZF2 $ O novo MVC do ZF2
  • 16.
    Visão geral doZF2 $ Modulos
  • 17.
    Preparando o Ambientede desenvolvimento ATENÇÃO Este processo de configuração do Ambiente de desenvolvimento irá funcionar nas versões do Ubuntu acima da 12.04, foi testado até a 14.04.
  • 18.
    Preparando o Ambientede desenvolvimento $ sudo apt-get moo (__) (oo) /------/ / | || * /---/ ~~ ~~ ..."Have you mooed today?"...
  • 19.
    Preparando o Ambientede desenvolvimento $ Instalando o sublime text 3 $ sudo add-apt-repository ppa:webupd8team/sublime-text-3 $ sudo apt-get update $ sudo apt-get install sublime-text-installer
  • 20.
    Preparando o Ambientede desenvolvimento $ Instalando o postgresql e seu cliente pgadmin3 $ sudo apt-get install postgresql $ sudo apt-get install pgadmin3 $ Alterando a senha do usuário postgres $ sudo -su postgres $ psql template1 template1=# ALTER USER postgres WITH PASSWORD 'root';
  • 21.
    Preparando o Ambientede desenvolvimento $ Instalando o git $ sudo apt-get install git $ Instalando o php5 e a pdo do postgres para php $ sudo apt-get install php5 $ sudo apt-get install php5-pgsql
  • 22.
  • 23.
    Criando o projetoBlog $ Baixar o Skeleton Application cd ~ mkdir workspace git clone git://github.com/zendframework/ZendSkeletonApplication.git cp -R ZendSkeletonApplication Blog
  • 24.
    Criando o projetoBlog $ Baixar o Skeleton Application $ cd ~ $ mkdir workspace $ cd workspace $ git clone $ git://github.com/zendframework/ZendSkeletonApplication.git $ cp -R ZendSkeletonApplication Blog
  • 25.
    Criando o projetoBlog $ Baixar as dependências do projeto pelo composer $ cd Blog $ php composer.phar self-update $ php composer.phar install
  • 26.
    Criando o projetoBlog $ Baixar o ZFTool $ php composer.phar require zendframework/zftool:dev-master
  • 27.
    Criando o projetoBlog $ Baixar o phpunit $ nano composer.json $ Adicionar a dependência do phpunit nos pacotes requeridos "require": { "php": ">=5.3.3", ..., ..., "phpunit/phpunit": "4.1.*" } $ php composer.phar update
  • 28.
    Configurando o Bancode dados $ Configurando o Banco de dados $ global.php $ local.php $ /config/test.config.php
  • 29.
    Criando o móduloCore $ cd ~/workspace/Blog $ php vendor/zendframework/zftool/zf.php create module core
  • 30.
    Criando o móduloAdmin $ php vendor/zendframework/zftool/zf.php create module core
  • 31.
    Configurando os testespara o módulo admin $ mkdir -p module/Admin/tests/src/Admin $ gedit module/Admin/tests/Bootstrap.php $ gedit module/Admin/tests/phpunit.xml $ mkdir module/Admin/tests/src/Admin/Model $ mkdir module/Admin/data $ gedit module/Admin/data/test.data.php
  • 32.
    Criando os testesda Model User, e após, a Model User; $ gedit module/Admin/tests/src/Admin/Model/UserTest.php $ Executar o teste $ php vendor/phpunit/phpunit/phpunit -c module/Admin/tests/phpunit.xml $ Criando a model User $ gedit module/Admin/src/Admin/Model/User.php $ Executar o teste novamente $ php vendor/phpunit/phpunit/phpunit -c module/Admin/tests/phpunit.xml
  • 33.
    Criando os testespara o Controller Users, o Controller Users, seu Form e views; $ Criando os testes para o controller User $ gedit module/Admin/tests/src/Admin/Controller/UsersControllerTest.php $ php vendor/phpunit/phpunit/phpunit -c module/Admin/tests/phpunit.xml $ Criando o controller Users $ gedit module/Admin/src/Admin/Controller/UsersController.php $ Form User $ View
  • 34.
    Utilizando Session $Adicionando serviço de sessão e dependência para o serviço de autenticação $ module/Admin/module.conf.php
  • 35.
    Criando um serviçode autenticação e seus testes; $ Teste do Serviço de autenticação $ Serviço de autenticação
  • 36.
    Criando controller paraAutenticação, form e testes; $ Form de login $ Teste AuthController $ AuthController $ Adicionar AuthController as rotas
  • 37.
    Criando controller paraAutenticação, form e testes; $ Form de login $ Teste AuthController $ AuthController $ Adicionar AuthController as rotas
  • 38.
    Criando os testesda Model Categorie, e após, a Model Categorie $ Criando os testes para a model Categorie $ Criando a model Categorie
  • 39.
    Criando os testespara o Controller Categories, o Controller Categories, seu Form e views $ Criando os testes para o CategoriesController $ Criando o Form Categorie $ Criando o CategoriesController $ Criando as visões do Categories
  • 40.
    Criando os testesda Model Post, e após, a Model Post $ Criando os testes para a model Post $ Criando a model post $ Criando os testes para o post categories $ Criando a model post categories
  • 41.
    Criando os testespara o Controller Posts, o Controller Posts, seu Form e views; $ Criando os Tests para o PostsController $ Criando o Form Post $ Criando o PostsController $ Criando as visões do Posts
  • 42.
    Criando o módulomain $ php vendor/zendframework/zftool/zf.php create module main $ Copiar modulo.config.php do módulo admin e mudar onde estiver escrito admin para main $ Copiar estrutura de testes do module admin, inclusive o test.data.php $ mkdir module/Main/data $ cp -p module/Admin/data/test.data.php module/Main/data/test.data.php
  • 43.
    Criando o IndexControllerdo módulo Main, seu teste e exibindo os posts em sua view $ Criando o teste do index controller $ Criando o index controller $ Criando a visão e a partial de paginação
  • 44.
    Criando os testesda Model Comment, e após, a Model Comment $ Criando os testes para a model Comment $ Criando a model comment
  • 45.
    Criando os testespara o Controller Comments, o Controller Comments, seu Form e views; $ Criando os testes para o CommentsController $ Criando o form dos comentarios $ Criando o CommentsController $ Adicionando o comments no more do Index do main utilizando ajax
  • 46.
    Definindo o módulomain como o principal $ Recortar do module.config.php do modulo application e colar no modulo main 'home' => array( 'type' => 'ZendMvcRouterHttpLiteral', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'MainControllerIndex', 'action' => 'index', ), ), ), $ Mover view auxiliares $ mv module/Application/ew/error/ module/Main/view/error $ mv module/Application/view/layout/ module/Main/view/layout
  • 47.
    Definindo o módulomain como o principal $ Adicionar view manager no modulo.config.php do modulo main e deixar em branco o do modulo application 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'main/index/index' => __DIR__ . '/../view/main/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), $ Alterar layout
  • 48.
    ViewHelper de sessão $ module/Core/src/Core/View/Helper/Session.php $ Adicionar helper no module.config.php do Modulo Core $ Criando menu de acordo com o perfil de usuário autenticado
  • 49.
    Adicionar join coma entity user na query de posts no IndexController do módulo main $ module/Main/src/Main/Controller/IndexController.php
  • 50.
    ACLs $ Adicionandolisteners $ module/Admin/Module.php $ Adicionar teste authorize no service Auth $ Configurando roles, resources e privelegies no global.php
  • 51.
    ACLs $ Construiràs ACLs no arquivo moduleCoresrcCoreAclBuilder.php $ Adicionar o método authorize no Service AdminAuth.php $ Executar os testes $ Adicionar AuthController como rota padrão do modulo Admin
  • 52.
    Referências $ ZendFramework 2 na prática; Minetto; 2012 $ http://framework.zend.com/manual $ Enrico Zimuel Senior Software Engineer, Zend Framework Core Team