Olá, pessoal! É bom estar de volta nos artigos do iMasters! Após esse tempo afastado pude experimentar muitas tecnologias diferentes, saindo um pouco do Framework Flex e partindo para novos desafios. Conheci de tudo um pouco e, após estar concursado, pude explorar um novo mercado, o que foi algo muito motivador para que eu pudesse escrever aqui.
Hoje faço parte de uma equipe de desenvolvimento de software da Universidade Federal de Juiz de Fora, e venho nos últimos três anos trabalhando em um framework chamado Maestro. Com certeza você não o conhece, pois este framework nasceu aqui na própria Universidade, e vem se destacando no meio acadêmico como uma solução eficiente no desenvolvimento de software. Este artigo é uma introdução a este framework, no qual eu espero que seja apenas o primeiro de muitos que virão pela frente.
O que é o Maestro Framework?
Basicamente, o Maestro é um framework MVC na linguagem PHP. Ele nasceu através da reunião de diversos frameworks existentes no mercado. Nós pegamos cada boa ideia e fomos agrupando, de forma a criar uma forma muito robusta de desenvolver software rápido, atendendo as necessidades da instituição. O Maestro, quando concebido, foi a base para o desenvolvimento de uma ERP acadêmica a qual chamamos de SIGA – que veremos algumas telas no final do artigo.
Dado o sucesso desta ERP, resolvi começar um trabalho sólido neste framework, tanto de divulgação quanto de suporte, que falarei ao longo dos meus próximos artigos aqui no iMasters.
Voltando ao framework, vamos falar um pouco sobre algumas características que fazem dele único. A primeira delas, e a que eu mais gosto, é que o maestro é um framework para desenvolvimento de software. Um software consiste de três operações básicas, que são:
- Entrada de dados: Todo software necessita de entrada de dados. Na maioria das vezes esta entrada é realizada através de um formulário. Um formulário consiste de dezenas de campos que devem ser organizados de forma a facilitar o trabalho de quem entra com estes dados. Como vocês devem saber, somente a linguagem HTML não dá suporte a entrada de dados mais complexa, ou seja, quando você precisa de algo a mais como uma validação ou uma máscara, o HTML vai te deixar na mão. No caso do maestro, temos dezenas de componentes prontos para uso. Quando você ver nossos exemplos, tenho certeza que vai adorar.
- Processamento de dados: na maioria das vezes o processamento de dados está ligado a persistir dados em uma tabela. Além disso, em sistemas normais (tirando aqueles cruds ridículos), a persistência está lidaga a mais tabelas, que devem funcionar como um todo. O maestro possui uma camada de persistência que usa as ideias de outro framework, o hibernate. Você verá em nossos exemplos que persistir e obter dados de uma tabela nunca foi tão fácil.
- Exibição de dados: dados podem ser exibidos diretamente na tela, e devem estar agrupados por uma tabela – a qual chamamos de grid. O Maestro possui diversas opções de grids para que os dados sejam vistos no navegador, incluindo uma paginação eficiente. Além de tabelas, dados também podem ser exibidos através de relatórios e para isso usamos uma tecnologia muito eficiente chamada Jasper Reports, que exibem relatórios através de arquivos PDF.
Como podemos ver, o Maestro é um framework focado em sistemas. Ele foi feito para isso e foi feito para ser a base dos sistemas da nossa instituição. Diferentemente de outros frameworks, o ele não foi desenvolvido, a princípio, para se fazer um site ou uma página dinâmica como um cms ou um blog. Isso pode ser possível, claro, mas o framework está otimizado para a criação de formulários, o processamento deles, e a exibição de dados através de relatórios e grids.
Compatibilidade com o browser
O Maestro é compatível com qualquer browser webkit. Nele temos o Chrome, o Firefox, Opera ou Safari. Pode esquecer o Internet Explorer, o Maestro não foi feito para ele.
Requisitos mínimos
A linguagem base do Maestro é o PHP. Atualmente a versão mínima do PHP suportada é a 5.4, então fique atento a isso. O servidor web que utilizamos é o Apache e os banco de dados compatíveis são MySql, PostegreSQL, Oracle e SQLite. Nós testamos com sucesso tanto o Apache no Linux, quanto o Apache do WAMP server para o Windows. Ainda não testamos no IIS+PHP, mas acreditamos que funcione também.
MVC + Componentes
Possivelmente a metodologia MVC é bem conhecida por todos vocês. No desenvolvimento de software, ficou comum dividir cada parte do software em camadas. A camada que persiste os dados fica na camada model, a que recebe as requisições e controla o fluxo da aplicação fica no controller, enquanto a que exibe informações na tela é a view. Diversos frameworks em PHP se destacam e bem só por respeitar estas camadas, mas o Maestro foi mais além. Na camada view também implementamos o suporte a componentes, algo muito bem visto para o desenvolvimento de sistemas. Em um simples exemplos, temos um componente que assume a forma de uma caixa de texto para a entrada de CPF, algo que para ser feito apenas com HTML e Javascript envolve um pequeno esforço do programador, ou a inclusão de bibliotecas “estranhas” ao projeto. Veremos todos esses passos ao longe deste artigo.
Deficiências
É claro que o framework possui algumas deficiências. Somos sinceros em afirmar que determinados pontos ainda não foram pensados. Por exemplo, não existe suporte eficiente para testes unitários. Isso acontece porque somos muito focados na prática, criamos dia a dia diversas ferramentas úteis ao nossos usuários e, sinceramente, os testes unitários não nos ajudam muito. O framework também possui poucos recursos para a geração de classes, assim como você vê em outros frameworks onde para criar um controller basta uma linha de comando. Ainda não temos este suporte mas ele está na nossa lista. Não temos suporte ao navegador Internet Explorer, e possivelmente não teremos, dado que não precisamos dele em nossa instituição.
Show me the code!
Você já deve estar um pouco curioso para ver o código. Fique tranquilo, eu sei bem como é isso. Nos exemplos a seguir, vamos mostrar alguns fragmentos de código para que você comece a entender como o framework funciona. Se você gostar do código, terá mais detalhes de como o fluxo funciona no próximo tópico.
public function listByFilter($filter) { $criteria = $this::getCriteria()->select('*, nome'); if ($filter->nome) { $criteria->where("nome LIKE '%{$filter->nome}%'"); } if ($filter->matricula) { $criteria->where("matricula LIKE '{$filter->matricula}%'"); } return $criteria; }
O exemplo acima mostra um pouco da camada de persistência do framework, na qual podemos criar um objeto (stdclass) e repassá-lo ao método genérico listbyfilter. Geralmente estas pesquisas são retornadas a um Datagrid, onde ele irá entender perfeitamente o objeto criteria. Também pode-se realizar uma SQL normal, conforme o código a seguir.
public function criteriaCommand02() { $criteria = $this->getCriteria( "select matricula, nome, U.login " . "from pessoa left join usuario U on (pessoa.idPessoa = U.idPessoa)" ); return $criteria; }
No próximo exemplo, temos um método do controller, que irá chamar o método listbyfilter e atribuir esse resultado a uma variável chamada $this->data->query:
public function formFind() { $model = new Aluno($this->data->id); $this->data->object = $model->getData(); $this->data->query = $model->listByFilter($this->data->filter)->asQuery(); $this->render(); }
Veja que estamos montando um exemplo com model, controller e agora, view. A view do framework é criada em XML, conforme o exemplo a seguir:
<?xml version="1.0"?> <!DOCTYPE view SYSTEM "../../../../public/layouts/view.dtd"> <view> <javascript onload="console.log(dojo.byId('filter::matricula').value);"/> <mformaction id="formFind" title="Pesquisar" close=">exemplos/main" base="formBase"> <fields> <mhcontainer> <mtextfield id="filter::matricula" label="Matricula" value="$this->data->filter->matricula" size="15" /> <mtextfield id="filter::nome" label="Nome" value="$this->data->filter->nome" size="25" /> <mbuttonfind/> </mhcontainer> <mdatagrid id="gridFind" query="$this->data->query" pageLength="15"> <mdatagridcolumn field="idAluno" visible="false"/> <mdatagridcolumn type="link" field="matricula" action=">exemplos/aluno/formObject/#0#" title="Matricula" width="20%"/> <mdatagridcolumn field="nome" title="Nome" width="100%"/> </mdatagrid> </fields> </mformaction> </view>
No exemplo acima, temos um XMl que representa a view da aplicação. Esta view nos traz diversos recursos interessantes que estaremos aprendendo ao longo dos artigos. Veja que o componente mformaction possui um parâmetro base, isto é, nós podemos herdar formulários de forma a criar uma estrutura hierárquica. Também temos métodos no cliente (em javascript), como o onload. Na definição dos campos do formulário, temos um componente chamado mhcontainer, que irá colocar os campos lado a lado na forma horizontal. Ou seja, os campos nome e matrícula ficam lado a lado, além de um botão chamado buttonfind, que mostra um botão na tela com uma lupa. Após o container horizontal, temos outro componente, que é o mdatagrid. Ele possui uma propriedade chamada query, que aponta para a mesma variável definida no controller, $this->data->query. Além disso, também temos uma propriedade pagelength, que define o tamanho de cada página do grid. O mgridcolumn também tem a definição de suas colunas, contendo três sendo que a primeira está escondida, e a segunda é um link para outro formulário. O resultado desta view é visto a seguir:
Estes três exemplos de código mostram apenas um pouco do framework. Para que você entenda-os completamente, é preciso ir mais a fundo no fluxo do framework e estaremos vendo isso logo a seguir.
Fluxo do framework
Todo framework possui um fluxo de código no qual devemos entendê-lo. Se você já conhece MVC não será difícil programar em Maestro. O fluxo é apresentado logo a seguir:
Na verdade, o Maestro funciona de forma análoga ao MVC. Primeiro, temos a requisição HTTP, que é composto pela url de acesso. O controller fica responsável em “conversar” com o model e, logo a seguir, chamar a view para que ela possa ser renderizada. Após isso, a resposta HTTP (código html, javascript, etc) será retornado ao navegador.
Indo um pouco mais a fundo nesse fluxo, temos:
O fluxo acima pode ser exemplificado da seguinte forma:
- Uma requisição HTTP é feita pelo usuário e o servidor web trata esta requisição executando o script index.php;
- Um objeto Manager é instanciado e a aplicação é executada;
- Os dados enviados pelo usuário são armazenados no objeto $data;
- O framework analisa a URL e define qual o Controller/Action será executado;
- A Action executa os comandos (acessando os modelos, se necessário);
- A Action renderiza a view;
- A view é construída com base em arquivos de template (que definem o layout, scripts e CSS, quando necessário), definindo alguns controles;
- O resultado construído pela View é escrito como uma resposta HTTP, enviada para o browser.
Se você gostou do que viu até agora, espere nosso próximo artigo no qual iremos aprender a instalar o Maestro e acessar os exemplos, para saber mais detalhes do framework.
Até lá!