diff --git a/src/Auditable.php b/src/Auditable.php index 077ca768..4deec61c 100644 --- a/src/Auditable.php +++ b/src/Auditable.php @@ -77,9 +77,7 @@ trait Auditable */ public static function bootAuditable() { - if (App::getFacadeRoot() && static::isAuditingEnabled()) { - static::observe(new AuditableObserver); - } + static::observe(new AuditableObserver); } /** diff --git a/src/AuditableObserver.php b/src/AuditableObserver.php index 592dea2f..f3684e0b 100644 --- a/src/AuditableObserver.php +++ b/src/AuditableObserver.php @@ -92,6 +92,10 @@ protected function dispatchAudit(Auditable $model): void if (! $model->readyForAuditing()) { return; } + $modelClass = $model::class; + if (method_exists($modelClass, 'isAuditingEnabled') && ! $modelClass::isAuditingEnabled()) { + return; + } // @phpstan-ignore method.notFound $model->preloadResolverData(); diff --git a/src/Listeners/ProcessDispatchAudit.php b/src/Listeners/ProcessDispatchAudit.php index e086396b..e5716552 100644 --- a/src/Listeners/ProcessDispatchAudit.php +++ b/src/Listeners/ProcessDispatchAudit.php @@ -26,6 +26,10 @@ public function withDelay(DispatchAudit $event): int public function handle(DispatchAudit $event): void { + $modelClass = $event->model::class; + if (method_exists($modelClass, 'isAuditingEnabled') && ! $modelClass::isAuditingEnabled()) { + return; + } Auditor::execute($event->model); } } diff --git a/tests/Unit/AuditableTest.php b/tests/Unit/AuditableTest.php index 0885a7b8..cc558852 100644 --- a/tests/Unit/AuditableTest.php +++ b/tests/Unit/AuditableTest.php @@ -1268,4 +1268,37 @@ public function test_it_works_when_config_allowed_array_value_is_false(): void 'tags' => null, ], $auditData, true); } + + public function test_it_works_when_enabling_after_model_boot(): void + { + $this->app['config']->set('audit.enabled', true); + + $this->app['config']->set('audit.console', false); + Article::clearBootedModels(); // Make sure the model is booted again + Article::disableAuditing(); + + $model = tap(new Article([ + 'title' => 'How To Audit Eloquent Models', + 'content' => fake()->text(), + 'reviewed' => fake()->boolean(), + ]), fn (Article $article) => $article->save()); // constructor will boot trait + $this->assertFalse(Article::isAuditingEnabled(), 'Because console audit is disabled, the model is not auditing'); + $this->assertTrue(Article::getEventDispatcher()->hasListeners(\sprintf('eloquent.created: %s', Article::class))); + + $this->assertCount(0, $model->audits, 'If auditing is enabled, the model should have an audit after creating'); + + $this->app['config']->set('audit.console', true); + Article::enableAuditing(); + + $model = tap(new Article([ + 'title' => 'How To Audit Eloquent Models', + 'content' => fake()->text(), + 'reviewed' => fake()->boolean(), + ]), fn (Article $article) => $article->save()); // will not boot again, because booting only happens once + + $this->assertCount(1, $model->audits, 'If auditing is enabled, the model should have an audit after creating'); + + $this->assertTrue(Article::isAuditingEnabled(), 'Because console audit is enabled, the model is auditing'); + $this->assertTrue(Article::getEventDispatcher()->hasListeners(\sprintf('eloquent.created: %s', Article::class)), 'The model should have a listener for created'); + } }