Padrão de modelo ABI v0.5.6 Beta

O ABI Model Pattern é uma biblioteca com uma interface gráfica projetada para inicializar modelos, propriedades do modelo e também para definir um conjunto de regras para cada propriedade. Os modelos criados são necessários para armazenar a “estrutura” dos dados, limitando a integridade e a simplicidade de alterar as condições para sua verificação. Todas as configurações necessárias para o funcionamento da biblioteca são armazenadas em um arquivo de configuração separado; o banco de dados é usado apenas no caso de modelos de ligação para criar um esquema, se necessário. A funcionalidade para vincular o modelo ao banco de dados será descrita abaixo.



Eles me perguntaram duas vezes: "Diga-me, Sr. Babbage, e se você inserir os dados errados na máquina, obterá a resposta certa?" A incompreensibilidade da confusão na cabeça que leva a essas perguntas.

Charles Babbage, "Trechos da vida de um filósofo" (1864)

Uma interface gráfica é necessária para a conveniência de criar modelos sem estudo adicional da lógica da biblioteca, bem como para validar ações do usuário ao definir um conjunto de regras para propriedades do modelo, alterando dinamicamente o formulário de criação e exibindo os erros correspondentes. Configurações do criador de logs e conexões com o banco de dados.

Para criar um modelo na interface da biblioteca, é necessário determinar suas propriedades e condições de verificação de dados para essas propriedades. A classe da biblioteca Validator compara os dados de cada parâmetro de entrada com as condições da propriedade do modelo especificado para formar a Entidade e, no caso de uma incompatibilidade, termina com um determinado erro.

Um modelo formado (Entidade) é um objeto com um conjunto experiente de propriedades que armazena os dados transmitidos para sua criação. Cada propriedade pode ser necessária e não necessária.

  1. Os dados para uma propriedade necessária devem ser passados ​​para formar uma entidade;
  2. Uma propriedade opcional armazena os dados especificados por padrão se os dados desta propriedade não tiverem sido transferidos.

Como cada Entidade é uma instância do tipo correspondente, o operador instanceof pode ser usado para verificar se pertence ao tipo especificado.

Cada modelo criado é um novo tipo que pode ser usado para criar as seguintes propriedades do modelo. Um tipo personalizado pode ser usado em um tipo de propriedade e em uma coleção de tipos. Um exemplo simples é o modelo de cupom como um tipo de propriedade no modelo de pedido.

Modelo de cupom:




Modelo de pedido:




Uma coleção de tipos pode ser usada no caso de um número desconhecido de elementos em uma matriz ou objeto. Os dados de cada elemento dessa estrutura de dados devem corresponder às condições do modelo criado, que é usado como o tipo de propriedade. Um exemplo de uma coleção de tipos pode ser considerado da seguinte maneira:
Um carrinho de compras pode armazenar uma quantidade desconhecida de produtos. No modelo "Pedido", adicione a propriedade "Produtos" com o tipo "Matriz" e a coleção do tipo "Produto". Cada elemento dessa estrutura de dados deve corresponder ao tipo "Produto".

Modelo do produto:




Modelo de pedido:




Para associar um modelo a um banco de dados, é necessário definir o sinalizador "bind_db" para cada uma ou propriedades individuais nas páginas Criar / Editar do modelo. O nome da tabela corresponde ao nome do modelo e as colunas desta tabela correspondem às propriedades associadas do modelo, incluindo o conjunto de regras especificado para eles. A estrutura de tabelas vinculadas com modelos será alterada se forem feitas alterações no modelo.

Um exemplo de um modelo "Pedido" relacionado no banco de dados



Antes de conectar o modelo e suas propriedades ao banco de dados, é necessário configurar a conexão com o banco de dados na interface da biblioteca na página correspondente.

Na versão atual da biblioteca, é possível usar apenas um banco de dados MySQL e um conjunto limitado de tipos MySQL.

Essa biblioteca não possui funcionalidade para gravar Entidade no banco de dados, bem como excluir registros. Ao criar essa funcionalidade definida pelo usuário, observe que, ao alterar as propriedades do modelo associadas ao banco de dados, a estrutura da tabela será alterada e, quando o modelo for excluído, a tabela será excluída.

Para usar o criador de logs, você deve habilitá-lo e configurá-lo em uma página separada da interface da biblioteca.

