Repository: roots/acorn (php)

Issue:
App registration callbacks are not called as expected
### Version

5.0.3

### What did you expect to happen?

I'd expect callbacks added via `Application::configure()->registered()` to be called after all providers have been registered.

### What actually happens?

They are never called.

The issue is caused by [this line](https://github.com/roots/acorn/blob/e8c787db932fd959f53809e153733e73bc4e42dc/src/Illuminate/Foundation/Application.php#L873) not being present in [this override](https://github.com/roots/acorn/blob/e8c787db932fd959f53809e153733e73bc4e42dc/src/Roots/Acorn/Application.php#L322). It looks like this functionality was just missed when the upgrade to Laravel v11 was made.

`booting()` and `booted()` work as intended.


### Steps to reproduce

1. Add `->registered(function () { Log::info('App registration is now done.'); })` to your `Application::configure()` call.
2. Boot your app
3. Find that the message `App registration is now done.` has not been logged.

### System info

Ubuntu 24.04

### Log output

```shell

```

### Please confirm this isn't a support request.

No

Pull request:
Fix app registration callbacks not being called (Fixes #463)

Patch:
diff --git a/src/Roots/Acorn/Application.php b/src/Roots/Acorn/Application.php
index 33bd779..2611597 100644
--- a/src/Roots/Acorn/Application.php
+++ b/src/Roots/Acorn/Application.php
@@ -329,6 +329,8 @@ class Application extends FoundationApplication
 
         (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
             ->load($providers->collapse()->toArray());
+
+        $this->fireAppCallbacks($this->registeredCallbacks);
     }
 
     /**


Test patch:
diff --git a/tests/Application/ApplicationTest.php b/tests/Application/ApplicationTest.php
index a0d8565..cd64c97 100644
--- a/tests/Application/ApplicationTest.php
+++ b/tests/Application/ApplicationTest.php
@@ -205,6 +205,72 @@ it('gracefully skips a provider that does not exist', function () {
     $app->boot();
 });
 
+it('calls registered callbacks', function () {
+    $app = new Application(temp('base_path'));
+
+    mkdir($app->storagePath('framework/cache'), 0777, true);
+
+    $app->bind('config', fn () => new ConfigRepository);
+
+    $manifest = mock(\Roots\Acorn\PackageManifest::class);
+
+    $app->singleton(\Illuminate\Foundation\PackageManifest::class, fn () => $manifest);
+
+    $manifest
+        ->shouldReceive('providers')
+        ->andReturn([]);
+
+    $callback = Mockery::mock(new class
+    {
+        public function __invoke(...$args) {}
+    });
+
+    $callback
+        ->shouldReceive('__invoke')
+        ->withArgs([$app])
+        ->once();
+
+    $app->registered($callback);
+
+    $app->registerConfiguredProviders();
+});
+
+it('calls booting callbacks', function () {
+    $app = new Application;
+
+    $callback = Mockery::mock(new class
+    {
+        public function __invoke(...$args) {}
+    });
+
+    $callback
+        ->shouldReceive('__invoke')
+        ->withArgs([$app])
+        ->once();
+
+    $app->booting($callback);
+
+    $app->boot();
+});
+
+it('calls booted callbacks', function () {
+    $app = new Application;
+
+    $callback = Mockery::mock(new class
+    {
+        public function __invoke(...$args) {}
+    });
+
+    $callback
+        ->shouldReceive('__invoke')
+        ->withArgs([$app])
+        ->once();
+
+    $app->booted($callback);
+
+    $app->boot();
+});
+
 it('uses custom aliases', function () {
     $app = new Application;