/** * Calculates the changes done to the entity and stores the audit log event object into the * log queue inside the `_auditQueue` key in $options. * * @param Cake\Event\Event The Model event that is enclosed inside a transaction * @param Cake\Datasource\EntityInterface $entity The entity that is to be saved * @param ArrayObject $options Options array containing the `_auditQueue` key * @return void */ public function afterSave(Event $event, EntityInterface $entity, $options) { if (!isset($options['_auditQueue'])) { return; } $config = $this->_config; if (empty($config['whitelist'])) { $config['whitelist'] = $this->_table->schema()->columns(); $config['whitelist'] = array_merge($config['whitelist'], $this->getAssociationProperties(array_keys($options['associated']))); } $config['whitelist'] = array_diff($config['whitelist'], $config['blacklist']); $changed = $entity->extract($config['whitelist'], true); if (!$changed) { return; } $original = $entity->extractOriginal(array_keys($changed)); $properties = $this->getAssociationProperties(array_keys($options['associated'])); foreach ($properties as $property) { unset($changed[$property], $original[$property]); } if (!$changed || $original === $changed && !$entity->isNew()) { return; } $primary = $entity->extract((array) $this->_table->primaryKey()); $auditEvent = $entity->isNew() ? AuditCreateEvent::class : AuditUpdateEvent::class; $transaction = $options['_auditTransaction']; $auditEvent = new $auditEvent($transaction, $primary, $this->_table->table(), $changed, $original); if (!empty($options['_sourceTable'])) { $auditEvent->setParentSourceName($options['_sourceTable']->table()); } $options['_auditQueue']->attach($entity, $auditEvent); }