Skip to content

Debugging Admin Extensions

Use this when an admin resource, page, widget, field, action, setting, or Extensions page contribution does not appear.

flowchart TD
Provider["Package admin provider boots"] --> Bridge["AdminBridge registered"]
Provider --> Tags["Tagged extenders registered"]
Bridge --> Registrar["AdminBridgeRegistrar"]
Registrar --> Surface["AdminSurfaceContributionRegistry"]
Tags --> Resolver["Schema/action/table resolver"]
Surface --> Panel["CapellAdminPlugin builds Filament panel"]
Resolver --> Panel
Panel --> Permission["Policies and permissions"]
Permission --> Browser["Admin UI renders"]

Most admin bugs are either missing registration, stale cache, wrong tag, or permission denial.

Terminal window
php artisan optimize:clear
php artisan capell:admin-clear-cache
php artisan capell:admin-cache-configurators
php artisan capell:admin-cache-widgets
php artisan capell:admin-install

Use only the commands present in php artisan list capell.

SymptomLikely causeCheckFix
Page/resource missing from navigationNot registered or permission deniedAdminBridge registration and user permissionsRegister through AdminBridgeRegistrar and rerun admin install when permissions changed.
Form field missingWrong schema extender tag/hook or stale configurator cacheExtender class, supports(), and tag constantTag with PageSchemaExtender::TAG, SiteSchemaExtender::TAG, LayoutSchemaExtender::TAG, or UserSchemaExtender::TAG.
Header action missingWrong action extender for the surfacePage/site/resource resolverUse PageHeaderActionExtender, SiteHeaderActionExtender, or ResourceHeaderActionExtender.
Table query unchangedExtender modifies the wrong query or returns a new builder incorrectlyPageTableExtender::modifyQuery() testReturn the modified builder and cover the query with a fixture.
Extensions page alert missingExtender not tagged or package unavailableExtensionsPageExtender::TAG and package stateTag the extender and force package installed in tests.
Settings tab missingSettings class/schema/metadata missingSettingsSchemaRegistryRegister settings class, schema, and metadata.
Works for super admin onlyPolicy/permission missing for roleRole permissions and policy methodsSeed/register package permissions and test allowed/denied roles.
it('registers package admin bridge', function (): void {
CapellCore::forcePackageInstalled('capell-app/example');
expect(CapellAdmin::getAdminBridgeRegistry()->classes('capell-app/example'))
->toContain(ExampleAdminBridge::class);
});
it('adds the package field to the page form', function (): void {
$extenders = collect(app()->tagged(PageSchemaExtender::TAG));
expect($extenders)
->toContain(fn (PageSchemaExtender $extender): bool => $extender instanceof ExamplePageSchemaExtender);
});
it('hides the package page from users without permission', function (): void {
$this->actingAs($editor);
livewire(ExamplePackagePage::class)
->assertForbidden();
});
  • Use translations for labels and notifications.
  • Keep package behavior in Actions; Filament pages should orchestrate.
  • Test the direct registry/tag where possible, then add one Filament render test for the user-facing surface.
  • Do not register admin UI from frontend providers.