palestra - symfony framework mvc php 5

51
Flisol 2009 - Aracaju/SE Framework OO para PHP 5 Framework OO para PHP 5 Palestrante: Lucas Augusto Carvalho [email protected]

Upload: lucas-augusto-carvalho

Post on 05-Dec-2014

6.560 views

Category:

Technology


4 download

DESCRIPTION

Palestra realizada em abril de 2009 no FLISOL de Aracaju/Sergipe. O tema foi o framework orientado a objetos em PHP chamado Symfony. Algumas de suas features: - utiliza a arquitetura MVC (Model View Controller), isto é, separação das camadas de apresentação, controle e modelo. - utiliza bastantes componentes independentes como o Doctrine e Propel (ORM), YML (arquivos de configuração) e outros. Que podem ser adotados em outros projetos que não utilizam o Symfony. - possui geração automática de CRUD (create, retrieve, update, delete) - possui uma documentação e comunidade muito grandes. - geração automática de telas de administração - ambiente de desenvolvimento com debug - ambiente de teste - integração com sincronizador de arquivos (para atualização do projeto na produção) - separação de configuração para ambientes de teste, desenvolvimento e produção. - e muito mais...

TRANSCRIPT

Page 1: Palestra - Symfony Framework MVC PHP 5

Flisol 2009 - Aracaju/SE

Framework OO para PHP 5Framework OO para PHP 5

Palestrante: Lucas Augusto [email protected]

Page 2: Palestra - Symfony Framework MVC PHP 5

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.

Page 3: Palestra - Symfony Framework MVC PHP 5

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;

Page 4: Palestra - Symfony Framework MVC PHP 5

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).

Page 5: Palestra - Symfony Framework MVC PHP 5

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

Page 6: Palestra - Symfony Framework MVC PHP 5

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.

Page 7: Palestra - Symfony Framework MVC PHP 5

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;

Page 8: Palestra - Symfony Framework MVC PHP 5

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;

Page 9: Palestra - Symfony Framework MVC PHP 5

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...

Page 10: Palestra - Symfony Framework MVC PHP 5

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

Page 11: Palestra - Symfony Framework MVC PHP 5

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

Page 12: Palestra - Symfony Framework MVC PHP 5

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.

Page 13: Palestra - Symfony Framework MVC PHP 5

13

Dependências

Dependências mínimas, tudo incluído

Mais...PrototypeScript.aculo.usTinyMCE(WYSIWYG) DynArch.com Rich Calendar

Page 14: Palestra - Symfony Framework MVC PHP 5

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

Page 15: Palestra - Symfony Framework MVC PHP 5

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.

Page 16: Palestra - Symfony Framework MVC PHP 5

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.

Page 17: Palestra - Symfony Framework MVC PHP 5

17

ControllerViewModel

Arquitetura MVC no Symfony

Page 18: Palestra - Symfony Framework MVC PHP 5

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;

Page 19: Palestra - Symfony Framework MVC PHP 5

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

Page 20: Palestra - Symfony Framework MVC PHP 5

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.

Page 21: Palestra - Symfony Framework MVC PHP 5

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)

Page 22: Palestra - Symfony Framework MVC PHP 5

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)

Page 23: Palestra - Symfony Framework MVC PHP 5

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.

Page 24: Palestra - Symfony Framework MVC PHP 5

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.

Page 25: Palestra - Symfony Framework MVC PHP 5

25

Workflow do symfony

Modelo (Model)

Apresentação(View)

Cliente

Servidor

Controlador (Controller)

Page 26: Palestra - Symfony Framework MVC PHP 5

26

Projetop«v

Aplicações

Módulos

Ações

Templates

Organização do Código

Page 27: Palestra - Symfony Framework MVC PHP 5

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

Page 28: Palestra - Symfony Framework MVC PHP 5

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

Page 29: Palestra - Symfony Framework MVC PHP 5

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

Page 30: Palestra - Symfony Framework MVC PHP 5

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(),

));

}

}

Page 31: Palestra - Symfony Framework MVC PHP 5

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.')),

));

Page 32: Palestra - Symfony Framework MVC PHP 5

32

Page 33: Palestra - Symfony Framework MVC PHP 5

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

Page 34: Palestra - Symfony Framework MVC PHP 5

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.

Page 35: Palestra - Symfony Framework MVC PHP 5

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', ))) ?>

Page 36: Palestra - Symfony Framework MVC PHP 5

36

Ajax

Ajax Helpers<div id="item_list"></div>

<?php echo form_remote_tag(array(

'update' => 'item_list',

'url' => 'item/add',

)) ?>

Page 37: Palestra - Symfony Framework MVC PHP 5

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

Page 38: Palestra - Symfony Framework MVC PHP 5

38

Admin Generator

• List, show, edit & add

• 4 páginas, < 30 LOC

Page 39: Palestra - Symfony Framework MVC PHP 5

39

Admin Generator

Listagem

Page 40: Palestra - Symfony Framework MVC PHP 5

40

Admin Generator

Edição

__toString()

widgets Relação m2m

Page 41: Palestra - Symfony Framework MVC PHP 5

41

Depuração

• Diagnóstico de problemas

• Checagem do tempo de execução

• Otimização de consultas SQL

Page 42: Palestra - Symfony Framework MVC PHP 5

42

Depuração

Page 43: Palestra - Symfony Framework MVC PHP 5

43

Depuração

Mensagens de erro

Page 44: Palestra - Symfony Framework MVC PHP 5

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

Page 45: Palestra - Symfony Framework MVC PHP 5

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

Page 46: Palestra - Symfony Framework MVC PHP 5

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.

Page 47: Palestra - Symfony Framework MVC PHP 5

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

Page 48: Palestra - Symfony Framework MVC PHP 5

48

Page 49: Palestra - Symfony Framework MVC PHP 5

49

Usuários do symfony

Yahoo! (EUA)Yahoo! BookmarksDeliciousFlickr20 millions usersWeb 2.0 / AJAX

Page 50: Palestra - Symfony Framework MVC PHP 5

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

Page 51: Palestra - Symfony Framework MVC PHP 5

51

Palestrante: Lucas Augusto [email protected]

Framework OO para PHP 5Framework OO para PHP 5