Extension Point API Reference
Use this page when you know what you want to extend and need the exact contract, registration point, and fallback behavior. Start with Extension point chooser if you are still deciding.
Reading The Tables
Section titled “Reading The Tables”| Column | Meaning |
|---|---|
| API | Contract, registry, facade, or tag to use. |
| Register from | Where package code should usually register it. |
| Called by | Runtime surface that consumes the contribution. |
| Safe fallback | What should happen when the package is absent, disabled, or returns nothing. |
| Test recipe | Smallest useful proof. |
Core And Package Runtime
Section titled “Core And Package Runtime”| Need | API | Register from | Called by | Safe fallback | Test recipe |
|---|---|---|---|---|---|
| Page subject type | CapellCore::registerPageType(new PageTypeData(...)) | Runtime provider registeringPackage() or boot method | Blueprint/page type selection | Type is absent from selectors | Assert CapellCore::getPageTypes() contains the key. |
| Model morph alias | CapellCore::registerModel() / registerModels() | Runtime provider | Morph map and model resolution | Laravel default morph behavior | Assert morph map resolves the model alias. |
| Model behavior | CapellCore::registerModelInterceptor() | Runtime/admin provider | Capell model interceptor resolver | Base model behavior remains unchanged | Instantiate model and assert interceptor method affects only matching context. |
| Settings schema | SettingsSchemaRegistry::register() plus registerSettingsClass() | Runtime/admin provider or AdminBridge | Admin settings surfaces | Group/tab is absent | Resolve registry and assert schema/settings class for group. |
| Package settings page | CapellAdmin::registerExtensionPage() | AdminBridge or admin provider | Installed Extensions page and grouped Filament sub-navigation | No package control page | Assert ExtensionPageRegistry::get($packageName) returns the page and the sub-navigation contains accessible registered pages grouped by product group. |
| Content graph extraction | ContentGraphRegistry::TAG or registry registration | Runtime provider | Content graph builders | Content is not linked into graph | Build graph for fixture content and assert edge exists. |
| Link picker entries | LinkableContentRegistry::register(...) | Runtime/admin provider | Link picker/search UI | Item type is not searchable | Assert registry includes provider and search returns fixture. |
| Renderable definition | RenderableRegistry::register(...) | Runtime provider | Rendering/runtime builders | Definition is unavailable | Assert registry returns the definition key. |
| Tailwind assets | TailwindAssetsRegistry::registerSource() / registerImport() | Runtime/frontend provider | Frontend/admin asset commands | Package classes are not scanned | Assert toReport() includes source/import origin. |
| Vendor asset condition | VendorAssetConditionRegistry::register(...) | Runtime provider | Asset manifest builders | Asset is not conditionally loaded | Assert condition returns expected value for fixture context. |
| Developer maker | MakerRegistryInterface::register(...) | Runtime/dev provider | Maker commands | Maker command option is absent | Assert maker appears in registry. |
Admin Runtime
Section titled “Admin Runtime”| Need | API | Register from | Called by | Safe fallback | Test recipe |
|---|---|---|---|---|---|
| Multiple admin surfaces | AdminBridge with AdminBridgeRegistrar | Runtime/admin provider | Admin bridge registry | Package contributes no admin surfaces | Assert bridge is registered for package name. |
| Single admin page/resource/widget | CapellAdmin::contributeToAdminSurface(AdminSurfaceContributionData::...) | Admin provider | CapellAdminPlugin | Surface is absent | Assert admin surface lookup contains the class. |
| Dashboard widget | CapellAdmin::registerDashboardWidget(...) | Admin provider or bridge | Dashboard widget resolver | Widget hidden | Assert widget appears in expected dashboard slot. |
| Overview stat | CapellAdmin::registerOverviewStat(...) | Admin provider | Dashboard stats | Stat hidden | Assert stat key appears for allowed user/context. |
| User menu item | CapellAdmin::registerUserMenuItem(...) | Admin provider | User menu registry | Menu item hidden | Assert user menu registry contains item. |
| Admin header tool | AdminToolItem::TAG | Tag class in provider | Admin tool registry | Tool hidden | Resolve app()->tagged(AdminToolItem::TAG). |
| Page form fields | PageSchemaExtender::TAG | Tag extender in provider or bridge | Page schema resolver | Base page form only | Build schema for fixture page and assert field exists. |
| Site form fields | SiteSchemaExtender::TAG | Tag extender in provider or bridge | Site schema resolver | Base site form only | Build schema for fixture site and assert field exists. |
| Layout form fields | LayoutSchemaExtender::TAG | Tag extender in provider or bridge | Layout schema resolver | Base layout form only | Build schema for fixture layout and assert field exists. |
| User form fields | UserSchemaExtender::TAG | Tag extender or user bridge | User schema resolver | Base user form only | Assert supports() and schema field for target user model. |
| Page table query | PageTableExtender::TAG | Tag extender in provider | Page tables and page selects | Base query | Assert modified query includes expected relation/filter. |
| Page table publish/workflow status | PageTableStatusResolver container binding | Admin provider | Pages table status column | Publish-date status resolver | Bind a fake resolver and assert the table renders its state. |
| User table query | UserTableExtender::TAG | Tag extender or user bridge | User resource table | Base query | Assert modified query behavior. |
| Header actions | PageHeaderActionExtender::TAG, SiteHeaderActionExtender::TAG, ResourceHeaderActionExtender::TAG | Tag extender in provider | Resource/page action resolvers | Action hidden | Render header actions and assert action key. |
| Site row actions | SiteRecordActionExtender::TAG | Tag extender in provider | Sites table | Action hidden | Render table actions for fixture site. |
| Publish panel content | PublishPanelExtender::TAG | Tag extender in provider | Page publish section | Panel remains unchanged | Assert view/html appears only for supported page. |
| Page edit content | PageEditExtender::TAG | Tag extender in provider | Edit page | Extra content hidden | Render edit page and assert component appears. |
| Page resource pages/widgets | PageResourcePageExtender::TAG, PageResourceWidgetExtender::TAG | Tag extender in provider | Page resource | Extra pages/widgets hidden | Assert PageResource includes class. |
| Page export fields | PageExportExtender::TAG | Tag extender in provider | Page/site export actions | Extra fields omitted | Run export action and assert payload contains field. |
| Media edit actions | MediaEditActionExtender::TAG | Tag extender in provider | Media edit page | Action hidden | Render media edit actions. |
| Extensions page content | ExtensionsPageExtender::TAG | Tag extender in provider | Installed Extensions page | No package alert/content | Render Extensions page and assert package section. |
| Extensions page actions | ExtensionsPageActionRegistry | afterResolving() or provider boot | Installed Extensions page | Action hidden | Resolve registry and assert header/table action key. |
| Admin panel customization | AdminPanelExtender::TAG | Tag extender in provider | CapellAdminPlugin | Base panel config | Build panel and assert plugin/middleware/theme change. |
| Validation gates | ValidationSubscriber or subscriber contracts | Runtime/admin provider | Subscriber manager/admin events | Validation not applied | Notify event with fixture and assert error/result. |
| Admin event handlers | AdminEventRegistry::register(...) | Admin provider | HasDynamicEventListeners | Event has no extra handler | Dispatch Livewire event and assert handler ran. |
| Activity display/revert | ActivityChangeSetBuilder::TAG, ActivityRevertHandler::TAG | Admin provider | Activity/revert actions | Default activity behavior | Run activity builder/revert fixture. |
| Site Health report | SiteHealthReportExtender::TAG | Admin provider | Site Health action/page | Report section absent | Build Site Health report and assert section. |
Frontend Runtime
Section titled “Frontend Runtime”| Need | API | Register from | Called by | Safe fallback | Test recipe |
|---|---|---|---|---|---|
| Small public HTML injection | RenderHookRegistry::register(...) | Frontend/runtime provider | Public Blade hook calls | Hook outputs nothing | Render anonymous page and assert safe HTML. |
| Frontend component alias | FrontendComponentRegistryInterface::register(...) | Frontend provider | Runtime component resolver | Alias is unavailable | Assert has() and hasReference() for key/alias. |
| Builder block rendering | WidgetRegistry::register(...) with frontend target | Runtime/frontend provider | Content renderer | Block is skipped/unrenderable | Render fixture block and assert output. |
| Reserved public path | ReservedFrontendPathRegistry::reserveExact() / reservePrefix() | Frontend provider before fallback routes | Frontend route resolver | Path falls through to page lookup | Assert package route responds and page fallback does not catch it. |
| Public route middleware | FrontendRouteMiddlewareRegistry | Frontend provider | Public page route | Base middleware order | Assert all() order or request side effect. |
| Frontend rule condition | FrontendRuleConditionRegistry::register(...) | Frontend provider | Runtime rules | Rule never matches | Directly evaluate condition against fixture context. |
| Response renderer | FrontendResponseRendererRegistry::register() / registerClass() | Frontend provider | Runtime response pipeline | Default renderer | Resolve renderer for runtime and assert response class/content. |
| Cache invalidation | CacheInvalidationRegistry::registerDependency(...) | Frontend/runtime provider | Model observers/cache invalidator | Cache remains until TTL/manual clear | Save fixture model and assert invalidation plan. |
| Critical/deferred assets | CriticalAssetRegistry::registerCritical() / registerDeferred() | Frontend provider | Frontend asset rendering | Asset not emitted | Render page and assert handle/url in expected section. |
| Runtime manifest contributors | FrontendRuntimeManifestContributor::TAG | Frontend provider | Frontend runtime builder | Manifest lacks package data | Build runtime manifest and assert contribution. |
| Asset contributors | FrontendAssetContributor::TAG | Frontend provider | Frontend asset manifest builder | Asset absent | Build asset manifest and assert package handle. |
Installer And Marketplace Runtime
Section titled “Installer And Marketplace Runtime”| Need | API | Register from | Called by | Safe fallback | Test recipe |
|---|---|---|---|---|---|
| Browser install guide patch | Patch plus PatchRegistry::register(...) | Installer provider registerPatches() | Install guide page/action | Patch absent | Probe/apply fixture host file and assert idempotence. |
| Installer default packages | CAPELL_SETUP_DEFAULT_PACKAGES plus package metadata | Host env/config | Browser installer page data | Package not preselected | Build installer page data and assert default list. |
| Extension dashboard widget | CapellAdmin::registerDashboardWidget($widget, DashboardEnum::Extensions) or $registrar->extensionDashboardWidget($widget) | Admin provider or admin bridge | Extensions dashboard | Widget absent | Register fixture widget and assert it appears in DashboardEnum::Extensions. |
| Marketplace installed extensions content | ExtensionsPageExtender::TAG | Marketplace/provider | Extensions dashboard actions area | No Marketplace alert | Render Extensions page in connected/unconnected states. |
| Marketplace theme header action | ResourceHeaderActionExtender::TAG | Marketplace/provider | Theme resource header | Action hidden | Render theme resource action list. |
| Marketplace activation verification | Container binding capell.marketplace.activation-verifier | Marketplace provider | Install/activation flow | Signed activation unavailable | Resolve binding and verify signed fixture payload. |
- Register in the package that owns the behavior.
- Return
null, an empty array, or no-op output when the package does not support the current context. - Test both the expected contribution and the safe fallback.
- Public frontend extensions must pass public HTML safety.