Conheça o Maestro Framework

PorDaniel Schmitz em

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:

  1. 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.
  2. 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.
  3. 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:

tela01-maestro

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:

Fluxo do maestro, igual ao MVC

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:

Fluxo mais detalhado

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á!

Deixe um comentário! 25

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Comentando como Anônimo

  1. Como um framework hoje em dia nasce sem aplicar o que é mais importante, que são as técnicas para melhorar qualidade?
    Se não tem um bom suporte à testes pra mim é descartável.

    1. Olá, você pode aplicar testes unitários em suas aplicações maestro, nao há nenhum impedimento para isso. Só ainda não temos um suporte na geração de classes e na automação para isso. Só lembrando que o framework foi concebido para ser o mais prático possível, e estamos tendo sucesso nisso.

  2. Interessante, atualmente utilizo CodeIgniter para minhas aplicações e sou bem feliz com ele já que me atende dentro do que eu preciso, mas conhecimento e comparativos sempre é bom, afinal de contas o que importa no final é o resultado rápido. Não vi o site do Framework no Artigo, eu sou cego? Caso não, me passe ae, gostaria de conhecer o Framework em detalhes. Obrigado e bom Artigo.

    1. Olá, nós também estudamos frameworks como o CI e o laravel, todos são muito bons, mas nosso principal problema foram os componentes, tais como uma grid com paginação ou uma caixa de texto para CPF. No próximo artigo iremos aprender a instalar e analisar o fluxo de execução do framework.

      Desculpas por nao mostrar um link, realmente precisou para matar a curiosidade do pessoal. Segue nosso site: http://maestro.org.br/

      1. Olá Daniel, talvez já tenha dado uma olhada na forma como o Yii trabalha com componentes de GUI como grids e máscaras, mas não somente isso.

  3. Quais os diferenciais dessa framework em relação à outras no mercado? Além disso, já existe um GitHub?

    No mais, bela iniciativa.

    1. O framework é focado na criação de sistemas. Isso inclui componentes prontos para uso em um fluxo MVC, além de suporte a persistência de dados e relatórios. O sistema administrativo/acadêmico aqui da nossa Universidade possui mais de 200 telas e centenas de arquivos, e está em produção, o que de certa forma é um bom case para que possamos estar divulgando melhor o framework. Vamos ver muito mais dele nos próximos artigos, e estamos preparando-o para o github.

  4. Olá Daniel, parabéns pela iniciativa, fiz alguns testes no site e pude ver recursos bons!! Na minha opinião na parte de visualização, acho q vocês deveriam incorporar por exemplo o bootstrap, que facilita e muito o uso do sistema em outros ambientes.

    Infelizmente tem gente que prefere sentar e pegar alguma coisa pronta na net, do que sentar e ter iniciativa de fazer algo novo e principalmente compartilhar o seu conhecimento adquirido no seu estudo.

    Mais uma vez, meus parabéns pelo trabalho.

    1. Olá, nós já estamos implementando o bootstrap também, possivelmente eu devo fala dele em algum artigo. O design dos componentes usa aquele padrão decorator, então alterar de dojo para bootstrap.

  5. Aqui fala que a versão minima do PHP suportada é a 5.4, já no site fala que ele foi escrito em PHP 5.3. Ou seja, a versão minima não deveria ser 5.3??

  6. Completando a opinião do Vinny, também não acho o final xml uma boa ideia. Legal seria algo parecido com o Twig usado no Symfony 2, que separa de forma clara o que é view do resto do código e ainda te da um código bem limpo, trabalhando em equipes onde vc terá designers q não necessariamente vão ter conhecimento extra de código php ou xml fica bem claro o ganho dessa lógica de template. Vi pouco o esquema de persistência do maestro mas achei interessante, ainda sim gostaria de ver algo bem próximo com Doctrine 2 (ou mesmo o próprio como é feito no Zend2 e Symfony2), mas o que eu gostaria mesmo de saber, que acredito ser o mais importante: o framework está implementando as PSR’s? vi que já está sendo desenvolvido á 3 anos +- e a padronização do PHP é bem recente, talvez não tenha entrado no escopo da arquitetura, então se não foi pensado acho que seria uma ideia fundamental, se já então parabéns, de qualquer forma achei o projeto bem legal e acredito que com o tempo (talvez com a ajuda da comunidade) ele se torne uma boa opção no mercado.

    1. Olá, estamos cientes que faltam algumas coisas como padronização e uma melhor transparência dentro dos processos internos ao framework. Também estamos usando um Template Engine na view (acredito ser o smarty). Acredito que com os exemplos que iremos mostrar tudo vai ficar mais claro. Estamos acertando o github aqui (yes no feriado!! hehe) e criando os artigos. Fiquem tranquilos e com a mente aberta, no final teremos um caso de uma app criada através de um diagrama de classes (com o uso do Visual Paradigm ou outro), geração de código e criação de relatórios com o jasper.

  7. EU particularmente não gosto de framework component based, que pelo pouco que vi é seu caso.
    Até o pessoal do Java que são tudo cabeça dura, ultimamente estão adotando action based.
    rsrsrss

  8. Ola Daniel, eu já a muito tempo estou protelando a migração para o mundo WEB não que eu nunca tenha feito nada para a WEB, atualmente ainda usava o FLEX+PHP+ZEND e o que sempre me dificultou a migração para o desenvolvimento direto no php foi justamente a parte de designer e componentes que para mim o flex abstraia muito bem essa questão! em resumo gostei muito do que vi e pretendo conhecer mais desse Framework, parabéns.

  9. Gostei muito da iniciativa. Tb concordo que PSR e git são fundamentais para expandir a possibilidade de mais desenvolvedores conhecerem e, eventualmente adotarem o framework. Parabéns.

leia mais