Post on 05-Dec-2014
description
Flisol 2009 - Aracaju/SE
Framework OO para PHP 5Framework OO para PHP 5
Palestrante: Lucas Augusto Carvalholucasaugustomcc@gmail.com
2
Sobre mim
Formando em Ciência da Computação na Universidade Federal de Sergipe;
Desenvolvedor Web desde 2000; Programador PHP desde 2003; Utiliza o symfony desde 2008; Criador do site www.vestibularseriado.com.br Está desenvolvendo a nova versão do site
utilizando o framework symfony; Realiza iniciação científica e TCC na área de
usabilidade para TV Digital.
3
Roteiro
Introdução e conceito de framework; Características e estrutura do Symfony; MVC e ORM; CLI (command line interface); Links, roteamento e caching; Criação e validação de formulários; Scaffolding; Plugins e integração com Ajax; Depuração, Testes e Implantação; Comunidade Symfony;
4
Indrodução ao Symfony
Fabien Potencier - Sensio Labs – empresa francesa; Versão 1.2; Licença MIT; Escrito em PHP5 (orientado a objetos); Utiliza padrão MVC (Model/View/Controller); Possui framework de teste unitário e funcional; Suporte para ambiente e implantação; Segurança (proteção XSS por padrão); Extensível (sistema de plugins).
5
É uma “base” de onde se pode desenvolver algo maior ou mais específico.
É uma coleção de códigos-fonte, classes, funções, técnicas e metodologias integradas à um ambiente centralizador que facilitam o desenvolvimento e manutenção de aplicações.
Conceito de Framework
6
Conceito de Framework
Qual a vantagem?$ Passado o período inicial de familiarização
com a ferramenta, as vantagens começam a aparecer;
Como todos os desenvolvedores de uma mesma equipe usam um determinado framework, programam usando as mesmas convenções, classes e bibliotecas, a manutenção de um programa fica muito mais ágil (produtividade);
Encoraja o bom projeto e permite que se utilize facilmente boas práticas.
7
Conceito de Framework
Qual a vantagem?Abstrai-se as tarefas mais repetitivas,
permitindo a concentração de esforços na regras do negócio;
KISS - Keep It Simple Stupid (simplifique);DRY – Don’t Repeat Yourself (não se repita)
Deixe de repetir códigos comuns em módulos de um mesmo sistema CRUD;
Facilidade na geração de testes automatizados;
Geração de documentação;
8
Conceito de Framework
Uso de tecnologias embutidas: MVC ActiveRecord: Abstrai o programador de
conhecer a fundo uma linguagem de manipulação de dados, como a SQL, além de manter toda a aplicação desenvolvida no paradigma orientado a objetos;
AJAX; Internacionalização;
9
Menos código
menos complexidade
menos erros
maior produtividade
mais tempo
Desenvolvimento mais rápido
Cada linha tem um custoPara escreverPara testarPara manter
Escrever menosArquitetura: controlador, ORM,… ConfiguraçãoAutoloadingGeneratorsHelpers
Mais tempo para as regras de negócio...
10
Principais benefícios do Symfony
Documentação Configurabilidade Proteção XSS Ferramentas de Depuração Testes funcionais Extensibilidade: Plugins Admin Generator ORM : Propel ou Doctrine i18n / l10n Versão 1.0 mantida por longo tempo
Padrões
PHP 5MVC
RouteamentoCache
11
Instalação do Symfony
PEAR (PHP Extension and Application Repository)$ pear channel-discover pear.symfony-project.com$ pear install symfony/symfony-1.2.1
• Apache com mod_rewrite• PHP5.2.x
SVN (controle de versão)$ svn propedit svn:externalssymfony http://svn.symfony-project.com/branches/1.2.1
Sandbox (pacote pronto)$ curl -O http://www.symfony-project.com/get/sf_sandbox-1.2.1.tgz$ tar zxpf sf_sandbox-1.2.1.tgz
PEAR packageSubversion
PackageSandbox
12
Dependências
Dependências mínimas, tudo incluído
CreoleAbstração de banco de dadosSuporte a MySQL, PostgreSQL, SQLite, MSSQL ...
Propel / DoctrineObject Relationship Mapping (ORM)
PakeBiblioteca para tarefas de comando de linha.
LimeBiblioteca para testes de unidade e funcionais.
13
Dependências
Dependências mínimas, tudo incluído
Mais...PrototypeScript.aculo.usTinyMCE(WYSIWYG) DynArch.com Rich Calendar
14
• Cria automaticamente o básico do módulo;
• Auxilia na manutenção;
• Execução dos testes;
• Fácil de checar se tudo ocorreu certo;
Command line interface (CLI)
$ symfony generate:module frontend default>> dir+ ~/myproject/apps/frontend/modules/default/actions>> file+ ~/myproject/apps/frontend/modules/default/actions/actions.class.php>> dir+ ~/myproject/apps/frontend/modules/default/templates>> file+ ~/myproject/apps/frontend/modules/default/templates/indexSuccess.php>> file+ ~/myproject/test/functional/frontend/defaultActionsTest.php>> tokens ~/myproject/test/functional/frontend/defaultActionsTest.php>> tokens ~/myproject/apps/frontend/modules/default/actions/actions.class.php>> tokens ~/myproject/apps/frontend/modules/default/templates/indexSuccess.php
15
Arquitetura MVC
MVC é um acrônimo para Model, View e Controller (Modelo, Visão e Controlador). A idéia básica é separar todo o desenvolvimento de uma aplicação em 3 partes ou camadas:
Model – Gerencia o comportamento dos dados da aplicação.
View – Gerencia a saída gráfica e textual da parte da aplicação visível ao usuário final.
Controller – Interpreta as entradas de mouse e teclado do usuário, comandando a Visão e o Modelo para se alterarem de forma apropriada.
16
Arquitetura MVC
Todas as requisições feitas pelo usuário são enviadas ao Controller. Este manipula os dados usando o Model e invoca a View correta, de acordo com a ação executada ou com os resultados vindos do Model.
A grande vantagem de se utilizar a arquitetura MVC é a separação entre lógica (regras do negócio), apresentação e dados, favorecendo muito o trabalho em equipe.
Mudanças na apresentação, por exemplo, teriam pouco ou nenhum impacto nas demais camadas da aplicação... ao mesmo tempo que tudo continua absolutamente integrado.
17
ControllerViewModel
Arquitetura MVC no Symfony
18
Arquitetura MVC no Symfony
Modelo (Model)Acesso e manipulação dos dados;Baseado no Propel (por padrão);Construtores para paginação, e ordenação
filtragem;Modelo pode ser configurado usando XML
ou YAML;Symfony gera seu modelo para você!
#> symfony propel:build-modelSymfony provê classes prontas para você
estender seu modelo;
19
Modelo (Model)
Conexão com a base de dados # config/databases.yml prod: propel: param: password: PAssWD all: propel: class: sfPropelDatabase param: dsn: mysql://root:@localhost/sfdemo
Definição do esquema # config/schema.yml
post: _attributes: { phpName: Post } title: {type: varchar, size: 255} content: {type: longvarchar} is_published: {type: boolean} author_id: {type: integer, foreignTable: author, foreignReference: id} created_at: ~
Suporte a ambientes
Abstração do SQL
20
Object Relational Mapper (ORM)
YAML (usado no RoR)
• Propel permite independência do banco de dados;
• Campos de Id, created_at, & chave estrangeira são gerados automaticamente;
• Tabelas de dados = classes & linhas da tabela = objetos
• Gerados automaticamente baseados no esquema.
21
// lib/model/Author.phpclass Author extends BaseAuthor{ function getFullName() { return $this->getFirstName().' '.$this->getLastName(); }}
$author = new Author();$author->setFirstName('Lucas Augusto');$author->setLastName('Carvalho');$author->save();
$post = new Post();$post->setAuthor($author);$post->setPublishedOn('12:00 tomorrow');$post->isPublished(true);$post->save();
$posts = PostPeer::doSelect(new Criteria());
Object Relational Mapper (ORM)
22
1) Cria as classes do modelo.2) Converte o esquema para SQL.3) Cria as tabelas.4) Carrega os dados de teste.
Dados de teste # data/fixtures/data.yml Author: lucas: first_name: Lucas last_name: Carvalho Post: first_post: author_id: lucas title: Xtech 2007
$ symfony propel:build-all-load frontend
Modelo (Model)
23
Arquitetura MVC no symfony
Apresentação (View)$ Layout e configuração global
Cada ação deve ter sua própria sub template; Configurações da apresentação podem ser definidas
até o nível de ações.$ symfony utiliza o PHP como sua linguagem de
template Há opção de uso de um plugin do Smarty.
$ Helpers Partials e Slots
Fragmentos de template sem lógica de negócio.Componentes
Fragmentos de template com lógica de negócio.
24
Arquitetura MVC no symfony
Controlador (Controller)$ Chama a lógica de negócio;Cada “módulo” tem uma classe;
controladora com um número de métodos de “ação”.
Conversão automática do URL em um módulo/ação apropriado.
Métodos de pré e pós execução.
25
Workflow do symfony
Modelo (Model)
Apresentação(View)
Cliente
Servidor
Controlador (Controller)
26
Projetop«v
Aplicações
Módulos
Ações
Templates
Organização do Código
27
Configurabilidade
Module level # apps/frontend/modules/post/config/generator.yml generator: class: sfPropelAdminGenerator param: model_class: Post list: display: [=title, author, created_at] filters: [title, author_id, published_on] max_per_page: 5
Application level # apps/frontend/config/security.yml default: is_secure: on credentials: admin
Configurações
FrameworkProjeto
AplicaçãoModulo
28
Exemplo de código
# apps/frontend/modules/blog/actions/actions.class.phpclass blogActions extends sfActions{ function executeShow() { $id = $this->getRequestParameter('id'); $this->post = PostPeer::retrieveByPk($id); $this->forward404Unless($this->post); }}
# apps/frontend/modules/post/templates/showSuccess.php<h1 class="title"><?php echo $post->getTitle() ?></h1><h2>par <?php echo $post->getAuthor()->getFullName() ?></h2><p><?php echo $post->getHtmlContent(ESC_RAW) ?></p>
MVC
Model / View / Controller
XSS
Seguro por padrãoshortcut
29
Links e Roteamento
<?php echo link_to( $post->getTitle(), '@post?id=’.$post->getId()) ?>
post: param: { module: blog, action: show } requirements: id: \d+ url: /blog/:id.html
<?php echo url_for('@homepage') ?>homepage: param: { module: blog, action: recent } url: /
/blog/1.html
/
homepage: param: { module: blog, action: list } url: /recent: param: { module: blog, action: recent } url: /recent
/
/recent
30
Formulários
Criação$ Widgets
// lib/form/ContactForm.class.php
class ContactForm extends sfForm
{
public function configure()
{
$this->setWidgets(array(
'name' => new sfWidgetFormInput(),
'email' => new sfWidgetFormInput(),
'message' => new sfWidgetFormTextarea(),
));
}
}
31
Formulários
Validação// lib/form/ContactForm.class.php
class ContactForm extends sfForm
{
public function configure()
{
...$this->setValidators(array(
'name' => new sfValidatorString(array('required' => false)),
'email' => new sfValidatorEmail(array(),
array('invalid' => 'O endereço de e-mail é inválido.')),
'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))),
'message' => new sfValidatorString(array('min_length' => 4),
array('required' => 'O campo mensagem é obrigatório.')),
));
32
33
Plugins
Novos plugins criados toda semana (n. 535)$ ControlPanel : Gerenciamento Web de projetos
utilizando o symfony;ErrorLogger : Log de todos os erros 404 e 500 no
banco de dados;Guard : Autenticação e autorização;Feed2 : Criação de RSS;E mais:
Captcha, calendário, OpenID, Google Analytics, Google Sitemap, auto-complete, thumbnails, SSL, Forum, PDF, CMS, WYSIWYG, WebService, etc...
$symfony plugin:install http://plugins.symfony-project.com/sfFeed2Plugin
34
Caching
Parte ou todo o código HTML que foi enviado para um usuário devido a uma requisição pode ser reutilizado para outra requisição.
O cache HTML é desabilitado por padrão. Aumenta a performance de aplicação.
$ Cache para uma ação (com ou sem o layout);
Cache de um partial, um componente, ou um componente slot;
Cache de um fragmento de template.
35
Ajax
Utilização de bibliotecasPrototypeScript.acol.usAjax Helpers
<div id="myzone"></div><?php echo javascript_tag( remote_function(array( 'update' => 'myzone', 'url' => 'mymodule/myaction', ))) ?>
36
Ajax
Ajax Helpers<div id="item_list"></div>
<?php echo form_remote_tag(array(
'update' => 'item_list',
'url' => 'item/add',
)) ?>
37
Scaffolding
Com um simples comando, symfony cria um módulo completo baseado na descrição de uma dada tabela.
O código gerado é mínimo e deve servir apenas como base para a fase de desenvolvimento para ter acesso à base de dados rapidamente, ou construir um protótipo.
$ symfony propel:generate-crud frontend article Article
38
Admin Generator
• List, show, edit & add
• 4 páginas, < 30 LOC
39
Admin Generator
Listagem
40
Admin Generator
Edição
__toString()
widgets Relação m2m
41
Depuração
• Diagnóstico de problemas
• Checagem do tempo de execução
• Otimização de consultas SQL
42
Depuração
43
Depuração
Mensagens de erro
44
Testes Funcionais
Simulação de Navegação // test/functional/frontend/blogActionsTest.php $browser = new sfTestBrowser(); $browser->initialize(); $browser-> get('/blog/1.html')-> isStatusCode(200)-> checkResponseElement('h1.title', '/XTech 2007/');
$ symfony test:functional frontend# get / ok 1 - status code is 200not ok 2 - response selector h1 does not match regex /XTech 2007/# Looks like you failed 1 tests of 21..2
TDDTest Driven Development
Seletor CSS
45
Implantação
# config/properties.ini[production] host=1.2.3.4 user=lucas dir=/var/www/sfblog type=rsync
$ symfony project:deploy production --go
$ symfony project:freeze
46
Implantação
$ symfony test:allunit/myFunctionTest.php................okunit/mySecondFunctionTest.php..........okunit/foo/barTest.php...................not ok
Failed Test Stat Total Fail List of Failed----------------------------------------------------unit/foo/barTest.php 0 2 2 62 63Failed 1/3 test scripts, 66.66% okay. 2/53 subtests
failed, 96.22% okay.
47
Comunidade symfony• Comunidade ativa e crescendo
$ Desenvolvedores em mais de 80 países;
100 000 visitantes por mês no symfony-project.com.
Documentação LivreThe bookAskeet Tutorial Jobeet Tutorial
Grupo de usuárioGoogle Groups: symfony-pt
48
49
Usuários do symfony
Yahoo! (EUA)Yahoo! BookmarksDeliciousFlickr20 millions usersWeb 2.0 / AJAX
50
Curso de symfony
Curso pela Softeam$ Valor: R$ 100,00 (estimativa); Data prevista para início: 18/Julho; Carga horária: 32h; Aos sábados das 8:30h às 12h; Local: Laboratório do DCOMP na UFS; Dois alunos por computador (estimativa); Assim que confirmado, será divulgado em:
www.softeam.com.br/cursos
51
Palestrante: Lucas Augusto Carvalholucasaugustomcc@gmail.com
Framework OO para PHP 5Framework OO para PHP 5