arquitetura php mairon guerra bathaglini ([email protected])[email protected] diretoria de tecnologia da...
TRANSCRIPT
Arquitetura PHP
Mairon Guerra Bathaglini([email protected])
Diretoria de Tecnologia da Informação
Tribunal Regional Federal da 4ª Região
Passos iniciais da elaboração:
Padrão de Codificação PHP Padrão de Modelagem de Dados Padrão de Interfaces Web Definição da Arquitetura de Código
Padrão de Codificação PHP Classes e Interfaces (substantivos no singular):Pessoa, Endereco, Processo, TipoProcesso
Atributos (prefixo + qualificador):NumIdade, StrNome, DtaNascimento, DthEntrega, ObjProcessoDTO, ...
Métodos (verbos no infinitivo, letras minúsculas, ...):cadastrar, calcularJuros
Padrão de Modelagem de DadosPadrão de Modelagem de Dados
id_ nome da tabela (PK/FK) sin_ campo sinalizador que aceita apenas os valores S ou
N sta_ status multi-valorado. Ex.: S=Servidor, M=Magistrado dta_ data dth_ data/hora din_ dinheiro sin_ativo exclusão lógica
Padrão de Modelagem de DadosPadrão de Modelagem de Dados
Padrão de InterfacesPadrão de Interfaces
Casos de Uso e Regras de Negócio e Interface
Cliente
Responsabilidades separadas com uma camada fornecendo serviços para outra.
RN BD Cliente
Arquitetura n CamadasArquitetura n Camadas
DTOs DTOs
class SerieDTO extends InfraDTO {
public function getStrNomeTabela() { return 'serie'; }
public function montar() {
$this->adicionarAtributoTabela(InfraDTO::$PREFIXO_NUM, 'IdSerie', 'id_serie'); $this->adicionarAtributoTabela(InfraDTO::$PREFIXO_STR, 'Nome', 'nome'); . . . $this->configurarPK('IdSerie',InfraDTO::$TIPO_PK_NATIVA ); $this->configurarExclusaoLogica('SinAtivo', 'N');
}}
class InfraDTO { public abstract function getStrNomeTabela();public abstract function montarDTO(); . . .}
Data Transfer ObjectData Transfer Object
DocumentoDTO
ObjetogetNumIdSerie()
InfraDTO
__call ($func,$args)
get<atributo>set<atributo>unSet<atributo>isSet<atributo>
ret<atributo>unRet<atributo>isRet<atributo>setOrd<atributo>getOrd<atributo>unOrd<atributo>isOrd<atributo>
retTodosunRetTodosunSetTodosunOrdTodos
InfraDTOInfraDTO
set – configura valor de um atributo get – recupera valor de um atributo ret – indica que o atributo deve ser retornado setOrd – indica que o atributo deve ser usado
para ordenação do resultado
InfraDTOInfraDTO
adicionarAtributo adicionarAtributoTabela adicionarAtributoTabelaRelacionada
configurarPK configurarFK
InfraDTOInfraDTO
configurarPK
$this->configurarPK('IdSerie',InfraDTO::$TIPO_PK_NATIVA );
$TIPO_PK_INFORMADO $TIPO_PK_SEQUENCIAL (tabela infra_sequencia) $TIPO_PK_NATIVA (tabela “seq_” com identity)
InfraDTOInfraDTO
adicionarAtributo$this->adicionarAtributo(InfraDTO::$PREFIXO_STR, 'DescricaoModeloEdoc');
$PREFIXO_NUM $PREFIXO_DIN $PREFIXO_DBL $PREFIXO_STR $PREFIXO_DTA $PREFIXO_DTH $PREFIXO_BOL $PREFIXO_ARR $PREFIXO_OBJ $PREFIXO_BIN
InfraDTOInfraDTO
adicionarAtributoTabela $this->adicionarAtributoTabela(InfraDTO::$PREFIXO_NUM, 'IdSerie', 'id_serie');
InfraDTOInfraDTO
adicionarAtributoTabelaRelacionada$this->adicionarAtributoTabelaRelacionada( InfraDTO::$PREFIXO_STR,
'NomeGrupoSerie', 'nome', 'grupo_serie');
configurarFK$this->configurarFK('IdGrupoSerie', 'grupo_serie', 'id_grupo_serie');
InfraDTOInfraDTO
configurarFKconfigurarFK($strAtributo, $strTabelaRelacionada,
$strCampoRelacionado, $numTipoFK, $numFiltroFK)
$TIPO_FK_OBRIGATORIA (default) $TIPO_FK_OPCIONAL
$FILTRO_FK_ON (default) $FILTRO_FK_WHERE
InfraDTOInfraDTO
1) Retornar nome, descricao, nome do grupo;2) Somente para séries com ID <= 100;3) Ordenadas pelo nome
$objSerieDTO = new SerieDTO();$objSerieDTO->retStrNome();$objSerieDTO->retStrDescricao();$objSerieDTO->retStrNomeGrupoSerie();
$objSerieDTO->setNumIdSerie(100,InfraDTO::$OPER_MENOR_IGUAL);
$objSerieDTO->setOrdStrNome(InfraDTO::$TIPO_ORDENACAO_ASC);
$objSerieRN = new SerieRN();$arrObjSerieDTO = $objSerieRN->listar($objSerieDTO);
SELECT serie.nome,serie.descricao,grupo_serie.nome AS nomegruposerie FROM serie INNER JOIN grupo_serie ON serie.id_grupo_serie=grupo_serie.id_grupo_serie WHERE serie.id_serie<=100 AND serie.sin_ativo='S' ORDER BY serie.nome ASC
ExemploExemplo
Operadores $OPER_IN $OPER_NOT_IN $OPER_IGUAL $OPER_DIFERENTE $OPER_LIKE $OPER_NOT_LIKE $OPER_MAIOR $OPER_MENOR $OPER_MAIOR_IGUAL $OPER_MENOR_IGUAL
InfraDTOInfraDTO
SerieBD
Tabeladocumento
DTOs DTOs
InfraRN
SerieRN
InfraBD
RNRN
RNx BDx Tabela X
Tabela Y
2ª Camada
RNy BDy
3ª Camada
Clientes
1ª Camada
Comunicação ocorre somente entre RNs garantindo que sempre as permissões de acesso, regras de negócio e auditoria serão executadas;
Uma RN não pode chamar uma BD de outra classe; Não deve ocorrer comunicação direta entre BDs; Uma BD NÃO pode persistir/atualizar dados em mais de uma
tabela;
DocumentoRN
DocumentoBD
Tabeladocumento
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
Tabeladocumento
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
Tabeladocumento
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
Tabeladocumento
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOsDocumentoRN
DocumentoBD
DocumentoRN001
DocumentoRN002
DocumentoRN003
DTOs DTOs
AssinaturaRN Tabela
assinaturaAssinaturaRN001
AssinaturaRN002
DTOsAssinaturaRN
AssinaturaRN001
AssinaturaRN002
DTOsTabela
assinatura
AssinaturaRN
AssinaturaRN001
AssinaturaRN002
DTOsTabela
assinatura
AssinaturaRN
AssinaturaRN001
AssinaturaRN002
DTOsAssinaturaRN
AssinaturaRN001
AssinaturaRN002
DTOsAssinaturaRN
AssinaturaRN001
AssinaturaRN002
DTOsAssinaturaRN
AssinaturaRN001
AssinaturaRN002
DTOs
AssinaturaRN001
AssinaturaRN002
DTOs AssinaturaBD
DTOs
RN - Um façade para cada objetoRN - Um façade para cada objeto
A RN deve ser vista como uma provedora de serviços (seja para a interface ou para web-services)
SerieRNObjetocadastrar()
InfraRN
__call ($func,$args) cadastrarControlado()
RN – Métodos Conectados e ControladosRN – Métodos Conectados e Controlados
protected function cadastrarControlado(SerieDTO $objSerieDTO) protected function listarConectado(SerieDTO $objSerieDTO)
Abre ou não conexãoAbre ou não transaçãoEm caso de erro cancelaTransação
RN – Métodos PadronizadosRN – Métodos Padronizados Cadastrar Consultar Alterar Excluir Listar Contar Desativar Reativar Bloquear
Controlado Conectado
SerieRNSerieBD
objSerieDTO objSerieDTO
InfraSequencia
cadastrar (objSerieDTO)
Envia-se um DTO preenchido com os atributos para cadastro (set). Se for uma chave-primária seqüencial então o atributo correspondente deve ser configurado com null.
É retornado um DTO porque pode ser necessário recuperar a chave-primária gerada no caso de chaves seqüenciais. Neste caso o atributo correspondente a chave-primária é enviado nulo no DTO e volta preenchido.
cadastrar (objSerieDTO)
RN – CadastrarRN – Cadastrar
InfraRN
SerieRN
class SerieRN extends InfraRN { public function __construct(){ parent::__construct(); }
protected function inicializarObjInfraIBanco(){ return BancoSEI::getInstance(); } protected function cadastrarControlado($objSerieDTO) { try{ //permissao SessaoSEI::getInstance()->validarPermissao("serie_cadastrar");
//Validacoes $objInfraException = new InfraException(); // $objInfraException->lancarValidacoes(); $objSerieBD = new SerieBD($this->getObjInfraIBanco()); $ret = $objSerieBD->cadastrar($objSerieDTO);
return $ret;
}catch(Exception $e){ throw new InfraException("Erro cadastrando série.",$e); } }...}
RN – Código Exemplo
SerieRN SerieBDalterar (objSerieDTO)
• Envia-se um DTO preenchido (set) com a chave-primária e com os atributos para alteração.
• Não retorna nenhum DTO pois não será acrescentada nenhuma nova informação aos atributos do DTO enviado.
alterar (objSerieDTO)
RN – AlterarRN – Alterar
SerieRN SerieBDconsultar (objSerieDTO)
objSerieDTO objSerieDTO
consultar (objSerieDTO)
• Envia-se um DTO com os atributos de retorno (ret) configurados e preenchido (set) com atributos que identifiquem uma determinada ocorrência (chave-primária ou chave-candidata).
• Se mais de uma ocorrência for selecionada será gerado um erro.
• É retornado um DTO com os valores dos atributos solicitados de acordo com os dados atualmente persistidos (get).
RN – ConsultarRN – Consultar
SerieRN SerieBDlistar (objSerieDTO)
arrObjSerieDTO arrObjSerieDTO
listar (objSerieDTO)
• Envia-se um DTO com os atributos de retorno (ret), pesquisa (set) e ordenação (setOrd) preenchidos.
• É retornado uma lista de DTOs com todos os registros que atenderam aos critérios de pesquisa e preenchido com os atributos solicitados (get). • O cruzamento entre tabelas somente será realizado se solicitado retorno ou filtro de um campo da tabela relacionada.
Observação: o método listar não atenderá a todos os casos possíveis. Para outras pesquisas que se façam necessárias deve criado um método Conectado com estrutura semelhante, ou seja, recebendo um DTO e retornando uma lista.
RN – ListarRN – Listar
SerieRN SerieBDcontar (objSerieDTO)
Número ocorrências Número ocorrências
contar (objSerieDTO)
• Envia-se um DTO com os atributos de pesquisa (set) preenchidos.
• É retornado o número de ocorrências que atenderam aos critérios de pesquisa.
RN – ContarRN – Contar
SerieRN SerieBDbloquear (objSerieDTO)
objSerieDTO objSerieDTO
bloquear (objSerieDTO)
• Envia-se um DTO preenchido (set) com o atributo chave-primária.
• É retornado um DTO com todos os atributos da ocorrência no banco (retTodos).
• O registro ficará em lock até o fim da transação corrente.
RN – BloquearRN – Bloquear
SerieRN
SerieBD
excluir (SerieDTO) excluir (arrObjSerieDTO)
• Envia-se uma lista de DTOs com os atributos correspondentes a chave-primária preenchidos (set).
• A passagem de uma lista permite que o mesmo método seja utilizado para exclusão de um único item ou para a exclusão múltipla de itens. • O método excluir da RN recebe uma coleção enquanto que o método excluir da BD recebe um DTO específico
RN – Excluir, Desativar e ReativarRN – Excluir, Desativar e Reativar
Conectado ou Controlado
InfraRN
RN1
RN – Escopo de ExecuçãoRN – Escopo de Execução
RN2
RNn
RN3
RN – ProjetoRN – Projeto Quando necessário criar para a funcionalidade um
método gerente na RN garantindo a execução em uma única conexão/transação
Quando necessário criar um DTO específico para a funcionalidade
Projetar os métodos da RN para atendam não só a interface mas também outros clientes como web-services
InfraIBanco
InfraIngres InfraSqlServer InfraPostgreSql
BancoX
InfraMySql
Banco de DadosBanco de Dados
Abstração do Banco de Dadosinterface InfraIBanco {
public function getIdBanco(); public function getIdConexao(); public function isBolProcessandoTransacao(); public function abrirConexao(); public function fecharConexao(); public function abrirTransacao(); public function confirmarTransacao(); public function cancelarTransacao(); public function consultarSql($strSql); public function executarSql($strSql); public function paginarSql($strSql,$numIni,$numQtd); public function limitarSql($strSql,$numQtd); public function formatarSelecaoDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function formatarGravacaoDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function formatarLeituraDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function converterStr($strTabela,$strCampo); public function isBolForcarPesquisaCaseInsensitive(); public function formatarPesquisaStr($strTabela,$strCampo,$strValor,$strOperador,$bolCaseInsensitive);
}
InfraRN -> InfraIBancointerface InfraIBanco {
public function getIdBanco(); public function getIdConexao(); public function isBolProcessandoTransacao(); public function abrirConexao(); public function fecharConexao(); public function abrirTransacao(); public function confirmarTransacao(); public function cancelarTransacao(); public function consultarSql($strSql); public function executarSql($strSql); public function paginarSql($strSql,$numIni,$numQtd); public function limitarSql($strSql,$numQtd); public function formatarSelecaoDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function formatarGravacaoDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function formatarLeituraDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function converterStr($strTabela,$strCampo); public function isBolForcarPesquisaCaseInsensitive(); public function formatarPesquisaStr($strTabela,$strCampo,$strValor,$strOperador,$bolCaseInsensitive);
}
SerieBD
Tabelaserie
DTOs DTOs
InfraRN
SerieRN
InfraBD
BD
DTOsMUMPS
Arquivo TXT
A classe BD isola a forma como os dados são acessados. Se hoje é acessado o banco SQL Server, amanhã os dados podem vir do MySQL, MUMPS ou até de um arquivo texto. A classe RN só sabe lidar com DTOs, como eles serão “traduzidos” é problema da BD.
Tabeladocumento
DTOs DocumentoRN
DocumentoRN001
DocumentoRN002
DocumentoRN003
DocumentoBD
BDBD
SerieBD
InfraBD
cadastrar(DTO)
Não existe cadastrar
abstract class InfraBD {
public function __construct($objInfraIBanco) public function cadastrar($objInfraDTO) ; public function excluir($objInfraDTO); public function consultar($objInfraDTO); public function desativar($objInfraDTO); public function reativar($objInfraDTO) ; public function alterar($objInfraDTO); public function listar($objInfraDTO) ; public function contar($objInfraDTO) ; public function bloquear($objInfraDTO) ;
. . . }
InfraBDInfraBD
InfraBD -> InfraIBancointerface InfraIBanco {
public function getIdBanco(); public function getIdConexao(); public function isBolProcessandoTransacao(); public function abrirConexao(); public function fecharConexao(); public function abrirTransacao(); public function confirmarTransacao(); public function cancelarTransacao(); public function consultarSql($strSql); public function executarSql($strSql); public function paginarSql($strSql,$numIni,$numQtd); public function limitarSql($strSql,$numQtd); public function formatarSelecaoDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function formatarGravacaoDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function formatarLeituraDta | Dth | Str | Bol | Num | Din | Dbl | Bin public function converterStr($strTabela,$strCampo); public function isBolForcarPesquisaCaseInsensitive(); public function formatarPesquisaStr($strTabela,$strCampo,$strValor,$strOperador,$bolCaseInsensitive);
}
InfraBD Traduz o DTO recebido para comandos SQL Traduz os retornos do banco de dados para DTOs Formatos:
Dta – dd/mm/aaaaDth – dd/mm/aaaa hh:mm:ssDin – 999.999,99Dbl – 999999,99
InfraBD
Se necessário implementar algo específico na BD:
formatarGravacaoDta | Dth | Str | Bol | Num | Din | Dbl | BinPara converter o formato para gravação no banco
formatarLeituraDta | Dth | Str | Bol | Num | Din | Dbl | BinPara converter o formato lido do banco
formatarSelecaoDta | Dth | Str | Bol | Num | Din | Dbl | BinUsado para informar ao banco como trazer o campo (cast)
SerieRN
SerieBD
xxxxx()
InfraException InfraException
protected function xxxxxControlado(...) { try { ... } catch (Exception $e) { throw new InfraException(“...”, $e); }}
TabelaSerie
<?try {
. . .
}catch(Exception $e){ PaginaSistema::getInstance()->processarExcecao($e);}
PaginaSistema::getInstance()->montarDocType();PaginaSistema::getInstance()->abrirHtml();...
formulario.phpSerieRN
SerieBD
InfraException InfraException
TabelaSerie
xxxxx()
Exceções
public function xxxxx(...) { try { ... } catch (Exception $e) { throw new InfraException(“...”, $e); }}
InfraException
Transporte de validações Transporte de erros
abstract class InfraException {
public function adicionarValidacao($strDescricao)public function lancarValidacoes()public function lancarValidacao($strDescricao)
}
InfraException (validações)
$objInfraException = new InfraException();
if (...1...){ $objInfraException->adicionarValidacao(‘v1’); } if (...2...){ $objInfraException->adicionarValidacao(‘v2’); } if (...3...){ $objInfraException->lancarValidacao(‘v3’); } if (...4...){ $objInfraException->adicionarValidacao(‘v4’); } $objInfraException->lancarValidacoes();
InfraException (validações)
InfraException InfraPagina->processarExcecao($e) InfraWS->processarExcecao($e)InfraAjax->processarExcecao($e)
serie_lista.php
controlador.phpDTOs SerieRN
serie_cadastro.php
browser
GrupoSerieINT GrupoSerieRN
Interface RN
DTOs
abstract class InfraPagina { public function montarDocType(); public function abrirHtml(...); public function abrirHead(...); public function montarTitle(...); public function montarMeta(); public function montarStyle(); public function abrirStyle(...); public function fecharStyle(...); public function montarJavaScript(...); public function abrirJavaScript(...); public function fecharJavaScript(..); public function fecharHead(...); public function montarBarraLocalizacao(...); public function montarBarraComandosSuperior(...); public function montarBarraComandosInferior(...); public function montarAreaValidacao(...); public function montarAreaDebug(...); public function abrirAreaDados(...); public function fecharAreaDados(...); public function abrirAreaTabela(...); public function fecharAreaTabela(...); public function fecharBody(...); public function fecharHtml(...);}
InfraPagina
InfraPagina
PaginaSistema
Pagina 1.php Pagina n.phpPagina 2.php
InfraPagina
try { SessaoSistema::getInstance()->validarLink(); SessaoSistema::getInstance()->validarPermissao($_GET['acao']);
switch($_GET['acao']){ case ‘serie_cadastrar': ... break;
case ‘serie_alterar': ... break;
case ‘serie_consultar': ... break;
default: throw new InfraException("Ação '".$_GET['acao']."' não reconhecida."); }
}catch(Exception $e){ PaginaSistema::getInstance()->processarExcecao($e);}PaginaSistema::getInstance()->montarDocType();PaginaSistema::getInstance()->abrirHtml();
...
PaginaSistema::getInstance()->fecharHtml();?>
serie_cadastro.php
try { SessaoSistema::getInstance()->validarLink(); SessaoSistema::getInstance()->validarPermissao($_GET['acao']); switch($_GET['acao']){ case 'serie_excluir': die;
case 'serie_desativar': die;
case 'serie_reativar': break;
case 'serie_selecionar': break;
case 'serie_listar': break;
default: throw new InfraException("Ação '".$_GET['acao']."' não reconhecida."); } ... Monta tabela usando SessaoSistema::getInstance()->verificarPermissao()...}catch(Exception $e){ PaginaSistema::getInstance()->processarExcecao($e);} PaginaSistema::getInstance()->montarDocType();PaginaSistema::getInstance()->abrirHtml();...PaginaSistema::getInstance()->fecharHtml();?>
serie_lista.php
public function permitirXHTML()Permite mudar o comportamento para todas as páginas
public function setBolXHTML($bolXHTML)Permite mudar o comportamento para uma página
public function formatarXHTML($str)Formata um valor para exibição
InfraPagina (XHTML)
InfraINT
Montagem de combos, listas, ... Formatação de campos Todo e qualquer código de interface
que possa ser compartilhado
serie_lista.php
controlador.php controlador_ajax.php
browser
GrupoSerieINT GrupoSerieRN
InfraINT
AjaxinfraAjaxAutoCompletar(hdnId, txtDesc, url)
infraAjaxMontarSelectDependente(selPai,selFilho,url)
infraAjaxMontarSelect(sel,url)
infraAjaxComplementar(obj, url)
infraAjaxMontarCheckboxGrupo(div,url)
infraCheckboxAdicionarItem(obj, text, value, name)
Classes Principais
InfraIBanco InfraPagina InfraSessao InfraConfiguracao
Classes Acessórias
InfraDebug InfraLog InfraCache InfraAgendamentoTarefa InfraAuditoria
InfraIBanco
InfraIngres InfraSqlServer InfraPostgreSql InfraMySql
Banco de DadosBanco de Dados
class BancoSistema extends InfraMySql {
private static $instance = null; public static function getInstance() { if (self::$instance == null) { self::$instance = new BancoSistema(); } return self::$instance; } public function getServidor() { return ‘bd.trf4.jus.br’; }
public function getPorta() { return ‘3306’; } public function getBanco() { return ‘nome_base’; } public function getUsuario(){ return ‘nome_usuario’; } public function getSenha(){ return ‘senha_usuario’; } }
class ConfiguracaoSistema extends InfraConfiguracao { private static $instance = null; public static function getInstance(){
if (self::$instance == null) { self::$instance = new ConfiguracaoSistema();
} return self::$instance; }
public function getArrConfiguracoes(){ return array(
. . . 'BancoSistema' => array('Servidor' => ‘bd.trf4.jus.br',
'Porta' => '3306', 'Banco' => ‘nome_base', 'Usuario' => ‘nome_usuario', 'Senha' => ‘senha_usuario'));
} }
class BancoSistema extends InfraMySql {
private static $instance = null; public static function getInstance() { if (self::$instance == null) { self::$instance = new BancoSistema(); } return self::$instance; } public function getServidor() { return ConfiguracaoSistema::getInstance()->getValor('BancoSistema','Servidor'); }
public function getPorta() { return ConfiguracaoSistema::getInstance()->getValor('BancoSistema','Porta'); } public function getBanco() { return ConfiguracaoSistema::getInstance()->getValor('BancoSistema','Banco'); } public function getUsuario(){ return ConfiguracaoSistema::getInstance()->getValor('BancoSistema','Usuario'); } public function getSenha(){ return ConfiguracaoSistema::getInstance()->getValor('BancoSistema','Senha'); } }
InfraPagina InfraPaginaEsquema InfraPaginaEsquema2
InterfaceInterface
PaginaSistema
InfraSessao
Links assinados Validação de permissão Auditoria Dados do usuário Atributos de Sessão
abstract class InfraSessao { . . . public function validarLink($strLink=null) public function assinarLink($strLink)
. . .}
InfraSessao (links assinados)InfraSessao (links assinados)
abstract class InfraSessao { . . . public function validarPermissao($strNomeRecurso) public function verificarPermissao($strNomeRecurso)
. . .}
InfraSessao (permissões)InfraSessao (permissões)
abstract class InfraSessao { . . . public function validarAuditarPermissao($strNomeRecurso, $strOperacao = null, $varParametro = null) . . .}
InfraSessao (auditoria)InfraSessao (auditoria)
abstract class InfraSessao { . . . public function getNumIdOrgaoUsuario() public function getStrSiglaOrgaoUsuario() public function getNumIdUsuario() public function getStrSiglaUsuario() public function getStrNomeUsuario() public function getNumIdOrgaoSistema() public function getNumIdSistema() public function getNumIdUnidadeAtual() public function getStrSiglaUnidadeAtual() . . .}
InfraSessao (dados do usuário)InfraSessao (dados do usuário)
abstract class InfraSessao { . . . public function setAtributo($strNome,$varValor) public function getAtributo($strNome) . . .}
InfraSessao (atributos de sessão)InfraSessao (atributos de sessão)
class SessaoSistema extends InfraSessao { private static $instance = null; public static function getInstance($bolHabilitada=true,$bolValidarLinks=true) { if (self::$instance == null) { self::$instance = new SessaoSistema($bolHabilitada,$bolValidarLinks); } return self::$instance; }
public function __construct($bolHabilitada,$bolValidarLinks){ parent::__construct($bolHabilitada,$bolValidarLinks); }
public function getStrSiglaOrgaoSistema(){return ConfiguracaoSistema::getInstance()->getValor('SessaoSistema','SiglaOrgaoSistema'); }
public function getStrSiglaSistema(){ return ConfiguracaoSistema::getInstance()->getValor('SessaoSistema','SiglaSistema'); }
public function getStrPaginaLogin(){ return ConfiguracaoSistema::getInstance()->getValor('SessaoSistema','PaginaLogin'); }
public function getStrSipWsdl(){ return ConfiguracaoSistema::getInstance()->getValor('SessaoSistema','SipWsdl'); }
public function inicializarSessao(){ } }
class InfraDebug { . . . public static function getInstance(); public function setBolLigado($bolLigado); public function setBolDebugInfra($bolDebugInfra); public function setBolEcho($bolEcho); public function gravar($str); public function getStrDebug(); public function limpar();}
InfraDebugInfraDebug
abstract class InfraLog { public function __construct($objInfraIBanco)... public function gravar($str)... }
CREATE TABLE infra_log ( id_infra_log integer not null, dth_log datetime not null, texto_log varchar(max) not null, ip varchar(15) not null );
InfraLogInfraLog
MódulosMódulos
É possível ter um controlador (de páginas, ajax e web-services) para cada módulo.
WSDL controlador_ws Classe WS
Web-ServicesWeb-Services
<?xml version="1.0" encoding="ISO-8859-1"?><wsdl:definitions name="PublicacaoWS" targetNamespace="SeiPublicacao" ...xmlns:tns="SeiPublicacao"> <wsdl:types> <xsd:schema targetNamespace="SeiPublicacao"> <xsd:complexType name="Publicacoes"> <xsd:all> <xsd:element name="IdVeiculoPublicacao" type="xsd:string"/> <xsd:element name="DataDisponibilizacao" type="xsd:string"/> <xsd:element name="DataPublicacao" type="xsd:string"/> <xsd:element name="Numero" type="xsd:string"/> <xsd:element name="IdDocumentos" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> </xsd:all> </xsd:complexType> </xsd:schema> </wsdl:types> <wsdl:message name="confirmarDisponibilizacaoRequest"> <wsdl:part name="Publicacoes" type="tns:Publicacoes" /> </wsdl:message> <wsdl:message name="confirmarDisponibilizacaoResponse"> <wsdl:part name="parametros" type="xsd:string" /> </wsdl:message> <wsdl:portType name="SeiPublicacaoPortType"> <wsdl:operation name="confirmarDisponibilizacao"> <wsdl:input message="tns:confirmarDisponibilizacaoRequest"/> <wsdl:output message="tns:confirmarDisponibilizacaoResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="SeiPublicacaoBinding" type="tns:SeiPublicacaoPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="confirmarDisponibilizacao"> <soap:operation soapAction="SeiPublicacaoAction"/> <wsdl:input> <soap:body namespace="SeiPublicacao" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </wsdl:input> <wsdl:output> <soap:body namespace="SeiPublicacao" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
<wsdl:service name="SeiPublicacaoService"> <wsdl:port name="SeiPublicacaoPortService" binding="tns:SeiPublicacaoBinding"> <soap:address location="[servidor]/ws/PublicacaoWS.php"/> </wsdl:port> </wsdl:service></wsdl:definitions>
<?php require_once dirname(__FILE__).'/SEI.php'; $strArq = null;
switch ($_GET['servico']) {
case 'sei': $strArq .= 'ws/sei.wsdl'; break; case 'edoc': $strArq .= 'ws/edoc.wsdl'; break; case 'sip': $strArq .= 'ws/sei_sip.wsdl'; break;
case 'assinador': $strArq .= 'ws/assinador.wsdl'; break; case 'ouvidoria': $strArq .= 'ws/ouvidoria.wsdl'; break; case 'publicacao': $strArq = 'ws/publicacao.wsdl'; break; default: throw new Exception('Serviço ['.$_GET['servico'].'] inválido.'); }
header("Pragma: public"); header('Pragma: no-cache'); header("Expires: 0"); header("Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private","false"); header('Content-Disposition: inline; filename="' . $strArq . '"'); $handle = fopen($strArq, "r"); $strWsdl = fread($handle, filesize($strArq)); fclose($handle); echo str_replace('[servidor]', ConfiguracaoSEI::getInstance()->getValor('SEI','URL'), $strWsdl);?>
http://sistema.trf4.jus.br/controlador_ws.php?servico=publicacao
Web-ServicesWeb-Services
<?class PublicacaoWS extends InfraWS {
public function getObjInfraLog(){ return LogSEI::getInstance(); } public function confirmarDisponibilizacao($Publicacoes){ . . . }}
$servidorSoap = new SoapServer("publicacao.wsdl",array('encoding'=>'ISO-8859-1'));
$servidorSoap->setClass("PublicacaoWS");
if ($_SERVER['REQUEST_METHOD']=='POST') { $servidorSoap->handle();}?>
Web-ServicesWeb-Services
<?class PublicacaoWS extends InfraWS { ... public function confirmarDisponibilizacao($Publicacoes){ try { $this->validarAcessoAutorizado(ConfiguracaoSEI::getInstance()->getValor('HostWebService','Publicacao'));
InfraDebug::getInstance()->setBolLigado(false); InfraDebug::getInstance()->setBolDebugInfra(false); InfraDebug::getInstance()->limpar();
//montar DTO //chamar RN
//LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug()); return true;
}catch(Exception $e){ $this->processarExcecao($e); } } }}...?>
Web-ServicesWeb-Services
<?class PublicacaoWS extends InfraWS { ... public function confirmarDisponibilizacao($Publicacoes){ try { $this->validarAcessoAutorizado(ConfiguracaoSEI::getInstance()->getValor('HostWebService','Publicacao'));
InfraDebug::getInstance()->setBolLigado(false); InfraDebug::getInstance()->setBolDebugInfra(false); InfraDebug::getInstance()->limpar();
//montar DTO //chamar RN
//LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug()); return true;
}catch(Exception $e){ $this->processarExcecao($e); } } }}...?>
Web-ServicesWeb-Services
class PublicacaoWS extends InfraWS { public function confirmarDisponibilizacao($Publicacoes){ try { ... if ($Publicacoes->IdDocumentos != null && !is_array($Publicacoes->IdDocumentos)){ $Publicacoes->IdDocumentos = array($Publicacoes->IdDocumentos); }
$arrObjPublicacaoDTO = array(); foreach($Publicacoes->IdDocumentos as $idDocumento){ $objPublicacaoDTO = new PublicacaoDTO(); $objPublicacaoDTO->setDtaDisponibilizacao($Publicacoes->DataDisponibilizacao); $objPublicacaoDTO->setDblIdDocumento($idDocumento); $objPublicacaoDTO->setDtaPublicacao($Publicacoes->DataPublicacao); $objPublicacaoDTO->setNumNumero($Publicacoes->Numero); $arrObjPublicacaoDTO[] = $objPublicacaoDTO; }
$objVeiculoPublicacao = new VeiculoPublicacaoDTO(); $objVeiculoPublicacao->setArrObjPublicacaoDTO($arrObjPublicacaoDTO); $objVeiculoPublicacao->setNumIdVeiculoPublicacao($Publicacoes->IdVeiculoPublicacao);
$objPublicacaoRN = new PublicacaoRN(); $objPublicacaoRN->confirmarDisponibilizacaoRN1115($objVeiculoPublicacao);
...
}catch(Exception $e){ $this->processarExcecao($e); } }}
Web-ServicesWeb-Services
Sistema de Permissões Gerador de Código Sistema de Teste da InfraPHP
Outros SistemasOutros Sistemas
FIM!
Diretoria de Tecnologia da InformaçãoTribunal Regional Federal da 4ª Região