Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
SystemChangeLogTrait + hook methods em classes de modelo Recentemente percebi que ao utilizar instruções em "hook methods" (https://goo.gl/Ro2bEr) em conjunto com o trait "SystemChangeLogTrait" nas classes de modelo causam um funcionamento inesperado nas informações de log persistidas. Consegui resolver o problema chamando os métodos da classe "SystemChangeLog" manualmente no início de cada "hook method" utilizado antes de qualquer instrução ...
RK
SystemChangeLogTrait + hook methods em classes de modelo  
Recentemente percebi que ao utilizar instruções em "hook methods" (https://goo.gl/Ro2bEr) em conjunto com o trait "SystemChangeLogTrait" nas classes de modelo causam um funcionamento inesperado nas informações de log persistidas.

Consegui resolver o problema chamando os métodos da classe "SystemChangeLog" manualmente no início de cada "hook method" utilizado antes de qualquer instrução adicional.

PS: Essa orientação serve apenas para classes de modelo onde se faz necessário inserir instruções adicionais em "hook methods", nas demais classes pode-se utilizar o "trait" normalmente.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (5)


FC

Olá Regis

Eu estou com o mesmo problema no "hook methods" você resolveu colocando SystemChangeLog::register em qual arquivo ? se lembra?
RK

Olá @Felipe Cortez!

Ao incluir "use SystemChangeLogTrait" no início do Model, basicamente você está incluindo os "hook methods" onAfterDelete, onBeforeStore e onAfterStore com instruções da classe "SystemChangeLog", conforme você pode verificar em "app/model/log/SystemChangeLogTrait.php.

Quando existe a necessidade de incluir alguma instrução adicional e você declara esses métodos explicitamente no seu Model, você "sobrescreve" os métodos já declarados anteriormente pelo "Trait". Portando você deve incluir as instruções contidas em "SystemChangeLogTrait" ao final do respectivo "hook method" que você declarou explicitamente, após suas instruções personalizadas.

Respondendo a sua pergunta "Em qual arquivo chamar explicitamente o SystemChangeLog::register"?

Resposta: Apenas nos Models que você declarar explicitamente os "hook methods", naqueles Models que você não necessitar nenhuma instrução adicional você deve basicamente incluir a instrução "use SystemChangeLogTrait".

Espero ter ajudado.
FC

Obrigado Regis

Então vou explicar melhor eu tenho um model onde tenho a instrução:
use SystemChangeLogTrait;

Dessa forma o log é feito normalmente quando se utiliza o store() quando eu uso a instrução abaixo ele não cria o log
$dados = $repository->update($values, $criteria);

Para mim você tinha alterado o metodo update dentro de TRepository mas então você copiou

public function onAfterDelete( $object )
{
SystemChangeLog::register($this, $object, array());
}

public function onBeforeStore($object)
{
$pk = $this->getPrimaryKey();
$this->lastState = array();
if (isset($object->$pk) and self::exists($object->$pk))
{
$this->lastState = parent::load($object->$pk)->toArray();
}
}

public function onAfterStore($object)
{
SystemChangeLog::register($this, $this->lastState, (array) $object);
}

Para dentro do Model certo ?
RK

Não é uma boa prática alterar qualquer elemento a biblioteca do framework, pois isso pode trazer problemas no momento de atualizar sua versão, pois durante o procedimento de atualização suas alterações seriam sobrescritas. Aconselha-se alterar somente arquivos criados dentro da pasta "app".

Para poder te ajudar, preciso saber onde você está utilizando o método "$dados = $repository->update($values, $criteria);" (em qual contexto). Sugiro postar o código em https://pastebin.com e compartilhar o link aqui, assim poderemos te ajudar de forma mais ágil.
FC

Aqui na empresa o pastebin é bloqueado vou colar o trecho do código aqui é bem simples:

  1. <?php
  2. $data $this->form->getData();
  3. TTransaction::open('banco');
  4. $repository = new TRepository('Funcionarios');
  5. $criteria = new TCriteria;
  6. $criteria->add(new TFilter('status''IS'NULL));
  7. $values = array('status' => $data->status);
  8. $rves $repository->update($values$criteria);
  9. TTransaction::close();
  10. new TMessage('info''Records updated'); 
  11. ?>


É só isso sendo que dessa forma ou Model::where(campo... ->update() também não faz o log