for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Spatie\Activitylog\Traits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
trait DetectsChanges
{
protected $oldValues = [];
protected $newValues = [];
protected static function bootDetectsChanges()
collect(['updating', 'deleting'])->each(function ($eventName) {
return static::$eventName(function (Model $model) {
$model->oldValues = $model->fresh()->toArray();
$model->newValues = $model->getDirty();
});
}
public function getChangedAttributeNames(): array
return array_keys(array_intersect_key($this->oldValues, $this->newValues));
public function getChangedValues(): Collection
if (!isset($this->logChangesOnAttributes)) {
return collect();
return collect($this->getChangedAttributeNames())
->filter(function (string $attributeName) {
return collect($this->logChangesOnAttributes)->contains($attributeName);
logChangesOnAttributes
In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:
class MyClass { } $x = new MyClass(); $x->foo = true;
Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:
class MyClass { public $foo; } $x = new MyClass(); $x->foo = true;
})
->map(function (string $changedAttributeName) {
return [
'old' => $this->oldValues[$changedAttributeName],
'new' => $this->newValues[$changedAttributeName],
];
In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:
Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion: