palestra - symfony framework mvc php 5

Post on 05-Dec-2014

6.561 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

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

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

top related