Crie modelos para todos os parâmetros de função, coleta de dados, consultas, respostas de consulta e outros parâmetros necessários para validação de dados. Isso é necessário para eliminar erros inesperados durante a execução do aplicativo e aumentar o controle de dados para processamento adicional.

A classe da biblioteca Parser é necessária para iterar sobre os parâmetros de entrada na coleção passada para criar uma Entidade. O analisador itera e encontra na coleção transferida apenas os parâmetros necessários para criar a Entidade. A enumeração de parâmetros não é realizada recursivamente. Um exemplo de obtenção de dados na API private24 e criação do modelo de entidade "ATM".

Modelo ATM:




Modelo do dispositivo:



URL de solicitação da API Private24:

api.privatbank.ua/p24api/infrastructure?json&atm&address=&city=%D0%96%D0%BE%D0%BB%D0%BA%D0%B2%D0%B0

Resposta da API Private24:

resposta
{ "city":"", "address":"", "devices":[ { "type":"ATM", "cityRU":"", "cityUA":"", "cityEN":"Zhovkva", "fullAddressRu":", , , , , 1", "fullAddressUa":"i, i, i,i , i, 1", "fullAddressEn":"Ukraine,area Lvivska,district Zhovkivskyi,city Zhovkva,building 1", "placeRu":" \"\"", "placeUa":"i \"\"", "latitude":"50.056405", "longitude":"23.972725", "tw":{ "mon":"09:00 - 18:00", "tue":"09:00 - 18:00", "wed":"09:00 - 18:00", "thu":"09:00 - 18:00", "fri":"09:00 - 18:00", "sat":"09:00 - 16:00", "sun":"00:00 - 00:00", "hol":"00:00 - 00:00" } }, { "type":"ATM", "cityRU":"", "cityUA":"", "cityEN":"Zhovkva", "fullAddressRu":", , , , , 33", "fullAddressUa":"i, i, i,i , i, 33", "fullAddressEn":"Ukraine,area Lvivska,district Zhovkivskyi,city Zhovkva,building 33", "placeRu":" \"\"", "placeUa":" \"i\"", "latitude":"50.055840", "longitude":"23.981580", "tw":{ "mon":"09:00 - 18:00", "tue":"09:00 - 18:00", "wed":"09:00 - 18:00", "thu":"09:00 - 18:00", "fri":"09:00 - 18:00", "sat":"09:00 - 16:00", "sun":"00:00 - 00:00", "hol":"00:00 - 00:00" } } ] } 


Criando Entidade:

 try { // Include the composer autoloader require_once('PATH_TO_ABI_LIBRARY/abi/vendor/autoload.php'); $prv24_atms_url = 'https://api.privatbank.ua/p24api/infrastructure?json&atm&address=&city=%D0%96%D0%BE%D0%BB%D0%BA%D0%B2%D0%B0'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $prv24_atms_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $prv24_response = curl_exec($ch); curl_close($ch); $request_body = json_decode($prv24_response); $available_atms = \ABI\classes\Entity::getEntity($request_body, 'atm'); 



 $atm_devices = $available_atms->devices; 



 } catch (Exception $e) { $error_message = $e->getMessage(); } 

Adicione uma linha para remover "dispositivos" da variável $ request_body, iniciando uma das possíveis respostas inadequadas:

 unset($request_body->devices); 

A regra "exigida" foi definida na propriedade "devices" do modelo "ATM" criado anteriormente. Depois de remover "devices" de "$ request_body", mais uma vez criamos Entity e obtemos o seguinte erro:



Os últimos erros registrados pela classe Logger foram adicionados à página correspondente na interface. É assim:



Instalação da biblioteca


  1. Baixe a biblioteca mais recente
  2. Descompacte o arquivo baixado no diretório em que deseja instalar a biblioteca.
  3. Para instalar dependências para esta biblioteca, execute o comando de instalação no diretório “abi” da biblioteca - “composer install”
  4. Certifique-se de ativar o módulo mod_rewrite do Apache e verifique se o seu host virtual está configurado com o parâmetro AllowOverride.
  5. Verifique e, se necessário, defina os atributos para o arquivo de configuração da biblioteca com permissões de leitura e gravação (0666).
  6. Após instalar a biblioteca, use o nome de usuário admin e a senha admin para entrar na interface gráfica da biblioteca.

Link para o repositório

Muito obrigado pela ajuda e apoio do denaikG

Source: https://habr.com/ru/post/pt416829/


All Articles