terça-feira, 31 de maio de 2011

FRAMEWORK MIOLO - modulo de exemplo - Parte II

Vamos agora fazer as classes do domínio. Elas implementam as regras de negócio e encapsulam o acesso à base de dados. As regras de negócio são implementadas através dos métodos do objeto, geralmente através da interação com outros objetos. O acesso à base de dados pode ser feito através da camada DAO do Miolo (através das classes MDatabase, MSQL, MQuery entre outras) ou através da camada de persistência de objetos.

Todas as classes de domínio herdam de MBusiness e são persistentes.

As definições de classes ficam no diretório equipamento/classes.

Os mapas XML usados pela camada de persistência ficam em equipamento/classes/map.



O código a seguir mostra o mapeamento XML - Categoria.
/equipamento/classes/map/categoria.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<map>
   <moduleName>equipamento</moduleName>
   <className>categoria</className>
   <tableName>categoria</tableName>
   <databaseName>equipamento</databaseName>
   <attribute>
      <attributeName>idcategoria</attributeName>
      <columnName>idcategoria</columnName>
      <key>primary</key>
      <idgenerator>seq_categoria</idgenerator>
   </attribute>
   <attribute>
      <attributeName>nome</attributeName>
      <columnName>nome</columnName>
   </attribute>

   <attribute>
      <attributeName>categoria</attributeName>
   </attribute>


   <association>
      <toClassModule>equipamento</toClassModule>
      <toClassName>categoria</toClassName>
      <cardinality>oneToMany</cardinality>
      <target>material</target>
      <retrieveAutomatic>false</retrieveAutomatic>
      <saveAutomatic>false</saveAutomatic>
      <entry>
         <fromAttribute>idcategoria</fromAttribute>
         <toAttribute>idcategoria</toAttribute>
      </entry>
   </association> 
</map>





O código a seguir mostra a definição da classe Categoria
/equipamento/classes/categoria.class

<?php

// As classes de dominio herdam de MBusiness e sao persistentes
// O nome da classe de dominio segue o padrao Business
// para permitir que classes com o mesmo nome sejam usadas em modulos diferentes
class BusinessEquipamentoCategoria extends MBusiness
{
// atributos
public $idCategoria;
public $nome;
public $materiais;

// método construtor 
// No Miolo as classes sao instanciadas através
// de $MIOLO->getBusiness(modulo,classe,parametro)
// se o parametro for um objeto, o construtor chama o metodo setData(parametero)
// se o parametro for um valor, o construtor chama o metodo getById(parametro)
function __construct($data=NULL)
{
// executa o construtor da classe pai; 'equipamento' é o nome da 
// configuracao do banco de dados
// definida no arquivo miolo.conf
parent::__construct('equipamento',$data);
// equipamento de inicializacao de um atributo
$this->nome = '';
}

// acessa o banco de dados para recuperar o objeto com id fornecido
// e retorna o proprio objeto, já com os atributos preenchidos
function getById($id)
{
$this->idCategoria = $id;
$this->retrieve();
return $this;
}

// exemplos de metodos setter/getter
function setNome($nome)
{
$this->nome = $nome;
}

function getNome()
{
return $this->nome;
}

// recebe um "transfer object" e preenche os atributos
function setData($data)
{
$this->idCategoria = $data->idCategoria;
$this->nome = $data->nome;
}

// recupera os registros no banco de dados e retorna um objeto MQuery
function listAll()
{
$criteria =  $this->getCriteria();
$criteria->addOrderAttribute('nome');
return $criteria->retrieveAsQuery();
}

// recupera os registros no banco de dados segundo um criterio
// e retorna um objeto MQuery
function listByNome($nome)
{
$criteria =  $this->getCriteria();
$criteria->addCriteria('nome','LIKE', "$nome");
$criteria->addOrderAttribute('nome');
return $criteria->retrieveAsQuery();
}

// recupera um array de os objetos "material" associados a este curso
// e preeche o atributo $materiais com este array
function getMatriculados()
{
$this->retrieveAssociation('materiais');
}
}
?>



