SEU FRAMEWORK
É MELHOR PRA QUÊ?
Jaime da Costa Pereira Neto
JAIME NETO
● Graduado em Telemática pelo CEFET-PB (atual IFPB)
● Especialista em Desenvolvimento de Software para Web pela UNIBRATEC
(atual Estácio)
● Zend Certified Engineer - Zend Framework 1
● Analista de Sistemas no Instituto Chico Mendes de Conservação da
Biodiversidade (ICMBio)
● Programador PHP desde 2004
● Membro do PHP-PB desde os primórdios
Vivemos em um mundo polarizado...
em que muitos acreditam que só pode existir
um melhor...
automaticamente o resto é perda de tempo...
e tudo é 100% bom ou 100% ruim...
em todos os aspectos de nossas vidas...
claro que os frameworks não ficam de fora!
Ficam as questões:
● Será que todos os frameworks são apenas
implementações diferentes para um mesmo fim?
● Os objetivos deles são os mesmos?
● Quais são melhores e em que aspectos?
● Existe um framework “bala de prata” que resolva todos
os problemas?
Como desmistificar isso?
/php-pb/Sua-escolha
Proposta para a comunidade:
● Implementar um mesmo projeto em vários frameworks, a partir de
um modelo padrão
● Promover a comparação entre os frameworks existentes
● Criar um modelo padrão para implementação de futuros projetos
● Tirar dúvidas básicas de configuração e implementação
● Ideia de Abdala Cerqueira, criada em 2012
Mas isso é suficiente?
Comparação difícil quando temos:
● Programadores diferentes
● Estilos de codificação diferentes
● Apenas código
● Sem orientação da lógica utilizada
● Versões obsoletas depois de um tempo
O que fazer, então?
● Estudar os frameworks
● Definir os aspectos a serem levados em conta
● Definir um projeto básico a ser implementado neles
● Utilizar apenas o que eles oferecem
● Usar bibliotecas externas apenas se estiver explícito
na documentação
● Botar a mão na massa!
O projeto
● Um BLOG
● 3 tipos de usuários (admin, user e guest)
● Posts
● Comentários
● Área administrativa
● Validação por email
Os aspectos
● Instalação
● Configurações
● Acesso ao BD
● Template engine
● Rotas
● Autenticação
● Autorização
● Documentação
● Formulários
● Validação
● Envio de Emails
● Paginação
● Tradução de textos
● Migrations
Frameworks escolhidos
?
5.8.17 3.4.3 3 4.3.3
Mão na massa!
Criando o projeto
composer create-project laravel/laravel blog --prefer-dist
Framework completo instalado, com todos os pacotes
Deve ser instalado como uma extensão do PHP.
phalcon project blog simple --template-engine=volt
composer create-project -s dev zendframework/skeleton-application blog
Pacotes adicionais devem ser instalados conforme necessário
composer create-project -s dev zendframework/zendframework blog → Framework completo, com todos os pacotes
composer create-project symfony/skeleton blog
Pacotes adicionais devem ser instalados conforme necessário
Ferramentas RAD
artisan
e o tinker!!!
Instalado separadamente, via git ou download
devtools
zendtool
composer require symfony/console
console
Servidor embutido
php artisan serve
phalcon serve
composer serve
composer require server --dev
php bin/console server:run
Models e controllers
php artisan make:model Post -m
php artisan make:controller PostController --resource
phalcon scaffold posts --get-set --template-engine=volt 😃
Faz na mão mesmo… 😖
composer require maker-bundle --dev
php bin/console make:entity
php bin/console make:controller PostController
Consulta no BD com paginação
$posts = Post::orderBy('id', 'desc')->paginate(10); 😍
$posts = Posts::find(['order' => 'id desc']);
$paginator = new Paginator(['data' => $posts, 'limit'=> 10, 'page' => $page]);
$paginator->getPaginate();
require zendframework/zend-db composer require zendframework/zend-paginator
$posts = new Select('posts')->order('id desc');
$paginator = new Paginator(new AdapterArrayAdapter($posts));
$paginator->setItemCountPerPage(10)->setCurrentPageNumber($page); 😩
composer require symfony/orm-pack Dentro da classe PostRepository:
$this->createQueryBuilder('p')->orderBy('p.id', 'desc')->setFirstResult($limit * ($page - 1))
->setMaxResults($limit)->getQuery()->getResult();
Template engine
blade {!! $post->title !!} {{ ... }} {{-- … --}} @if ... @endif
volt {{ post.title|e }} {% … %} {# … #}
ou phtml
phtml <?= $this->escapeHtml($post->title) ?> <?php … ?>
flexível para utilizar outros
composer require template
twig {{ post.title|e }} {% … %} {# … #}
Rotas
Route::get('/foo', 'FooController@index')->name('foo.index');
Route::post('/bar', 'BarController@index')->name('bar.index');
$router->add('/foo', ['controller' => 'foo', 'action' => 'index' ]);
$router->add('/bar', ['controller' => 'bar', 'action' => 'index' ]);
composer require zendframework/zend-router
$router->addRoute('foo', Method::factory(['route' => '/foo',
'verb' => 'post,get', 'defaults' => ['controller' => 'foo', 'action' => 'index']]));
composer require annotations
/** @Route('/foo', name='foo_index') */ 😃
Pode restringir o protocolo HTTP se definido em routes.yaml
Autenticação
php artisan make:auth 😎
Cria cadastro e recuperação de senha, login, formulários, rotas e já deixa preparada a
estrutura para validação de e-mail
Limita-se a oferecer algumas ferramentas para gerenciamento de sessão, e geração/
verificação de senha. Exige que criemos praticamente toda a lógica de autenticação. 😒
composer require zendframework/zend-authenticator
Apesar de poderoso, não é nem um pouco prático e exige muita configuração e o uso de
muitas classes (MUITO CÓDIGO). 😱
composer require maker-bundle --dev
php bin/console make:auth e responde algumas perguntas 😄
Cria cadastro, login, formulários e rotas
Autorização
Policies 😍
php artisan make:policy PostPolicy --model=Post
ACL - Lista de Controle de Acesso
RBAC - Controle de acesso baseado em papéis
ACL - Lista de Controle de Acesso
composer require symfony/security-bundle
security.yaml, inserção em código ou annotations 😃
Migrations
php artisan make:seeder PostsSeeder
php artisan db:seed
Faker - Criação de conteúdo aleatório 😉
phalcon migration generate 😍
phalcon migration run
Classes versionadas
Faz na mão mesmo… 😒
composer require --dev doctrine/doctrine-fixtures-bundle
php bin/console make:fixtures
php bin/console doctrine:fixtures:load
Tradução de textos
{{ __('Translate this') }}
Fácil de encontrar pacotes de tradução prontos
Diferencia tradução de atributos e textos em geral
Bastante personalizável
Exige um pouco de configuração 😓
Organizado e simples de usar
composer require zendframework/zend-mvc-i18n
Bastante flexível e personalizável
composer require symfony/translation
{{ 'Translate this'|trans }} ou {% trans %} Translate this {% endtrans %}
php bin/console translation:update --dump-messages --output-format=yaml --force pt 😍
Visão geral
Configuração Simples e organizada.
Documentação Excelente na maior parte, mas contém algumas falhas.
Estrutura de pastas Padrão simples, não muito flexível.
Formulários Validação prática. Segurança contra CSRF. Não oferece,
nativamente, ferramentas para gerar campos do formulário.
Paginação Super simples de implementar, oferece diversos tipos.
E-mails Oferece uma API bastante simples e fácil de implementar.
Comunidade Enorme e extremamente ativa.
Extremamente prático e produtivo
Pouca codificação
Visão geral
Configuração Simples e organizada.
Documentação Incompleta e muitas vezes confusa. Deficiente nas traduções.
Estrutura de pastas Padrão simples, bastante flexível e personalizável.
Formulários Muitos recursos de validação, nem sempre muito práticos.
Segurança contra CSRF. Geração de campos de formulário.
Paginação Ferramenta simples. Não oferece template pronto.
E-mails Não oferece uma API própria.
Comunidade Modesta, mas vem crescendo.
Extremamente performático
Instalação e atualização de versão
podem ser complicadas
Visão geral
Configuração Complicada, exige criação de muitas classes, muito código.
Documentação Bastante completa, mas poderia ter mais exemplos práticos.
Estrutura de pastas Bastante flexível e personalizável.
Formulários Ferramenta para criação poderosa. Muitas ferramentas para
validação e filtros.
Paginação Ferramenta robusta. Não oferece template pronto.
E-mails Ferramenta com diversas classes de transporte.
Comunidade Muito grande, mas vem perdendo espaço.
Muito robusto e completo
Código muito bem testado
Adequado para sistemas muito grandes
Visão geral
Configuração Simples e organizada.
Documentação Bastante completa, com bons exemplos práticos.
Estrutura de pastas Padrão simples, não muito flexível.
Formulários Ferramenta para criação poderosa. Muitas ferramentas para
validação e filtros. Segurança contra CSRF.
Paginação Não oferece uma API própria.
E-mails Utiliza o SwiftMailer (API própria em desenvolvimento)
Comunidade Muito grande e ativa.
Muito robusto, flexível e produtivo
Faz bastante uso de ferramentas externas consolidadas
Diferenciais
Produtividade
Performance
Controle
Flexibilidade
● Gera muita coisa automática
● Foco nas regras de negócio
● Código compilado
● Não precisa ser interpretado
● Nada acontece sem que você saiba como
● Permite instalar apenas o que precisar
● Permite instalar apenas o que precisar
● Aproveita o melhor de outras ferramentas
Conclusão
● Não existe “bala de prata”!
● A escolha por um framework vai depender de:
○ Tamanho e necessidades do projeto
○ Tamanho e experiência da equipe
○ Exigências de performance
○ Acesso ao servidor e suas configurações
○ Importância do controle
○ Interação com outras ferramentas
○ Tempo disponível
Depois dessa trabalheira toda… compartilhar!
● Especificações do projeto
● Orientações de instalação
● Passo-a-passo da implementação
● Resumo de cada framework
● Comparação e conclusões
AGUARDEM!
Dúvidas?
jaime neto
contato@jaimeneto.com
http://jaimeneto.com
@jaimecpn
OBRIGADO!

Seu framework é melhor pra quê?

  • 1.
    SEU FRAMEWORK É MELHORPRA QUÊ? Jaime da Costa Pereira Neto
  • 2.
    JAIME NETO ● Graduadoem Telemática pelo CEFET-PB (atual IFPB) ● Especialista em Desenvolvimento de Software para Web pela UNIBRATEC (atual Estácio) ● Zend Certified Engineer - Zend Framework 1 ● Analista de Sistemas no Instituto Chico Mendes de Conservação da Biodiversidade (ICMBio) ● Programador PHP desde 2004 ● Membro do PHP-PB desde os primórdios
  • 3.
    Vivemos em ummundo polarizado...
  • 4.
    em que muitosacreditam que só pode existir um melhor...
  • 5.
    automaticamente o restoé perda de tempo...
  • 6.
    e tudo é100% bom ou 100% ruim...
  • 7.
    em todos osaspectos de nossas vidas...
  • 8.
    claro que osframeworks não ficam de fora!
  • 9.
    Ficam as questões: ●Será que todos os frameworks são apenas implementações diferentes para um mesmo fim? ● Os objetivos deles são os mesmos? ● Quais são melhores e em que aspectos? ● Existe um framework “bala de prata” que resolva todos os problemas?
  • 10.
    Como desmistificar isso? /php-pb/Sua-escolha Propostapara a comunidade: ● Implementar um mesmo projeto em vários frameworks, a partir de um modelo padrão ● Promover a comparação entre os frameworks existentes ● Criar um modelo padrão para implementação de futuros projetos ● Tirar dúvidas básicas de configuração e implementação ● Ideia de Abdala Cerqueira, criada em 2012
  • 11.
    Mas isso ésuficiente? Comparação difícil quando temos: ● Programadores diferentes ● Estilos de codificação diferentes ● Apenas código ● Sem orientação da lógica utilizada ● Versões obsoletas depois de um tempo
  • 12.
    O que fazer,então? ● Estudar os frameworks ● Definir os aspectos a serem levados em conta ● Definir um projeto básico a ser implementado neles ● Utilizar apenas o que eles oferecem ● Usar bibliotecas externas apenas se estiver explícito na documentação ● Botar a mão na massa!
  • 13.
    O projeto ● UmBLOG ● 3 tipos de usuários (admin, user e guest) ● Posts ● Comentários ● Área administrativa ● Validação por email
  • 14.
    Os aspectos ● Instalação ●Configurações ● Acesso ao BD ● Template engine ● Rotas ● Autenticação ● Autorização ● Documentação ● Formulários ● Validação ● Envio de Emails ● Paginação ● Tradução de textos ● Migrations
  • 15.
  • 16.
  • 17.
    Criando o projeto composercreate-project laravel/laravel blog --prefer-dist Framework completo instalado, com todos os pacotes Deve ser instalado como uma extensão do PHP. phalcon project blog simple --template-engine=volt composer create-project -s dev zendframework/skeleton-application blog Pacotes adicionais devem ser instalados conforme necessário composer create-project -s dev zendframework/zendframework blog → Framework completo, com todos os pacotes composer create-project symfony/skeleton blog Pacotes adicionais devem ser instalados conforme necessário
  • 18.
    Ferramentas RAD artisan e otinker!!! Instalado separadamente, via git ou download devtools zendtool composer require symfony/console console
  • 19.
    Servidor embutido php artisanserve phalcon serve composer serve composer require server --dev php bin/console server:run
  • 20.
    Models e controllers phpartisan make:model Post -m php artisan make:controller PostController --resource phalcon scaffold posts --get-set --template-engine=volt 😃 Faz na mão mesmo… 😖 composer require maker-bundle --dev php bin/console make:entity php bin/console make:controller PostController
  • 21.
    Consulta no BDcom paginação $posts = Post::orderBy('id', 'desc')->paginate(10); 😍 $posts = Posts::find(['order' => 'id desc']); $paginator = new Paginator(['data' => $posts, 'limit'=> 10, 'page' => $page]); $paginator->getPaginate(); require zendframework/zend-db composer require zendframework/zend-paginator $posts = new Select('posts')->order('id desc'); $paginator = new Paginator(new AdapterArrayAdapter($posts)); $paginator->setItemCountPerPage(10)->setCurrentPageNumber($page); 😩 composer require symfony/orm-pack Dentro da classe PostRepository: $this->createQueryBuilder('p')->orderBy('p.id', 'desc')->setFirstResult($limit * ($page - 1)) ->setMaxResults($limit)->getQuery()->getResult();
  • 22.
    Template engine blade {!!$post->title !!} {{ ... }} {{-- … --}} @if ... @endif volt {{ post.title|e }} {% … %} {# … #} ou phtml phtml <?= $this->escapeHtml($post->title) ?> <?php … ?> flexível para utilizar outros composer require template twig {{ post.title|e }} {% … %} {# … #}
  • 23.
    Rotas Route::get('/foo', 'FooController@index')->name('foo.index'); Route::post('/bar', 'BarController@index')->name('bar.index'); $router->add('/foo',['controller' => 'foo', 'action' => 'index' ]); $router->add('/bar', ['controller' => 'bar', 'action' => 'index' ]); composer require zendframework/zend-router $router->addRoute('foo', Method::factory(['route' => '/foo', 'verb' => 'post,get', 'defaults' => ['controller' => 'foo', 'action' => 'index']])); composer require annotations /** @Route('/foo', name='foo_index') */ 😃 Pode restringir o protocolo HTTP se definido em routes.yaml
  • 24.
    Autenticação php artisan make:auth😎 Cria cadastro e recuperação de senha, login, formulários, rotas e já deixa preparada a estrutura para validação de e-mail Limita-se a oferecer algumas ferramentas para gerenciamento de sessão, e geração/ verificação de senha. Exige que criemos praticamente toda a lógica de autenticação. 😒 composer require zendframework/zend-authenticator Apesar de poderoso, não é nem um pouco prático e exige muita configuração e o uso de muitas classes (MUITO CÓDIGO). 😱 composer require maker-bundle --dev php bin/console make:auth e responde algumas perguntas 😄 Cria cadastro, login, formulários e rotas
  • 25.
    Autorização Policies 😍 php artisanmake:policy PostPolicy --model=Post ACL - Lista de Controle de Acesso RBAC - Controle de acesso baseado em papéis ACL - Lista de Controle de Acesso composer require symfony/security-bundle security.yaml, inserção em código ou annotations 😃
  • 26.
    Migrations php artisan make:seederPostsSeeder php artisan db:seed Faker - Criação de conteúdo aleatório 😉 phalcon migration generate 😍 phalcon migration run Classes versionadas Faz na mão mesmo… 😒 composer require --dev doctrine/doctrine-fixtures-bundle php bin/console make:fixtures php bin/console doctrine:fixtures:load
  • 27.
    Tradução de textos {{__('Translate this') }} Fácil de encontrar pacotes de tradução prontos Diferencia tradução de atributos e textos em geral Bastante personalizável Exige um pouco de configuração 😓 Organizado e simples de usar composer require zendframework/zend-mvc-i18n Bastante flexível e personalizável composer require symfony/translation {{ 'Translate this'|trans }} ou {% trans %} Translate this {% endtrans %} php bin/console translation:update --dump-messages --output-format=yaml --force pt 😍
  • 28.
    Visão geral Configuração Simplese organizada. Documentação Excelente na maior parte, mas contém algumas falhas. Estrutura de pastas Padrão simples, não muito flexível. Formulários Validação prática. Segurança contra CSRF. Não oferece, nativamente, ferramentas para gerar campos do formulário. Paginação Super simples de implementar, oferece diversos tipos. E-mails Oferece uma API bastante simples e fácil de implementar. Comunidade Enorme e extremamente ativa. Extremamente prático e produtivo Pouca codificação
  • 29.
    Visão geral Configuração Simplese organizada. Documentação Incompleta e muitas vezes confusa. Deficiente nas traduções. Estrutura de pastas Padrão simples, bastante flexível e personalizável. Formulários Muitos recursos de validação, nem sempre muito práticos. Segurança contra CSRF. Geração de campos de formulário. Paginação Ferramenta simples. Não oferece template pronto. E-mails Não oferece uma API própria. Comunidade Modesta, mas vem crescendo. Extremamente performático Instalação e atualização de versão podem ser complicadas
  • 30.
    Visão geral Configuração Complicada,exige criação de muitas classes, muito código. Documentação Bastante completa, mas poderia ter mais exemplos práticos. Estrutura de pastas Bastante flexível e personalizável. Formulários Ferramenta para criação poderosa. Muitas ferramentas para validação e filtros. Paginação Ferramenta robusta. Não oferece template pronto. E-mails Ferramenta com diversas classes de transporte. Comunidade Muito grande, mas vem perdendo espaço. Muito robusto e completo Código muito bem testado Adequado para sistemas muito grandes
  • 31.
    Visão geral Configuração Simplese organizada. Documentação Bastante completa, com bons exemplos práticos. Estrutura de pastas Padrão simples, não muito flexível. Formulários Ferramenta para criação poderosa. Muitas ferramentas para validação e filtros. Segurança contra CSRF. Paginação Não oferece uma API própria. E-mails Utiliza o SwiftMailer (API própria em desenvolvimento) Comunidade Muito grande e ativa. Muito robusto, flexível e produtivo Faz bastante uso de ferramentas externas consolidadas
  • 32.
    Diferenciais Produtividade Performance Controle Flexibilidade ● Gera muitacoisa automática ● Foco nas regras de negócio ● Código compilado ● Não precisa ser interpretado ● Nada acontece sem que você saiba como ● Permite instalar apenas o que precisar ● Permite instalar apenas o que precisar ● Aproveita o melhor de outras ferramentas
  • 33.
    Conclusão ● Não existe“bala de prata”! ● A escolha por um framework vai depender de: ○ Tamanho e necessidades do projeto ○ Tamanho e experiência da equipe ○ Exigências de performance ○ Acesso ao servidor e suas configurações ○ Importância do controle ○ Interação com outras ferramentas ○ Tempo disponível
  • 34.
    Depois dessa trabalheiratoda… compartilhar! ● Especificações do projeto ● Orientações de instalação ● Passo-a-passo da implementação ● Resumo de cada framework ● Comparação e conclusões AGUARDEM!
  • 35.
  • 36.