Fala, pessoal, tudo tranquilo?
Hoje gostaria de apresentar para vocês um novo Framework para PHP. Nossa, mais um??
Acreditem, esse é diferente.
O Easy Framework foi desenvolvido por mim (Ítalo Lelis de Vietro) e é um dos poucos frameworks brasileiros. O projeto teve início em junho de 2011, quando senti a necessidade de uma ferramenta de auxílio para o desenvolvimento de aplicações ágeis em PHP (RapidApplicationDevelopment) e com facilidade para manter o código. Hoje o projeto conta com o suporte da comunidade PHP-PB e promete ser um ótimo framework.
Vamos aprender a criar uma aplicação simples com o EasyFw. Que tal criarmos um aplicativo para cadastrar livros de uma livraria?
Baixando o EasyFw
Primeiramente precisamos baixar a versão 2.0.0, que é a que vou utilizar no exemplo de hoje. Para isso, basta acessar o site do EasyFw.
Após isso, descompacte os arquivos no seu servidor web. Agora podemos criar nosso projeto. Existe uma pasta chamada demos, e nela temos um helloworld. Se você quiser, pode copiá-la para uma estrutura que fica mais ou menos assim.
- livraria
- easyframework
Agora, nessa estrutura, acesse livraria/App/webroot/index.php e mude a linha que informa onde nosso núcleo está.
$easy = '../../../easyframework/framework/Easy/bootstrap.php';
Estrutura de pastas
A estrutura de pastas do EasyFw é simples e lógica. Como já trabalhamos com namespaces, será muito fácil seguir uma hierarquia de pastas. Vamos conhecer a estrutura padrão:
- livraria
- App – Aqui é a raiz de nosso projeto
- Config – Todas as configurações padrão estarão aqui
- Controller – Os controllers da nossa aplicação
- Components – Componentes que você quiser criar
- Locale – Arquivos de tradução da aplicação
- Model– Os Modelos da app
- Vendors – Bibliotecas de terceiros do projeto
- View
- Elements – Os elementos para compor uma página
- Layouts – Os layouts da aplicação
- Pages – As views
- tmp – Arquivos de cache
- webroot – CSS, JS e imagens
- App – Aqui é a raiz de nosso projeto
- easyframework – Diretório do núcleo do EasyFw
Essa estrutura nos permite criar vários projetos utilizando o mesmo núcleo.
Criando o banco de dados
Entendida a estrutura das pastas da aplicação, vamos trabalhar na criação do banco de dados.
Como nosso aplicativo será um cadastro de livros, teremos duas tabelas: uma para os livros e outra para as categorias.
CREATE DATABASE livraria
Com isso vamos criar as tabelas, começando pelos livros
CREATE TABLE `livros` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `titulo` varchar(45) NOT NULL, `descricao` varchar(255) DEFAULT NULL, `ano` int(11) DEFAULT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `categoria_id` bigint(20) NOT NULL, PRIMARY KEY (`id`), KEY `FK_livros_categorias` (`categoria_id `), CONSTRAINT `FK_livros_categorias` FOREIGN KEY (`categoria_id `) REFERENCES `categorias` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
E agora a tabela de categorias:
CREATE TABLE `categorias` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `nome` varchar(45) NOT NULL, `status` varchar(10) NOT NULL DEFAULT 'ATIVO', `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Pronto, agora nós já podemos criar as configurações para nossa aplicação acessar o banco. Para isso. saiba qual a senha e usuário para acessar o seu SGBD.
Vá até a pasta de configurações no arquivo database.yml. App/Config/database.yml
Nele, você poderá setar diversas informações sobre o banco de dados, inclusive qual utilizar para testes, produção ou desenvolvimento. Para nosso exemplo, utilizaremos apenas o banco de desenvolvimento. Vejamos como configurá-lo.
datasource:
development:
default:
driver: mysql
host: localhost
user: root
password: ''
database: livraria
encoding: utf8
prefix: ''
production:
default:
driver: mysql
host: localhost
user: seuUsuario
password: "suaSenha"
database: seuBancoDeProducao
encoding: utf8
prefix: ''
Acredito que o arquivo seja simples de configurar, mas vou explicar o que cada opção faz:
driver: Informamos qual o driver iremos utilizar (MySQL, SQLite, Oracle)
host: Onde nosso banco de dados está localizado
user: O usuário para acessarmos nosso banco
password: A senha para acessarmos nosso banco
database: O nome do banco
encoding: A codificação que usaremos no banco (UTF-8)
prefix: O prefixo para as tabelas
Com isso, já temos nosso banco rodando na aplicação, mas ainda temos que criar os modelos e os controllers para que a aplicação funcione corretamente.
Criando os models
Vamos criar nosso primeiro modelo.
<?php namespace App\Model; /** * @TableName(“categorias”) */ class Categorias extendsAppModel { }
Nosso modelo irá herdar da classe AppModel, que está no mesmo namespace do nosso modelo App\Model, que por sua vez herda de \Easy\Model\Model.
O nome do modelo será o mesmo nome da tabela, só que ATENÇÃO: ele está no singular e a tabela, no plural. Isso não é uma regra no EasyFw, mas uma convenção para simplificarmos as coisas.
Outra coisa importante de ressaltar é que nossos modelos podem ser orientados a aspectos (anotações), nome a anotação @TableName – nela, informamos a tabela do banco de dados que nosso modelo representa. Caso o nome do seu modelo seja o singular de sua tabela, o EasyFw já fará isso automaticamente e você pode omitir essa anotação, só coloquei ali para ilustrar.
Vamos criar nosso segundo modelo:
namespaceApp\Model; /** * @TableName(“livros”) * @HasOne (“Categoria”) */ classLivroextendsAppModel { }
Notem que esse modelo tem um relacionamento com categorias, nosso relacionamento diz o seguinte: um livro pertence a uma categoria. Para isso, nós usamos a anotação HasOne para dizermos que nosso modelo Livro tem um modelo Categoria relacionado a ele.
Os dois arquivos devem ser salvos dentro da nossa pasta de Modelos App\Model, com os nome Categoria.php e Livro.php.
Criando os controllers
É aqui que a mágica acontece. Os controllers vão receber as requisições dos usuários, interagir com os modelos e devolver uma página para ele.
Vamos criar o controler de categorias primeiro:
namespace App\Controller; use Easy\Model\FindMethod; classCategoriasControllerextendsAppController { }
Notem novamente as convenções: o nome de nosso controller agora está no plural, isso permitirá o EasyFw saber que esse controller interage com nosso modelo Categoria, e ele já vai disponibilizar uma variável $this->Categoria para você acessar seu modelo, sem precisar se preocupar em instanciá-lo.
Agora precisamos criar as actions para o usuário interagir com nosso controle e realizar as operações básicas de um CRUD. Para isso, vamos criar a primeira action de listagem:
public function index() { //Pegamos todas as categorias do banco $categorias = $this->Categoria->getEntityManager()->find(null, FindMethod::ALL); //Aqui iremos passer a variável para a view $this->categorias = $categorias }
Essa action irá pegar todas as categorias do banco e retornar para a variável categorias. Logo em seguida, nós criamos uma variável dinamicamente na View com o nome de categorias.
Agora vamos criar a action para adicionar uma categoria
public function add() { If ($this->RequestHandler->isPost()){ //Vamos salvar os dados que vieram de um formulário de cadastro $this->Categorias->save($this->data); //redirecionamos para a listagem $this->redirectToAction(“index”); } }
Nessa action existe um fluxo a ser seguido, vamos entendê-lo:
O usuário irá requisitar uma View para cadastrar a categoria, então irá chamar a actionadd. Ela vai verificar se a requisição veio via POST. Como não veio, ela passa pelo if e exibe a View para o usuário.
Depois de clicar no botão de cadastrar, novamente a requisição irá para a actionadd, mas agora ela veio via POST e entrará no if, e nós vamos pegar os dados do formulário na variável $this->data, e vamos salvá-lo no nosso modelo.
Por enquanto, vamos ficar apenas com essas duas actions.
Salvem esse arquivo na pasta App/Controller com o nome CategoriasController.php
Criando as views
Vamos entender como o EasyFw trabalha com as Views.
Primeiramente, o Easy irá procurar um diretório dentro das views com o nome do Controller requisitado, como por exemplo Categorias, e dentro dessa pasta ele irá procurar um arquivo com o nome da action. Exemplo: index.tpl – é nela que vamos colocar a listagem das nossas categorias.
Depois disso, ele irá procurar por um Layout que nossa View irá herdar. Vamos começar criando o layout.
Nossas Views trabalham com o Smarty Template Engine, para realizar a abstração do PHP.
<!DOCTYPE html>
<html>
<head>
{$Html->charset()}
<title>{__(“Livraria”)}</title>
</head>
<body>
<div id="content">
{block name=”content”}{/block}
</div>
</body>
</html>
Esse é o nosso layout, ele é bem simples, mas vamos ver como ele funciona.
Nós vamos utilizar um Helper chamado $Html. Com ele, podemos tirar o trabalho de ficar digitando Html puro na mão. Por exemplo, o $Html->charset() irá imprimir “<meta charset=”utf-8”>”. Esse helper já irá identificar se você está utilizando o DOCTYPE do HTML5 e imprime o meta tag correto para você com o charset que sua aplicação utiliza. Viu como é simples?
Na linha de baixo, nós temos {__(“Livraria”)}, por que colocamos essa string entre os parentes? Simples… com isso, nós já temos suporte para internacionalizar nossa aplicação. Essa função irá gerar um arquivo de tradução para você, e você simplesmente pode traduzi-lo para outra língua e utilizá-lo na sua app, sem precisar alterar seu código.
Na divcontent, temos uma coisa chama {blockname=”content”}{/block} – é aqui que o conteúdo da View será impresso. Isso se chama herança de templates, e nos ajuda bastante a não ficar digitando o HTML completo para cada View.
Agora peguem esse arquivo e salvem-no na pasta App/View/Layouts com o nome de Layout.tpl
Vamos criar nossa View para listar as categorias:
<h1>{__(“Listagem de Categorias”)}</h1>
<tablewidth="100%" cellspacing="0" cellpadding="0">
<trbgcolor="#F0F0F0">
<td>Id</td>
<td>Nome</td>
<td>Status</td>
<td>Ações</td>
</tr>
{foreach $categorias as $categoria}
<tr>
<td>{$categoria->id}</td>
<td>{$categoria->nome}</td>
<td>{$categoria->status}</td>
<td>
{$Html->actionLink(“Editar”, “edit”, true, $categoria->id)}
{$Html->actionLink(“Excluir”, “delete”, true, $categoria->id)}</tr>
{/foreach}
Essa é a nossa view para listagem, ela é bem simples. Observem que utilizamos uma estrutura de laço de repetição, o foreach. No Smarty fazemos dessa forma {foreach $var as $v}, e ele irá iterar sobre sua coleção.
Também utilizamos outro método do HelperHtml, o actionLink, que irá criar um link para as actions no controller que você quiser. No nosso caso, ele vai imprimir:
<ahref=”http::/localhost/livraria/edit/1”>Editar</a> <ahref=”http::/localhost/livraria/delete/1”>Excluir</a>
Salve esse arquivo na pasta de viewsApp/Views/Pages/Categorias com o nome de index.tpl
Estamos quase acabando o exemplo, só falta criarmos uma View da página inicial para o usuário ver alguma coisa. Para isso, crie um arquivo chamado index.tpl na pasta App/Views/Pages/Home.
<h1>{__(“Bem Vindo ao exemplo de Livraria”)}</h1>
{$Html->actionLink(null, “categorias”)}
Conclusão
Por enquanto, vamos ficando por aqui. Espero que tenham gostado do exemplo. Nos próximos artigos, vamos saber como adicionar, editar e excluir as Categorias e os Livros do nosso exemplo.
Obrigado pelo apoio e atenção pessoal. Abraços.
Links
Site do Framework: http://www.easyframework.net
Repositório no Github: https://github.com/LellysInformatica/EasyFramework
Site da comunidade PHP-PB: http://php-pb.net/