O código a seguir mostra o mapeamento XML - Material.
/equipamento/classes/map/material.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<map>
   <moduleName>equipamento</moduleName>
   <className>material</className>
   <tableName>material</tableName>
   <databaseName>equipamento</databaseName>
   <attribute>
      <attributeName>idmaterial</attributeName>
      <columnName>idmaterial</columnName>
      <key>primary</key>
      <idgenerator>seq_material</idgenerator>
   </attribute>
   <attribute>
      <attributeName>nome</attributeName>
      <columnName>nome</columnName>
   </attribute>
   <attribute>
      <attributeName>marca</attributeName>
      <columnName>marca</columnName>
   </attribute>
   <attribute>
      <attributeName>preco</attributeName>
      <columnName>preco</columnName>
   </attribute>
   <attribute>
      <attributeName>idcategoria</attributeName>
      <columnName>idcategoria</columnName>
   </attribute>
   <attribute>
      <attributeName>categoria</attributeName>
   </attribute>

   <association>
         <toClassModule>equipamento</toClassModule>
         <toClassName>material</toClassName>
         <cardinality>oneToOne</cardinality>
         <target>material</target>
         <retrieveAutomatic>false</retrieveAutomatic>
         <saveAutomatic>false</saveAutomatic>
         <entry>
         <fromAttribute>idcategoria</fromAttribute>
         <toAttribute>idcategoria</toAttribute>
         </entry>
      </association>
</map>


O código a seguir mostra a definição da classe Material
/equipamento/classes/material.class

<?php

class BusinessEquipamentoMaterial extends MBusiness
{
var $idMaterial;
var $nome;
var $marca;
var $preco;
var $idCategoria;
var $categoria;

function __construct($data=NULL)
{
parent::__construct('equipamento',$data);
$this->nome = '';
$this->marca = '';
$this->preco = '';
$this->idCategoria = ':null';
}

function getById($id)
{
$this->idMaterial = $id;
$this->retrieve();
return $this;
}

function setIdMaterial($idMaterial)
{
$this->idMaterial = $idMaterial;
}

function getIdMaterial()
{
return $this->idMaterial;
}

function setNome($nome)
{
$this->nome = $nome;
}

function getNome()
{
return $this->nome;
}

function setPreco($preco)
{
$this->preco = $preco;
}
function getPreco()
{
return $this->preco;
}

function setMarca($marca)
{
$this->marca = $marca;
}

function getMarca()
{
return $this->marca;
}

function setData($data)
{
$this->setIdMaterial($data->idMaterial);
$this->setNome($data->nome);
$this->setPreco($data->preco);
$this->setMarca($data->marca);
}

function listByNome($nome)
{
$criteria =  $this->getCriteria();
$criteria->addCriteria('nome','LIKE', "$nome");
$criteria->addOrderAttribute('nome');
return $criteria->retrieveAsQuery();
}

function cadastrar($categoria)
{
}
}

?>

2 comentários:

  1. Olá,
    Parabéns pelo material.

    Uma dúvida!
    Existe alguma IDE para facilitar a vida do desenvolvedor para aumentar sua produtividade?

    Algo com syntax highlighting, suporte a code completion, wizards para geração automática de classes e xml.

    Percebi que na ausência de uma ferramenta que auxilie o desenvolvedor, acaba sendo um grande desafio fazer tudo isso na "unha".

    Como vocês fazem para contornar esse problema?

    Att
    Fabiano Fernandes

    ResponderExcluir
  2. Olá Fabiano,

    Ficamos felizes que você tenha gostado do material.

    Não utilizamos nenhum IDE especifica para Miolo, usamos o Eclipse. Ouvimos falar que existe uma chamada MioloIDE mas não chegamos a testa-la.

    Trabalhamos com o Eclipse com a perspectiva em PHP.

    Em breve iremos publicar novos posts sobre o Miolo e sobre PHP.

    Até logo,
    Núcleo de Pesquisa e Desenvolvimento - IFSP-BRAG

    ResponderExcluir