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 Module\Folder;namespace Admin\Model;namespace Cliente\Controller;
$ Class-MapsNo 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 DIclass Foo {
protected $bar;…public function _construct(){
$this->bar = new Bar();}...
}Contras:
Dificuldades para os testesCódigo não isoladoDificuldade para reusar o código
$ Com DIclass Foo {
protected $bar;…public function _construct(Bar $bar){
$this->bar = $bar;}...
}Pros:
Facilidade nos testesFlexibilidade 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 template1template1=# 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 workspacegit clone git://github.com/zendframework/ZendSkeletonApplication.gitcp -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' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'controller' => 'Main\Controller\Index',
'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 module\Core\src\Core\Acl\Builder.php
$ Adicionar o método authorize no Service Admin\Auth.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