Conheça o Easy Framework

Ítalo Lelis de Vietro
em Framework

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

 

  • 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/

Mensagem do anunciante:

Em apoio à evangelização do WordPress, os cursos da Apiki são gratuitos para que você possa se especializar na plataforma que mais cresce no mundo. Vagas limitadas, Inscreva-se agora.

Ítalo Lelis de Vietro

Engenheiro de Software na HelloFresh em Berlin, é graduado em Análise e Desenvolvimento de Sistemas e especialista em Engenharia de Software. Já trabalhou em grandes projetos para o governo federal e grande empresas do setor privado com tecnologias como VB6, VB.NET, C#, Java, Javascript, Python, Ruby, Node.js, PHP entre outras. http://italolelis.com/

77 comentários Comente também

  1. O autor do artigo disse que começou o projeto em 2011. Ao invés de criticar, juntem-se ao desenvolvimento ou ajudem com críticas construtivas. Tem a terceira opção: parabenizar pela INICIATIVA, continuar usando o framework que ja usam e ficar quietos.

    Eu também prefiro meu próprio framework por questão de costume e porque venho desenvolvendo ele há 5 anos, mas acho muito bom este tipo de iniciativa e lendo alguns pontos sempre podem surgir idéias para melhorar meu próprio código. A alma do negócio é COMPARTILHAR conhecimento galera.

    1. Concordo, pena as pessoas só quererem criticar e ainda sem saber… Nem ao menos uma crítica construtiva é posta.

      Ótima iniciativa Lelis, já tinha visto por alto o EasyFW e agora com este artigo foi estou vendo a simplicidade e facilidade de desenvolvimento com o Easy. Quando tiver um pouco mais de tempo estarei fazendo pequenas aplicações para teste e também tentarei contribuir com o projeto.

      :)

  2. Excelente projeto … a simplicidade é excelente … agora dizer que Zend Framework é Easy é forçar demais a barra rs rs rs … ta virando um trambolho de complicação estilo Java. Laravel php framework faz o zend parecer coisa de criança. Ainda mais a versão 2 do Zend onde pra configurar um módulo é a mesma burocracia de um atendimento em repartição pública.

    Vou Utilizar o easy. Achou legal essa coisa de deixar as coisas mais flexíveis.

    1. O Zend Framework é bom quando você o usa como uma biblioteca de classes, ou seja, você instancia lá Zend_File e usa ele. Se quiser criar uma estrutura MVC pode-se utilizar o ZF também, mas nesse caso é mais complicado.

      Não vamos diminuir nenhum framework existente no mercado, todos tem os seus prós e contras

  3. Então pessoal, é como o Alexandre disse, o projeto está no começo ainda, por isso estou divulgando, é para conseguir uma ajuda no desenvolvimento.
    Só para constar, tem uma ferramenta que gera os models automaticamente através do seu banco de dados, mas como não era o foco deste artigo ainda não falei sobre ela, vou aborda-la em outros artigos.

    Obrigado pelo apoio pessoal.

  4. Já estou trabalhando na nova documentação em português, comecei com ela em inglês pois eu só tinha o apoio da comunidade CAKE-PHP, mas agora temos apoio da comunidade PHP-PB e CAKE-PHP, teremos a documentação nas duas linguagens.
    Acredito que a versão em português esteja no ar até o domingo.

  5. Vamos valorizar o trabalho do Italo, Brasileiro, construiu um framework sem nenhum recurso, e está disponibilizando gratuitamente. Em vez de criticar, deveríamos incentivá-lo e até mesmo ajudá-lo, por que não!!!

  6. Eu retiro o que eu disse no primeiro comentario

    Eu acho o zend muito bom.. mas qualquer iniciativa de programação deve ser incentivada..

    ate pq eu nao programo mais que o Italo

    Boa sorte com seu projeto!!!

  7. Cara, muito nobre da sua parte meter a cara e desenvolver algo assim para a comunidade. Me entristece saber que existem pessoas mal agradecidas e plumitivas que fazem qualquer blame contra a sua honrosa atitude.

    Não se deixe levar por elas, cara. Eu achei genial a framework e com certeza vou deixar minha marquinha nela.

    De verdade, parabéns!

    1. Obrigado Guilherme,
      Realmente minha intenção é sempre ajudar a comunidade, até por que conhecimento é de todos.
      Fico muito grato a todos que gostaram do projeto e querem ajudar também.
      Vou continuar sempre melhorando ele para poder ajudar a todos.
      Vlw galera.

  8. Kra..parabens pela iniciativa..acho valido pra caramba sua iniciativa..grandes ideias surgem apartir de projetos assim..fico decepcionado com “programadores” que são contrários a novidades e não querem sair do seu mundinho..com seu frameworkzinho..fazendo seu trabalhinho…gente assim NÃO é programador..simplesmente..excelentes COPIADORES de código…torço para que o projeto dê certo..

  9. Parabens pela iniciativa Ítalo, não sou brasileiro (sou angolano) mas pelo pouco que vi deste post, vejo que tem tudo para ser uma grande solução brasileira, nunca vi antes um framework PHP que usasse annotation para definir relacionamento entre tabelas e outras coisas mais, isto para mim é uma grande novidade, eu também tenho/desenvolvo/mentenho um framework como consequência da minha experiência e do muito trabalho que tinha a cada novo projecto, desde já saíba que baixarei o teu Framework e estudarei de modos a que possa contribuir bem como enriquecer também o meu, infelizmente aqui em Angola ainda não existe esta coisa de comunidade, e como consequência não consigo ter uma documentação e desenvolver ao mesmo tempo, mas farei o possível para também passar o que tenho, Parabens e força…

  10. Ítalo, parabéns pela inciativa. Se pudesse certamente ajudaria no que vc precisasse.
    Uma dica para proximas versões…..
    – Sobre a Estrutura de diretórios, as novas versões dos FW’s mais utilizados( por exemplo ZF2, projetos para o Prado entre outros ) estão fugindo dessa estrutura proposta pelo Easy, que acredito estar baseada no Symfony. Imagino que a disposta pelo Zf2 é tendencia para a programação PHP em curto a medio prazo.
    -Quanto ao Dependency injection e gerencimento de eventos, gerenciamento de serviço, quando os programadores PHP, lógico aqueles que não sabem, aprederem e notarem a diferença que esses conceitos traz à aplicação e ao desenvolvimento de projetos, principalmente aos projetos de média e alta complexidade, certamente eles não abrirão mão de usar essas ferramentas. Isso pode ser um risco para o Easy.
    Força…

    1. Franklim, muito bom você ter dado essas dicas.
      Até a versão final do EasyFw já vai ter algumas coisas que você falou,
      estou trabalhando para integrar o Composer para injeção de dependência, ele já está quase pronto, também estou construindo um skeleton application para iniciar o projeto.
      Quanto a estrutura das pastas eu me basei no CakePHP, mas já estou alterando algumas coisas para se adaptar a nova estrutura dos frameworks.
      Muito obrigado pelo seu feedback, gostei mesmo.

    1. Exatamente Paulo,
      ele tem muitas coisas parecidas com o CakePHP, pois no inicio do projeto nós tinhamos apenas a colaboração deles.

      Agora na nova versão as coisas estão mudando e ficando mais flexíveis, mais fáceis de mexer integrar e interagir.

      Espero que goste das novidades. =)

      1. Daniel,

        O iMasters é feito pela comunidade para a comunidade. Se o projeto é aberto, interessante(pode ver pelos outros comentários) e visa agregar valor e conhecimento porque não deveríamos publicar?

  11. Ítalo, não ligue para as pessoas que dizem que já tem Framework melhor, que já usam e não mudam, eles não sabem o que dizem.

    Parabéns pelo projeto, não me disponho a ajudar por questões de tempo, estou envolvido em alguns projetos pessoais, mas vou acompanhar o projeto de perto.

    Sua iniciativa é louvável e muito bem vinda, como sempre brasileiros negativando tudo que veem, por acharem que brasil não tem gente competente, estas pessoas que são incompetentes…

  12. Parabéns pela iniciativa!
    Deveríamos ter mais brasileiros compartilhando conhecimentos do que “brasileiros” que apenas criticam, sem acrescentar nada.

    “Forkearei” no git para dar uma olhada!

    Abraços e sucesso!

  13. Ei, é uma iniciativa BRASILEIRA, meu povo! Parabéns pelo trabalho. Ítalo, gostaria de opinar em algumas coisas, entrarei em contato para conversarmos sobre alguns pontos após analisar o Framework, ok?

  14. Ítalo, Acho sua iniciativa fantástica porem tenho algumas duvidas, tentei executar essa “Passo a Passo” e encontrei algumas dificuldades:

    1 – quando vc exemplifica o código as informações de criação da classes estão todas juntas. Exp: classCategoriasControllerextendsAppController

    2 – Tentei executar apos a criação de todo o projeto : http://localhost/livraria o mesmo da erro.

    3 – A conexão com os Banco é PDO ?

    4- teria alguma problema de estar usando o Zende Server CE ?

    Abs

    1. Então Mauricio,
      Esse problema das classes juntas foi o wordpress que gerou, eu vou corrigir ele, obrigado por ter avisado.
      O erro que deu na sua aplicação com certeza foi por causa da renderização do wordpress, eu vou corrigir isso e vai dar certo.
      A conexão é feita via PDO, apesar de que pode ser utilizado bibliotecas como o MySQli.
      Nãao existe nenhum problema em usar o Zend Server, eu já utilizei e tudo funcionou tranquilamente, apesar que é sempre bom ver se o servidor está com o mod_rewrite ativado e com Allow Overwrite All
      Muito obrigado pelos toques e vou resolver esse problemas no artigo agora.

      1. Italo, Bom dia, não sei se o erro foi por causa do wordpress pois em minha aplicação coloquei a codificação corretamente “class CategoriasController extends AppController” e apache esta configurado com Allow Overwrite All que mudei no conf. Sei que as vezes algumas coisas parecem obvias, mas seria interessante disponibilizar o codigo fonte e colocar os caminhos das URL´s na matéria.

        Abs.

      2. Ah Mauricio realmente, falha minha não ter colocado o fonte, mas já criei um repositório no GitHub com o fonte completo. É só acessar https://github.com/italolelis/livraria e clonar o repositório no seu servidor, clonando ele automaticamente o EasyFw já vem junto.
        Caso você apenas baixe o código (sem clonar), dai você precisa baixar o framework também e coloca-lo na pasta vendor com o nome “easyframework”.

        Pronto lá está todo o código desse artigo, irei ficar atualizando o projeto para cada artigo

  15. Louvo a decisão de Criar um Framework, eu mesmo já me envolvi na criação de um, aprendi muito com isto, pratiquei bastante a codificação, porém depois que conheci o Symofny 2, desisti de tudo, hoje prefiro escrever um bundle para o Symfony do que me esforçar com um framework que vou ter que sempre estar evoluindo detalhes nos quais não estou afim.

  16. Parabéns Italo, estou desenvolvendo um Framework também para uso interno da minha empresa e não é mole não, pessoal fica criticando mas não sabe o trabalho que dá. Acho que o pessoal que fica criticando deveria era ajudar o projeto e tentar incrementar suas ideias.

    Como ja tinha falado, parabéns pela sua inciativa, admiro seu esforço, não desista e boa sorte com o projeto!

      1. cara, parabenizo a sua idéia, criar um framework é bem complicado. digo isso por que também desenvolvi um fw e o utilizo em aplicações pesadas com milhares de acessos. Mas me deparei com os seguintes questionamentos:

        A grande vantagem da criação de um framework, é ele obter vantagens e algo novo em relação aos outros frameworks do mercado.

        É necessário criar testes comparativos em relação a outros frameworks, isso é inevitável.

        PHP mesmo na 5.4, ainda tem um consumo razoável de memória usando muitos objetos.

        dentre outros, só para constar, conheci um frame, chamado phalcon PHP, escrito inteiramente em C. usa MVC e as melhores práticas de desenvolvimento, vence todos os frames php no quesito desempenho e ainda é muito elegante, como uma DSL.

        no mais boa sorte. precisamos de um fw nacional de peso. mas sugiro também um bom projeto para reaproveitar aquilo que já existe, sem reinventar a roda.

  17. Parabéns Ítalo. É muito gratificante ver o trabalho de um brasileiro sendo gerado e recebendo apoio dos colegas. Vc vai encontrar obstáculos, mas olhe para frente, veja seu objetivo maior e vá adiante. Vc merece e terá a vitória! Deus te abençoe…

  18. Cara parabéns pela iniciativa de divulgação , criticar é muito simples , basta ignorar esse tipo de critica idiota , como já foi dito anteriormente la fora o pessoal dar a maior força , incetiva e tal e aqui é essa falta de respeito com as pessoas (e seus trabalhos), é uma pena .
    Mais uma vez , parabéns por sua iniciativa !

  19. Parabéns pela iniciativa, mto bacana. Não se abale pelas críticas, elas sempre existirão. Assim que tiver um tempinho vou lá no github e se possível quero ajudar.

Dê Sua Opinião

O seu endereço de email não será publicado Campos obrigatórios são marcados *


um × = 8

leia mais
Este projeto é mantido e patrocinado pelas empresas:
Hospedado por: