Skip to content

Extension Point Chooser

Use this page before adding a hook, service provider call, or package integration. Start with the table that matches the runtime you are changing, then follow the linked page for the full contract and examples.

NeedUseOwner
Register a page subject typeCapellCore::registerPageType(new PageTypeData(...))Core
Replace a core model implementationLaravel container binding for the model classCore
Register renderable definitionsRenderableRegistry::register(...)Core
Register link picker/search optionsLinkableContentRegistry::register(...)Core
Register content graph extractorsContentGraphRegistry::register(...) or ContentGraphRegistry::TAGCore
Add package settingsSettingsSchemaRegistry::register(), registerSettingsClass(), and registerMetadata()Core/Admin
Add package settings migrationsdatabase/settings/* plus package install/setup registrationCore
Add developer-tooling makersMakerRegistryInterface::register(...)Core
Load vendor build assets conditionallyVendorAssetConditionRegistry::register(...)Core/Frontend
Add static export filesStaticSiteExtensionRegistry::register(...)Static export package
Extend ownership/export mappingOwnershipMap::register(...)Exchanger
NeedUseOwner
Add admin resources, pages, widgets, configurators, user menu items, settings, or extenders from one packageAdminBridge and AdminBridgeRegistrarAdmin
Add one small admin surfaceCapellAdmin::contributeToAdminSurface(AdminSurfaceContributionData::...)Admin
Register a package settings/control page on ExtensionsCapellAdmin::registerExtensionPage(...)Admin
Add dashboard widgetsCapellAdmin::registerDashboardWidget(...)Admin
Add small dashboard metricsCapellAdmin::registerOverviewStat(...)Admin
Replace the dashboard pageAdminBridgeRegistrar::dashboardPage(...) or CapellAdmin::useDashboardPage(...)Admin
Add user menu actionsCapellAdmin::registerUserMenuItem(...)Admin
Add admin header toolsTag an AdminToolItem with AdminToolItem::TAGAdmin
Add welcome tour stepsCapellAdmin::registerWelcomeTourStep(...)Admin
Add navigation groupsCapellAdmin::registerNavigationGroup(...)Admin
Add content widgetsCapellAdmin::registerWidget(...) or registerDiscoverableWidgets(...)Admin
Add fields to page, site, layout, or user formsTagged schema extenders such as PageSchemaExtender::TAGAdmin
Add page/site/resource header actionsTagged action extenders such as PageHeaderActionExtender::TAGAdmin
Modify page, user, or resource tablesTagged table extenders such as PageTableExtender::TAGAdmin
Extend the installed Extensions pageExtensionsPageActionRegistry or ExtensionsPageExtender::TAGAdmin
Subscribe to admin serving eventsCapellAdmin::serving(...)Admin
Register activity display/revert behaviorActivityChangeSetBuilder::TAG and ActivityRevertHandler::TAGAdmin
NeedUseOwner
Inject small public HTMLRenderHookRegistry::register(...)Frontend
Add public widgetsWidgetRegistry::register(...) with a frontend targetFrontend/Core
Register frontend component aliasesFrontendComponentRegistry::register(...)Frontend
Register package CSS or JS sourcesTailwindAssetsRegistry::registerSource() / registerImport()Core/Frontend
Register critical or deferred assetsCriticalAssetRegistry::registerCritical() / registerDeferred()Frontend
Reserve package-owned public pathsReservedFrontendPathRegistry::reserveExact() / reservePrefix()Frontend
Add middleware to the public page routeFrontendRouteMiddlewareRegistryFrontend
Add frontend rule conditionsFrontendRuleConditionRegistry::register(...)Frontend
Replace response rendering for a runtimeFrontendResponseRendererRegistry::register(...) / registerClass(...)Frontend
Invalidate pages when a model changesCacheInvalidationRegistry::registerDependency(...)Frontend
  • Prefer an existing extension point over patching host package classes.
  • Keep package feature logic in the package. Host packages should expose contracts, not product behavior.
  • Put writes in Actions and structured state in Data objects.
  • Keep visible strings in translations.
  • Public output must pass the public HTML safety contract.
  • Register most extension points from a package provider’s boot() method unless the contract explicitly says to bind something in register().