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.
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.
Olá Regis
Eu estou com o mesmo problema no "hook methods" você resolveu colocando SystemChangeLog::register em qual arquivo ? se lembra?
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.
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 ?
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.
Aqui na empresa o pastebin é bloqueado vou colar o trecho do código aqui é bem simples:
É só isso sendo que dessa forma ou Model::where(campo... ->update() também não faz o log