Capítulo 1 - Introdução ao Symfony
O que você pode fazer com o symfony? O que é necessário para usá-lo? Este capítulo responde estas perguntas.
Symfony em poucas palavras
Um framework simplifica o desenvolvimento de uma aplicação pela automatização de alguns dos padrões utilizados para resolver as tarefas comuns e repetitivas. Além disso, um framework obriga a utilização de uma estrutura de código fonte, forçando o desenvolvedor a criar um código mais legível e mais fácil de manter. Por último, um framework simplifica a programação de aplicações, já que encapsula operações completas em instruções simples.
Symfony é um framework completo concebido para otimizar, graças as suas características, o desenvolvimento de aplicações web. De início, ele separa regras de negócio, lógica de servidor, e a apresentação de uma aplicação web. Oferece várias ferramentas e classes projetadas para reduzir o tempo de desenvolvimento de uma aplicação web complexa. Além disso, automatiza tarefas mais comuns, permitindo que o desenvolvedor se dedique aos aspectos mais específicos de cada aplicação. O resultado final de todas essas vantagens é que não se deve reinventar a roda cada vez que uma nova aplicação web for construída!
Symfony foi completamente desenvolvido em PHP 5. Tem sido exaustivamente testado em vários projetos reais, sendo atualmente usado em websites de comercio eletrônico de alta demanda. É compatível com a maioria dos bancos de dados disponíveis, incluindo MySQL, PostgreSQL, Oracle e Microsoft SQL Server. Roda em plataformas *nix e Windows. Vamos dar uma boa olhada em suas características.
Características do Symfony
Symfony foi desenvolvido para atender aos seguintes requisitos:
- Fácil de instalar e configurar na maioria das plataformas (e funcional em plataformas padrão *nix e Windows)
- Independente de SGDB - Sistema Gerenciador de Banco de Dados
- Fácil de usar na maioria dos casos, ainda que suficientemente flexível para adaptar-se aos casos mais complexos.
- Baseado na premissa de convenção sobre configuração -- o desenvolvedor precisa configurar apenas o que não for convencional
- Segue a maioria das melhores práticas e padrões de projeto para a web
- Pronto para aplicações empresariais e adaptável a política e arquiteturas próprias de cada empresa, além de ser suficientemente estável para o desenvolvimento de aplicações a longo prazo.
- Código de leitura e manutenção fácil que inclui comentários do phpDocumentor.
- Fácil de extender, permitindo integração com outras bibliotecas distribuídas por terceiros.
Características Automatizadas de Projetos Web
Symfony automatiza a maioria dos elementos comuns dos projetos web, como por exemplo:
- A camada de Internacionalização do Symfony que permite a tradução dos dados da interface, assim como a adaptação local dos conteúdos.
- A camada de apresentação utiliza templates e layouts que podem ser construídos por webdesigners HTML que não possuem qualquer conhecimento sobre o framework. Os Assistentes (Helpers) incluídos permitem a minimizar o código utilizado na apresentação, já que encapsulam grandes porções de código em simples chamadas a funções.
- Formulários suportam validação e repopulação automáticas, o que assegura a obtenção de dados corretos e melhora a experiência do usuário.
- Os dados incluem mecanismos de escape que permitem uma melhor proteção contra ataque de dados corrompidos.
- O gerenciamento de cache reduz uso de banda e o processamento do servidor.
- Autenticação e o gerenciamento de credenciais simplifica a criação de áreas restritas e a gestão de segurança do usuário.
- O sistema de roteamento e URLs limpas transformam os endereços das páginas em partes da interface, além de torna-los amigáveis para mecanismos de busca.
- O suporte de e-mail incluido e o gerenciamento de APIs permitem as aplicações web interagir além das interfaces dos navegadores.
- Listagens são mais amigáveis graças aos recursos de paginação, ordenação e filtragens automáticas.
- Os plugins, as Factories (padrões de projeto "Factory") e "mixins" permitem construir extensões do Symfony.
- Interações Ajax são fáceis de implementar graças aos assistences (helpers) de uma-linha que encapsulam efeitos JavaScript cross-browser-compatible.
Ambiente de Desenvolvimento e Ferramentas
Symfony pode ser completamente personalizado para atender aos requisitos das empresas que possuem suas próprias políticas e regras para a gerência de projetos e a programação de aplicações. Por padrão incorpora vários ambientes de desenvolvimento diferentes e incluem várias ferramentas que permitem automatizar as tarefas mais comuns da engenharia de software.
- As ferramentas de geração de código são ótimas para protótipos de aplicações e back-ends administrativos.
- O framework de desenvolvimento de teste unitários e funcionais proporciona as ferramentas ideais para o desenvolvimento baseado em testes, o chamado ("test-driven development").
- O painel de debug simplifica a depuração, disponibilizando todas as informações que o desenvolvedor precisa na mesma página em que ele está trabalhando.
- A interface em linha de comando automatiza a instalação das aplicações entre servidores.
- É possível realizar mudanças "quentes" da configuração (sem necessidade de reiniciar o servidor).
- O completo sistema de log permite aos administradores acesso até o último detalhe das atividades que uma aplicação realiza.
Quem criou o Symfony e por que?
A primeira versão do symfony foi lançada em Outubro de 2005 pelo fundador do projeto Fabien Potencier, co-autor deste livro. Fabien é o CEO da Sensio (http://www.sensio.com/), uma produtora web francesa conhecida por sua visão inovadora em desenvolvimento web.
Anos antes, em 2003, Fabien levou algum tempo analisando as ferramentas de desenvolvimento em código aberto existentes para aplicações web em PHP. Constatou que nenhuma delas preenchia os requisitios descritos anteriormente. Quando o PHP 5 foi lançado, ele decidiu que as ferramentas disponíveis tinham alcançado maturidade o suficiente para integrá-las em um framework completo. Ele levou um ano desenvolvendo o núcleo do symfony, baseando seu trabalho no framework Mojavi Model-View-Controller (MVC), um mapeador objeto-relacional (ORM) chamado Propel, e os assistentes (helpers) para templates do Ruby on Rails.
Fabien concebeu originalmente o symfony os projetos da Sensio, porque possuir um framework eficiente à sua disposição representava o caminho ideal para desenvolver aplicações rapidamente e com mais eficiência. Isso ainda tornou o desenvolvimentoo web mais intuitivo, resultando em aplicações mais robustas e mais fáceis de se manter. O framework teve seu ponta-pé inicial quando foi utilizado para construir um website de comércio eletrônico para uma loja de roupas íntimas e conseqüentemente foi aplicado para outros projetos.
Após usar o symfony em alguns projetos com sucesso, Fabien decidiu lançar-lo em licença de código aberto. Doou seu projeto à comunidade, porque queria melhorar o feedback dos usuários, mostrar a experiência da Sensio, e porque é divertido.
Por que "symfony" e não "FooBarFramework"? Porque Fabien queria um nome curto contendo um s, de Sensio, e um f, de framework--fácil de lembrar e algo que não fosse associado com outra ferramente de desenvolvimento. Além disso, ele não gosta de letras maiúsculas. symfony é o mais próximo disso, apesar de não ser completamente em inglês, e também estava disponível como um nome de projeto. A outra alternativa seria "baguette."
Para que o symfony se tornasse um projeto código aberto de sucesso, deveria possuir uma documentação extensa em inglês, para aumentar sua adoção. Fabien pediu ao empregado da Sensio François Zaninotto, e também co-autor deste livro, que mergulhasse no código e escrevesse um livro online sobre ele. Isso levou um tempo, mas quando o projeto tornou-se público, ele estava bem documentado o bastante para atender a um grande número de desenvolvedores. O resto é história.
A comunidade Symfony
Assim que o website do symfony (http://www.symfony-project.com/) foi lançado, um grande número de desenvolvedores ao redor do mundo baixaram a instalaram o framework, leram a documentação online, e construiram suas primeiras aplicações com o symfony, e o barulho foi geral.
Frameworks de aplicações Web estavam se tornando populares na época, e a necessidade de um framework completo em PHP era grande. Symfony tornara-se uma solução obrigatória devido ao sua impressionante qualidade de código e sua considerável quantidade de documentação -- suas duas maiores vantagens em relação às outras alternativas na categoria "framework". Contribuidores rapidamente vieram à tona, propondo correções e melhorias, colocando a documentação à prova, e realizando outras tarefas importantes.
O repositório público dos fontes e o sistema de tickets possibilitam variadas formas de contribuir, e todos os voluntários são bem-vindos. Fabien continua sendo o principal aprovador na árvore do repositório de código aberto, e garante a qualidade do código.
Atualmente, o fórum do symfony, listas de discussão, e o canal de IRC são canais de suporte ideais, cada questão aparentemente possui uma média de quatro respostas. Novos usuários instalam o symfony todos os dias, e no wiki, na sessão code snippets hospeda muitas documentações contribuídas pelos usuáios. O número de aplicações conhecidas que utilizam symfony cresce em um ritmo de cinco por semana, sem parar.
A comunidade symfony é o terceira perna deste tripé que é o framework, e nós esperamos que você se junte à nós após a leitura deste livro.
O Symfony é pra mim?
Seja você um expert em PHP 5 ou um iniciante em programação para web, está apto para usar o symfony. O fator de decisão determinante entre usar ou não deve ser o tamanho do seu projeto.
Se você deseja desenvolver um simples website de 5 a 10 páginas, poucos acessos ao banco de dados, e sem quaisquer obrigações em assegura performance ou disponibilizar documentação, então você deve usar apenas o PHP. Você não terá um ganho fazendo uso de um framework para aplicações web, e usar orientação à objetos ou um modelo MVC provavelmente só iria atrasar seu desenvolvimento. E um aviso, symfony não é otimizado para rodar eficientemente em um servidor compartilhado onde scripts PHP só possam rodar usando o modo "Common Gateway Interface" (CGI).
Por outro lado, se você deseja desenvolver aplicações web mais complexas, carregado de regras de negócio, apenas PHP não é o bastante. Se planeja manter ou extender sua aplicação no futuro, vai precisar de um código leve, legível e eficiente. Se deseja utilizar últimos avanços em interatividade com usuários (como Ajax) de forma intuitiva, você não pode simplesmente codificar centenas de linhas em JavaScript?. Se deseja desenvolver de forma rápida e divertida, então apenas PHP será provavelmente decepcionante. Por todas estas razões, symfony é para você.
E, claro, se você já é um desenvolver web profissional, já conhece todos os benefícios de frameworks para aplicações web, e está procurando um maduro, bem documentado, e com uma grande comunidade de usuários, não procure mais, porque o symfony é sua solução.
Se você prefere uma demonstração mais visual, dê uma olhada nos vídeos (screencasts) disponíveis no website do symfony. Você verá como é fácil e divertido desenvolver aplicações com o symfony.
Conceitos Fundamentais
Antes de começar com o symfony, você precisa entender alguns conceitos básicos. Sinta-se à vontade para pular o capítulo se você já conhecer o conceito de OOP, ORM, RAD, DRY, KISS, TDD, YAML, e PEAR.
PHP 5
Symfony é desenvolvido em PHP 5 (http://www.php.net/) e concebido para construir aplicações web com esta mesma linguagem. Entretanto, um entendimento sólido sobre PHP 5 é necessário para extrair o melhor deste framework.
Desenvolvedores que já conhecerem PHP 4 mas não PHP 5 devem se focar no novo modelo orientado à objetos.
Programação Orientada à Objetos (OOP)
Programação Orientada à Objetos (OOP) não será explicada neste capítulo. Seria necessário todo o livro para isso! Por causa da extensibilidade do symfony ser realizada usando os mecanismos orientados à objetos presentes no PHP 5, OOP é portanto um pré-requisito para aprender symfony.
Wikipedia explica OOP da seguinte maneira:
A idéia por trás da programação orientada à objetos é que o programa de computador deve ser compreendido com uma coleção unidades individuais, ou objetos, que interagem uns com os outros, em oposição à visão tradicional em que um programação é visto como uma coleção de funções, ou simplesmente como uma lista de instruções para o computador.
PHP 5 implementa paradigmas de orientação à objetos como classe, objeto, método, herança, e muitos outros. Aqueles que não estiverem familiarizados à estes conceitos, são advertidos a ler a documentação PHP relacionada, disponível em http://www.php.net/manual/en/language.oop5.basic.php.
Métodos Mágicos
Uma das vantagens dos objetos em PHP é a capacidade de utilizar os métodos mágicos. São métodos que podem ser utilizados para sobrescrever o comportamento padrão das classes sem modificar o código externo. Eles fazem com que a sintaxe PHP mais direto e flexível. São facéis de se identificar, porque seus nomes começam com dois underscores (__).
Por exemplo, quando exibirmos um objeto, o PHP automaticamente olha para o método __toString() deste objeto para verificar se há um formato de exibição customizado definido pelo desenvolvedor:
$myObject = new myClass(); echo $myObject; // Will look for a magic method echo $myObject->__toString();
Symfony utiliza métodos mágicos, portanto você deve possuir um entendimento sobre eles. Eles são descritos na documentação do PHP (http://www.php.net/manual/en/language.oop5.magic.php).
Repositório de Aplicações e Extensões PHP (PEAR)
PEAR é "um framework e sistema de distribuição para componentes PHP reutilizáveis." PEAR lhe permite baixar, instalar, atualizar, e desinstalar scripts PHP. Quando você faz uso de um pacote PEAR, não precisa se preocupar onde colocar os scripts, como torná-los disponíveis, ou como extender a interface de linha de comando (CLI).
PEAR é um projeto controlado pela comunidade, escrito em PHP e distribuído em conjunto aos pacotes padrões PHP.
No website do PEAR, http://pear.php.net/, provém documentação e pacotes agrupados por categorias.
PEAR é a maneira mais profissional de instalar bibliotecas de terceiros no PHP. Symfony recomenda o uso do PEAR para manter um ponto central de instalação, utilizando-o em múltiplos projetos ao mesmo tempo. Os plug-ins do symfony são pacotes PEAR com uma configuração especial. O próprio framework symfony está disponível na forma de um pacote PEAR.
Você não precisa saber à respeito da sintaxe PEAR para utilizar o symfony. Você só precisa entender o que ele faz e tê-lo instalado. Você pode verificar se o PEAR está instalado em seu computador, digitando o seguinte comando em seu terminal:
O comando irá retornar o número da versão do PEAR instalado.
O projeto symfony possui seu próprio repositório (ou canal) PEAR. Repare que estes canais são disponíves a partir da versão 1.4.0 do PEAR, portanto você deve atualizá-lo se sua versão for mais antiga. Para atualizar sua versão de PEAR, digite o seguinte comando:
Mapeamento Objeto-Relacional (ORM)
Bancos de Dados são relacionais. PHP 5 e symfony são orientados à objeto. Para possibilitar um acesso ao banco de dados de uma forma orientada à objeto, é necessária uma interface traduzindo a lógica de objetos para a lógica relacional. Esta interface é chamada de mapeamento objeto-relacional, ou ORM.
Um ORM é feito para objetos terem acesso às informações e manter regras de negócio entre eles mesmos.
Um dos benefícios de uma camada de abstração objeto-relacional é a prevenção no uso de sintaxes específicas de um determinado tipo de banco de dados. Ele automaticamente traduz chamadas de um modelo de objetos para consultas SQL otimizadas para o banco de dados atual.
Isso significa que substituir um tipo de banco de dados por outro no meio do projeto é fácil. Imagine uma situação em que você precisa escrever um protótipo rápido para uma aplicação, mas seu cliente ainda não se decidiu qual banco de dados é melhor para suas necessidades. Você pode começar construindo sua aplicação em SQLite, por exemplo, e mudar para MySQL, PostgreSQL, ou Oracle quando o cliente estiver pronto para decidir. Apenas mude uma linha no arquivo de configuração, e pronto.
Uma camada de abstração encapsula a lógica de dados. O restante da aplicação não precisa realizar consultas SQL, e os SQL 's que acessam o banco ficam fáceis de se encontrar. Desenvolvedores especializados em programação em banco de dados também saberão claramente onde trabalhar.
Usando objetos no lugar de registros, e classes no lugar de tabelas, traz ainda um benefício adicional: você pode implementar novos acessos à suas tabelas. Por exemplo, se você tem uma tabela chamada Cliente com dois campos, primeiroNome e sobreNome, você pode pedir apenas por uma informação chamada Nome. No mundo orientado à objetos, isso é tão fácil, bastando simplesmente adicionar um método retornaTotal() de acesso na classe Cliente, desta forma:
public function retornaTotal() { $total = 0; foreach ($this->getItems() as $item) { $total += $item->getPrice() * $item->getQuantity(); } return $total; }
E isto é tudo. Imagine quanto tempo seria necessário para escrever toda uma consulta SQL fazendo a mesma coisa!
Propel, um outro projeto de código aberto(open source), é atualmente uma das melhores camadas de abstração objeto/relacional para PHP 5. Symfony integra Propel de uma forma contínua no framework, então muitas das manipulações de dados descritas neste livro segue a sintaxe Propel. Este livro irá descrever como utilizar os objetos Propel, mas para uma completa referência, uma visita ao Propel website (http://propel.phpdb.org/trac/) é recomendada.
Desenvolvimento Rápido de Aplicações (RAD)
Programação de aplicações web foi por um longo tempo um tedioso e lento trabalho. Seguindo o usual ciclo de vida da engenharia de software (como uma proposta de RUP Processo Unificado Racional), o desenvolvimento de aplicações web não poderia começar antes que uma completa definição dos requisitos fosse escrita, em muitas das Linguagens de Modelagem Unificada (UML) são desenhados os diagramas e produzido toneladas de documentação preliminar. Esta foi o principal motivo da velocidade de desenvolvimento, para a falta de versatilidade da linguagem de programação (você tinha que construir, compilar, reiniciar, e quem sabe realmente o que mais, vendo antes de executar o seu programa), e acima de tudo, para o fato de que os clientes sejam bastante razoáveis e não mudem de opinião constantemente.
Hoje, negócios movimentam-se rapidamente, e clientes tendem a mudar suas idéias durante o desenvolvimento do projeto. Naturalmente, eles esperam que o time de desenvolvimento adapte-se as suas necessidades e modifiquem a estrutura da aplicação rapidamente. Felizmente, o uso de linguagens scripts como Perl and PHP tornam isso mais fácil ao aplicar outra estratégia de programação, tais como o Rápido Desenvolvimento de Aplicação (RAD) ou ágil desenvolvimento de software.
Uma das idéias desta metodologia é iniciar o desenvolvimento o mais breve possível, para que o cliente possa revisar um protótipo funcional e oferecer mais sentido. Desta forma, a aplicação é construída em um processo iterativo, disponibilizando versões cada vez mais ricas em característica em curtos ciclos de desenvolvimento.
As conseqëncias para o desenvolvedor são numerosas. Um desenvolvedor não precisa pensar sobre o futuro quando esta implementa uma característica. O método utilizado deve ser simples e o mais claro possível. Isso é bem ilustrado pela máxima do princípio KISS: Keep It Simple, Stupid (Mantenha-o simples, estúpido).
When the requirements evolve or when a feature is added, existing code usually has to be partly rewritten. This process is called refactoring, and happens a lot in the course of a web application development. Code is moved to other places according to its nature. Duplicated portions of code are refactored to a single place, thus applying the Don't Repeat Yourself (DRY) principle.
And to make sure that the application still runs when it changes constantly, it needs a full set of unit tests that can be automated. If well written, unit tests are a solid way to ensure that nothing is broken by adding or refactoring code. Some development methodologies even stipulate writing tests before coding--that's called test-driven development (TDD).
There are many other principles and good habits related to agile development. One of the most effective agile development methodologies is called Extreme Programming (abbreviated as XP), and the XP literature will teach you a lot about how to develop an application in a fast and effective way. A good starting place is the XP series books by Kent Beck (Addison-Wesley).
Symfony is the perfect tool for RAD. As a matter of fact, the framework was built by a web agency applying the RAD principle for its own projects. This means that learning to use symfony is not about learning a new language, but more about applying the right reflexes and the best judgment in order to build applications in a more effective way.
The symfony project website proposes a step-by-step tutorial illustrating the development of an application in an agile way. It is called askeet (http://www.symfony-project.org/askeet), and is recommended reading for those who want to learn more about agile development. YAML
According to the official YAML website (http://www.yaml.org/), YAML is "a straightforward machine parsable data serialization format designed for human readability and interaction with scripting languages." Put another way, YAML is a very simple language used to describe data in an XML-like way but with a much simpler syntax. It is especially useful to describe data that can be translated into arrays and hashes, like this:
$house = array(
'family' => array(
'name' => 'Doe', 'parents' => array('John', 'Jane'), 'children' => array('Paul', 'Mark', 'Simone')
), 'address' => array(
'number' => 34, 'street' => 'Main Street', 'city' => 'Nowheretown', 'zipcode' => '12345'
)
);
This PHP array can be automatically created by parsing the YAML string:
house:
family:
name: Doe parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34 street: Main Street city: Nowheretown zipcode: "12345"
In YAML, structure is shown through indentation, sequence items are denoted by a dash, and key/value pairs within a map are separated by a colon. YAML also has a shorthand syntax to describe the same structure with fewer lines, where arrays are explicitly shown with [] and hashes with {}. Therefore, the previous YAML data can be written in a shorter way, as follows:
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] } address: { number: 34, street: Main Street, city: Nowheretown, zipcode: "12345" }
YAML is an acronym for "YAML Ain't Markup Language" and pronounced "yamel". The format has been around since 2001, and YAML parsers exist for a large variety of languages.
The specifications of the YAML format are available at http://www.yaml.org/.
As you can see, YAML is much faster to write than XML (no more closing tags or explicit quotes), and it is more powerful than .ini files (which don't support hierarchy). That is why symfony uses YAML as the preferred language to store configuration. You will see a lot of YAML files in this book, but it is so straightforward that you probably don't need to learn more about it.
Sumário
Symfony é um PHP 5 web application framework. Isto adiciona uma nova camada no topo da linguagem PHP, fornecendo ferramentas que aceleram o desenvolvimento de aplicações web complexas. Este livro irá dizer-lhe tudo sobre o symfony, e você só precisa estar familiarizado com os conceitos básicos da moderna programação para compreendê-lo, ou seja, programação orientada à objetos (OOP), mapeamento objeto-relacional (ORM), e de rápido desenvolvimento de aplicações (RAD). O único requisito técnico exigido é o conhecimento de PHP 5.