Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Release 2.x
Sumrio
Iniciando.................................................................................................................................................. 3 Construindo um blog ............................................................................................................................... 3 Baixando o Easy Framework ................................................................................................................. 4 Criando o Banco de dados.................................................................................................................... 5 Configurao do Banco de dados ......................................................................................................... 5 Configuraes opcionais ...................................................................................................................... 6 Uma observao no mod_rewrite ........................................................................................................ 7 Tutorial do Blog Adicionando camadas .................................................................................................. 7 Criando um Modelo ............................................................................................................................. 7 Criando o Controller de postagem........................................................................................................ 8 Criando a View de postagens ............................................................................................................. 10 Adicionando postagens ...................................................................................................................... 13 Validao de dados ............................................................................................................................ 15 Editando Postagens............................................................................................................................ 17 Excluindo Postagens........................................................................................................................... 18 Rotas ................................................................................................................................................. 20 Concluso .......................................................................................................................................... 21 Leitura Adicional .................................................................................................................................... 22 Uma requisio tpica no EasyFw ....................................................................................................... 22 Convenes do EasyFw ...................................................................................................................... 23 Convenes dos Controllers ........................................................................................................... 23 Convenes para Arquivos e nomes de Classes .............................................................................. 24 Convenes de Modelos e Banco de dados .................................................................................... 24 Convenes das Views ................................................................................................................... 24 Estrutura de pastas do EasyFw ........................................................................................................... 25 A pasta App.................................................................................................................................... 25 Estendendo o EasyFw ........................................................................................................................ 25 Estendendo Controllers Components .............................................................................................. 26 Estendendo s Views - Helpers........................................................................................................... 26
Iniciando
O EasyFw fornece uma robusta base para a sua aplicao. Ela pode controlar diversos aspectos, desde a requisio inicial do usurio at a renderizao da pgina web. O framework segue os princpios do MVC, permitindo a voc uma fcil customizao e extenso na maioria dos aspectos da aplicao. O framework tambm fornece uma organizao lgica de sua estrutura, desde nomes de arquivos a nomes de tabelas do banco, deixando sua aplicao inteiramente lgica e consistente. Esse um conceito simples mas poderoso. Siga as convenes e voc saber exatamente os as coisas esto e como elas esto organizadas. A melhor maneira de aprender e experimentar o EasyFw sentar e construir alguma coisa. Para comear vamos construir um Blog simples.
Construindo um blog
Bem-vindo ao EasyFw. Voc est conferindo esse tutorial provavelmente porque quer conhecer mais sobre como o EasyFw funciona. nossa meta aumentar a produtividade e deixar a tarefa de codificar mais prazerosa: ns esperamos que voc veja isso enquanto voc codifica. Esse tutorial vai levar voc atravs da criao de um blog simples. Ns vamos baixar e instalar o EasyFw, criar e configurar o banco de dados e criar a lgica suficiente para listar, adicionar, editar e excluir postagens do blog. Aqui est o que ns vamos precisar: 1. Um servidor web. Vamos assumir que voc est usando o Apache, apesar disso as instrues para usar outro servidor web so bem similares. Talvez ns precisaremos brincar um pouco com as configuraes do servidor, mas na maioria das vezes voc colocar o EasyFw para rodar sem configurar nada. Tenha certeza que voc est rodando o PHP 5.3.0 ou maior. 2. Um servidor de banco de dados. Ns vamos utilizar o servidor MySQL nesse tutorial. Voc precisar entender bem a linguagem SQL para criarmos um banco de dados. Como ns vamos utilizar MySQL, tenha certeza que voc tem a extenso pdo_mysql instalada (normalmente j vem instalada por padro nos pacotes). 3. Conhecimento bsico de PHP. Quanto mais orientao a objetos voc conhecer melhor, mas no tema caso voc seja f de programao procedural. 3
4. Finalmente, voc precisar conhecer o bsico do padro de programao MVC. Uma pequena reviso pode ser encontrada em Entendendo o Model-View-Controller. No se preocupe, apenas meia pgina ou menos. Vamos comear!
Dessa maneira o EasyFw j vir junto com a aplicao dentro da pasta vendor. Caso voc no queira clonar o EasySkeleton, apenas baixa-lo normalmente, ento voc dever baixa o EasyFw tambm e coloca-lo na pasta vendor com o nome easyframework.
Por padro o EasyFw vir com a seguinte estrutura: Sua_aplicacao o App o Vendors Easyframework o .htaccess o README.md
Agora seria uma boa hora para voc conhecer a Eastrutura de pastas do EasyFw
AS escolhas dos nomes das colunas no so por acaso. Se voc seguir as convenes de banco de dados e de classes do EasyFw voc poder ter as vantagens de no precisar especificar nada em arquivos de configuraes, pois o EasyFw j ir mapear tudo automaticamente (voc pode conferir as convenes na seo Convenes do Easy Framework), mas nada impede que voc use outro padro. Seguindo as convenes vamos ficar com a tabela com o nome de posts, automaticamente ela ser ligada ao modelo Posts.
host: localhost user: root password: '' database: blog_db encoding: utf8 prefix: '' production: default: driver: mysql host: localhost user: theUsername password: "justAPassToProduction" database: theDatabaseNameAtProduction encoding: utf8 prefix: ''
Uma vez configurado o arquivo de banco de dados, voc j pode acessar no seu browser a sua aplicao, e ver a tela de boas-vindas do EasyFw. Note: Lembre-se que voc precise ter a extenso PDO, e pdo_mysql habilitados no seu php.ini.
Configuraes opcionais
Existem mais trs itens interessantes que podem ser configurados. A maioria dos desenvolvedores completa essa sequncia de configuraes, mas elas no so obrigadas para esse tutorial. A primeira definir uma string aleatria (ou salt) que ser usado nas criptografias de segurana. O segundo definir um nmero randmico (ou seed) para encriptao. E o terceiro item permitir que o EasyFw escreva no diretrio tmp. O salt de segurana utilizado para hashes. Para alterar o valor padro basta abrir o arquivo de configuraes gerais /App/Config/application.yml na linha 52. Security: salt: 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi'
O chipher seed utilizado para encriptar e decriptar strings. Para alterar o valor padro basta abrir o arquivo de configuraes gerais /App/Config/application.yml na linha 53.
Security: cipherSeed: '76859309657453542496749683645'
Se por alguma razo o EasyFw no puder escrever no diretrio tmp voc ser informado com um alerta, contanto que no esteja em modo de produo.
O modelo do EasyFw deve ser colocado na pasta dos modelos /App/Model para nosso exemplo vamos salva-lo da seguinte maneira /App/Model/Post.php. O arquivo dever conter a classe Post, mais ou menos dessa forma:
<?php namespace App\Model; class Post extends AppModel { }
A conveno de nomes no EasyFw muito importante. Colocando o nome de nosso modelo como Post automaticamente o EasyFw infere que esse modelo ser utilizado pelo controller PostsController, e est ligado a uma tabela no banco de dados com o nome posts. Nota: O EasyFw dinamicamente cria um objeto do modelo para voc no seu controller, contanto que os nomes sigam o padro e o modelo esteja localizado em /App/Model. Isso significa que se por acidente o nome da classe ou arquivo de modelo estiver incorreto, o EasyFw no ir reconhece-lo e voc precisar dizer explicitamente que o nome diferente.
Agora, vamos adicionar uma action para nosso controller. Uma Action a representaes de funcionlidades da nossa aplicao, nada mais so que mtodos. Por exemplo, quando um usurio acessar www.example.com/posts/index (que o mesmo que www.example.com/posts), eles esperaro ver uma listagem das postagens. O cdigo para essa action algo assim:
<?php namespace App\Controller; use Easy\Model\FindMethod; class PostsController extends AppController { public function index() { $postagens = $this->Post->getEntityManager()->find(null, FindMethod::ALL); $this->postagens = $postagens; } }
Deixe-me explicar essa action. Definindo uma action index() no nosso PostsController, os usurios podem acessar sua lgica atravs do cominho www.example.com/posts. Logicamente, se ns definirmos um mtodo chamado foobar(), os usurios podero acessa-la pela url www.example.com/posts/foobar
Ateno: Voc pode se sentir tentado a nomear certos controllers e action para obter certas URLs. Resista a essa tentao siga as convenes de nomes do EasyFw (controllers no plural, etc.) e crie actions com os nomes legveis e entendveis. Voc pode mapear suas URLs para seu cdigo usando rotas, que vamos abordar mais a frente. Na primeira linha ns atribumos a uma varivel $postagens nossa listagem das postagens do banco, para isso utilizamos nosso modelo $this->Post e acessamos o EntityManager, com ele que temos as operaes de CRUD do banco de dados. Aps isso ns pedimos para ele utilizar o mtodo find() e passamos dois parmetros, o primeiro so as condies da busca (como filtros, ordenaes, etc.) e o segundo o tipo da busca, no nosso caso FindMethod::ALL para buscar todos os registros. Na outra linha, ns criamos uma varivel dinamicamente, ela ser nossa varivel na View. Atribumos a ela todas as nossas postagens e pronto j podemos acessa-la na View. Para aprender mais sobre os Controllers, visite a seo de Controllers.
{block name=content} <div class="page-header"> <h1>{__("Postagens do Blog")}</h1> </div> <table class="table table-bordered table-striped"> < tr > < th>Id</th > < th>Ttulo</th > < th>Data</th > < th>Aes</th > < /tr > {foreach $postagens as $postagem} < tr > <td>{$postagem->titulo}</td> <td>{$postagem->created|date_format: %x}</td> <td>{$Html->actionLink(Editar, view, posts, $postagem->id)} | {$Html->actionLink(Excluir, delete, posts, $postagem->id)} </td> < /tr > {/foreach} < /table > {/block}
Voc deve ter notado o uso de um objeto $Html->actionLink(). Esse tipo de objeto so chamados de Helpers. O EasyFw vem com diversos Helpers que voc pode utilizar em suas views, deixando mais fcil de trabalhar. Por exemplo o helper que utilizamos acima ir gera o HTML de um link para a action view no controller posts. O link criado pelo helper ir seguir o formato /controller/action/param1/param2. Nesse ponto voc j pode acessar seu browser http://www.example.com/posts/index. Voc deve ver todas as postagens que o nosso banco tem. Caso voc clique no link de edio voc ser informado pelo EasyFw que a action ainda no existe. Ento ns vamos cria-la agora:
11
<?php namespace App\Controller; use Easy\Model\FindMethod; class PostsController extends AppController { public function index() { $postagens = $this->Post->getEntityManager()->find(null, FindMethod::ALL); $this->postagens = $postagens; } public function view($id =null) { $postagem = $this->Post->getEntityManager()->read($id); $this->postagem = $ postagem; } }
O cdigo para leitura de uma postagem bem simples. Notem que estamos usando o read() ao invs do find() pois ns s queremos recuperar uma postagem. Notem tambm que a nossa action recebe um id como parmetro, esse id da postagem que queremos ver. Esse parmetro provido para a action atravs da URL. Se o usurio acessar /posts/view/3, ento o valor 3 passado como o $id. Agora vamos criar a View para nossa action view e salva-la em /App/View/Posts/view.tpl.
{block name=content} <div class="page-header"> <h1>{$postagem->titulo}< </h1> </div> <p><small>Data: {$postagem->created|date_format: %x}< /small></p > <p>{$postagem->conteudo}< /p > {/block} Veja que isso ir funcionar acessando o link pela tabela das nossas postagens ou acessando manualmente um post pela URL. Ex.:/posts/view/1.
Adicionando postagens
Ler registros do banco de dados e mostr-los um bom comeo, mas vamos aprender como adicionar registros. Primeiramente, vamos criar uma action chamada add() no nosso PostsController:
<?php namespace App\Controller; use Easy\Model\FindMethod; class PostsController extends AppController { public function index() { $postagens = $this->Post->getEntityManager()->find(null, FindMethod::ALL); $this->postagens = $postagens; } public function view($id =null) {
13
$postagem = $this->Post->getEntityManager()->read($id); $this->postagem = $ postagem; } public function add() { if ($this->request->is(post)) { if ($this->Post->save($this->request->data)) { $this->Session->setFlash(Sua postagem foi salva com sucesso.) ; $this->redirectToAction(index) ; } else { $this->Session->setFlash(Sua postagem no foi salva) ; } } } }
A action add() faz o seguinte: se o mtodo HTTP foi via POST, tente salvar os dados usando o modelo Post. Se por alguma razo no pode ser salvo, ele apenas ir renderizar a view. Isso nos d a chance de mostrar os erros de validao para o usurio. Cada request no EasyFw est encapsulado em um objeto chamado Request que pode ser acessado do seu controller pela propriedade $this->request. O objeto Request contm informaes uteis sobre o request realizado, e pode ser utilizado para controlar o fluxo da sua aplicao. Nesse caso, ns usamos o mtodo Request::is() para verificar se o request foi via POST. Quando um usurio utiliza um formulrio via POST para enviar dados para nossa aplicao, esses dados esto disponveis atravs da propriedade $this->data ou $this->request->data. Ns utilizamos o mtodo SessionComponent::setFlash() do componente de Sesso para setar uma mensagem na sesso e mostrar para o usurio depois do redirecionamento. Na View ns utilizamos SessionHelper::flash() que vai mostrar a mensagem e limpar a varivel da sesso. O mtodo Controller::redirectToAction() redireciona a aplicao para outra action e executa seus procedimentos. Chamar o mtodo save() ir validar o modelo e se encontrar algum erro ir abortar o processo de salvamento. Vamos abordar os error de modelos mais a frente.
Validao de dados
O EasyFw trabalha com validaes de uma forma fcil e rpida para que voc no precise perder tempo com enormes rotinas de validao. Para ter as vantagens da validao em formulrios, ns vamos precisar utilizar o FormHelper na nossa view: Aqui est nossa View de adio de postagens:
{block name=content} <div class="page-header"> <h1>{__("Adicionar Postagem")}</h1> </div> {$Form->create(add, posts)} {$Form->inputTextLabel(titulo)} {$Form->textAreaLabel(conteudo, [rows=>3])} {$Form->submit(Salvar, [class => btn])}{$Form->close()}
{/block}
Aqui ns utilizamos o FormHelper para gerar nossa tag HTML de um formulrio. Ele ir gerar a seguinte tag:
<form method="post" action="/posts/add">
O mtodo $Form->inputTextLabel() usado para gerar um element input. O primeiro parmetro corresponde a qual campo ele pertence, o Segundo parmetro um array com opes para personalizao do input, como css, onclick, id personalizado, etc. So chamados de HtmlOptions. O terceiro parmetro para a personalizao da label que ir referenciar o input. O mtodo $Form->textAreaLabel() ir gerar uma tag textArea para o contedo da postagem, ela segue basicamente o mesmo princpio que o inputText. O mtodo $Form->submit() ir gerar um input do tipo submit para enviarmos nosso formulrio. Ele aceita um parmetro para personalizarmos o submit, seja para alterar o css ou para alterar de input para button. A ltima linha o mtodo $Form->close(), que ir gerar uma tag de fechamento do formulrio. 15
Agora vamos voltar para nosso index e atualiza-lo com um link para adicionarmos as postagens. Aps o fechamento da tabela adicione:
{$Html->actionLink(Adicionar Postagem, add, posts)}
Voc deve estar se perguntando como eu falo para o EasyFw sobre minhas regras de validaes. Elas so informadas no nosso modelo. Vamos ver nosso modelo Post com algumas alteraes
< ?php namespace App\Model; class Post extends AppModel { public $id; /** * @NotEmpty */ public $titulo; /** * @NotEmpty */ public $conteudo; }
A validao chamada quando chamamos o mtodo save(). Aqui ns especificamos que as propriedades $titulo e $conteudo no podem ser vazias (@NotEmpty). A API de validao do EasyFw j vem com diversas validaes pr-definidas (carto de crdito, email, telephone, etc.) e flexveis para voc criar suas prprias validaes. Para mais detalhes confira a sesso Validao de Dados. Agora que temos nossa validao pronta, tente incluir uma postagem sem o contedo e veja o que acontece. Desde que ns utilizamos FormHelper::inputText() as mensagens de validao so mostradas automaticamente.
Editando Postagens
A partir desse momento voc j um professional no EasyFw, ento voc deve escolher um padro. Crie a action e depois a view. Aqui ns temos a action edit() do nosso PostsController:
17
< ?php public function edit($id = null) { $this->Post->id = $id; if ($this->request->is(get)) { $postagem = $this->Post->read() ; $this->postagem = $postagem; } else { if ($this->Post->save($this->data)) { $this->Session->setFlash(Sua postagem foi atualizada.) ; $this->redirectToAction(index) ; } else { $this->Session->setFlash(No pudemos atualizar sua postagem) ; } } }
A ao verifica se o request veio via GET. Se veio, ento ns procuramos a postagem no banco de dados e passamos para a view. Se a requisio vier via POST ento ns vamos salvar o registro, ou retornar os erros de validao. A view da action edit() ser assim.
{block name=content} <div class="page-header"> <h1>{__("Editar Postagem")}</h1> </div> {$Form->create(edit, posts, $postagem->id)} {$Form->inputTextLabelFor($postagem->titulo, titulo)} {$Form->textAreaLabelFor($postagem->conteudo, conteudo, [rows=>3])} {$Form->submit(Salvar, [class => btn])} {$Form->close()} {/block}
A view ir renderizar o formulrio j populado com a postagem. Uma coisa importante saber que o EasyFw ir assumir que voc quer atualizar um registro graas ao parmetro id, que ns estamos informando no formulrio.
Excluindo Postagens
A lgica de excluso das postagens bem simples. O fluxo segue a mesma lgica da edio: o usurio ir acessar a action delete passando um id como parmetro, se a requisio for via GET iremos mostrar uma tela de confirmao da excluso do registro, nessa tela enviaremos uma requisio post para a action delete, ento poderemos deletar o registro e redirecionalo para a index novamente. Vamos criar a action para excluir a postagem no nosso PostsController.
< ?php public function delete($id = null) { if ($this->request->is(post)) { $this->Post->delete($id); $this->redirectToAction(index); } else { $this->postagem = $this->Post->getEntityManager()->read($id); }
Com isso ns j temos o fluxo da excluso das postagens. Muito simples no?
19
Rotas
Para alguns, as rotas padro do EasyFw so o suficiente para trabalhar. Alguns desenvolvedores so mais sensveis quanto as URL amigveis que ajudam na indexao das Engines de busca. Ento para esses desenvolvedores desenvolvemos uma forma de mapear rotas na aplicao. Ento para deixar tudo mais interessante vamos fazer algumas mudanas nesse tutorial. For more information on advanced routing techniques, see Routes Configuration. Por padro, quando o usurio realiza uma requisio para a raiz da aplicao (ex.: http://www.example.com) o EasyFw ir direciona-lo para o controller padro HomeController e ir chamar uma action chamada index(). Vamos alterar esse comportamento e pedir para o EasyFw setar como controller padro nosso PostsController. O arquivo de rotas do EasyFw est em App/Config/route.yml E ficara mais ou menos assim:
Routing: connect: # Here, we are connecting '/' (base path) to controller called 'Home', its action called 'index' '/': {controller: Posts, action: index}
Essa linha conecta a URL / que a raiz da aplicao com o PostsController chamando a action index(), isso significa que podemos criar diversas rotas diferentes e direcion-los para qualquer controller em qualquer action(). Uma observao, o EasyFw usa as rotas reversas, ou seja, voc pode passar o nome do controller o nome da action como um array indexado, igual no exemplo acima, mas tambm poderia passar apenas como uma string, dessa forma posts/index.
Concluso
Criar aplicaes dessa forma ir poupar tempo e dinheiro, alm de ficar muito mais divertido codificar sua aplicao. Simples n? Tenha em mente que esse foi apenas um simples tutorial, o EasyFw tem muito mais ferramentas interessantes que merecem ser estudas, elas deixaram sua aplicao mais flexvel e poderosa. Agora que voc criou uma aplicao bsica como o EasyFw voc est pronto para um projeto de verdade. Comece o seu prprio projeto e leia nossa API (http://easyframework.net/2.x/api). Se voc precisar de ajuda, participe do nosso frum. Bem-vindo ao EasyFw!
Sugestes de leitura
Essas so tarefas comuns quando utilizamos o EasyFw: 1. Layouts: Customizando o layout de sua aplicao 2. Uma pequena aplicao utilizando Autenticao e Autorizao : Autenticao e Autorizao de usurios
21
Leitura Adicional
Uma requisio tpica no EasyFw
Ns cobrimos os ingredientes bsicos do EasyFw, ento vamos dar uma olhada em uma requisio bsica. Continuando com o exemplo principal, imagine que nosso amigo Ricardo clicou em comprar um livro. 1. Ricardo clica em um link que aponta para http://www.example.com/livros/comprar e o browser dele fez uma requisio para o servidor.
2. O Router ir decodificar a URL para extrair parmetros para a requisio, nessa ordem: O controller, action, e qualquer argumento que afete a lgica de negcio da aplicao. 3. Usando rotas, a URL requisitada mapeada para uma action de um controller. Nesse caso, o mtodo comprar() do controller LivrosController. O callback beforeFilter() chamado antes que qualquer action seja executada. 4. O controller poder estar utilizando Modelos para acessar dados da aplicao. Nesse exemplo o controller usa um modelo para acessar as ltimas compras do Ricardo. Qualquer call-back do modelo, datasources e behaviors sero utilizados nesse instante. 5. Depois que o modelo recuperou os dados e retornou para o controller, outros call-backs do modelo sero disparados. 6. O controller poder utilizar componentes para realizar operaes especificas (manipulao de sesso, autenticao ou enviar e-mails por exemplo). 7. Uma vez que o controller utilizou os modelos e componentes para ter dados suficientes para realizar a operao, esses dados so passados para a view caso necessrio. Os call-backs so disparados antes de renderizar a view. A lgica da view realizada, podendo incluir elementos e helpers. Por padro uma view e renderizada dentro de um layout. 8. Callbacks adicionais so disparados (como o afterFilter). A renderizao completada e enviada para o browser do Ricardo.
Convenes do EasyFw
Ns gostamos de utilizar configuraes por convenes, isso ir ajud-lo a poupar tempo: seguindo as convenes, voc tem funcionalidades prontas e evita estar sempre reconfigurando os arquivos de configuraes. As convenes so bem flexveis, e permitem que voc tenha suas prprias convenes, evitando estar engessado ao framework. Programe da maneira que voc gosta, mas siga um padro.
23
A pasta App
Vamos analisar a principal pasta do EasyFw onde, voc ir trabalhar. Config Esto todas as configuraes da aplicao. Controller Contm os controllers e components da aplicao. Locale Armazena s strings de internacionalizao. Model Contm os models, behaviors e datasources da aplicao. tmp Aqui o EasyFw armazena dados temporrios como cache, logs e descries dos modelos. View - Arquivos de apresentao so armazenados aqui. Elementos, Pages, Layouts. webroot So seus arquivos pblicos, ou seja, os CSS, JS e imagens de sua aplicao.
Estendendo o EasyFw
Controllers e models cada um deles tem sua classe me para definir comportamentos para todos eles. AppController (localizado em /App/Controller/AppController.php) e AppModel (localizado em /App/Model/AppModel.php)
25