UiSlots
The connector's contributions to the core's UI slots — the eighteen slots and what each renders, the SlotContribution and SlotContext objects, the placeholder rule, and what a contribution may read.
Subscriby\Connector\Contracts\Ports\UiSlots. Required of every connector, even one that fills nothing.
Core pages that need platform-specific UI render typed slots; a connector fills the ones it wants. Returning an empty list is how a connector says the core's generic rendering is enough, and it is a perfectly good connector. Every slot has a declarative or REST-visible equivalent, so the creator apps lose nothing when a connector contributes only Blade.
The method
public function slots(): array; // list<SlotContribution>One SlotContribution per slot the connector fills, at most one per slot:
new SlotContribution(
slot: ConnectorSlot::Install,
view: 'connector-example::slots.install', // a Blade view in your namespace…
component: null, // …or a Livewire component you registered, never both
placeholder: 'connector-example::slots.install-placeholder',
);The core renders a slot with <x-connector-slot :slot="ConnectorSlot::Install" :connector="$key" :context="[…]" /> for the connector in scope; a connector that fills nothing renders nothing, and the page never knows what a connector shows there, only that the space exists. Your view receives the context array as its data; a component contribution is mounted with it as parameters, under a key made of the slot and the connector. When the page is lazy the core includes your placeholder view first, so skeleton parity holds for connector UI too.
What a contribution receives
The context the page passes: SDK refs and plain values the slot is about, never a model. Each slot's page section below names them. A contribution reads only its context and the connector's own services and repositories; it never queries the core's tables or imports the application's classes, and every string it shows comes from the package's lang/*.json.
The slots
The catalogue names every place a connector may contribute. Fourteen of them are rendered by a core page today; the rest are declared so a connector can fill them now and see them appear as the core pages grow into them. The kit accepts a contribution for any of the twenty-one.
| Slot | Where it renders | Rendered today | Context |
|---|---|---|---|
install | Beside the install form in the Connect dialog (a walkthrough video). | ✅ | — |
settings | Under the connection and settings fields of each installation on the Configuration tab. | ✅ | installation (InstallationRef) |
resource_badge | Beside a gated resource's connector and kind in the resources list. | ✅ | resource (ResourceRef), space (?SpaceRef) |
resource_link_instructions | Under "Link a resource", after the platform-side request is sent. | ✅ | the connector being linked, the purpose |
resource_swap | Inside the Disaster Recovery resource replacement step. | — | the old and new SpaceRefs |
resource_health_detail | The detail panel of a resource's health verdict. | — | SpaceRef, the verdict |
member_identity_badge | Beside a member's identity on this connector. | — | IdentityRef |
grant_action | Beside each place in a subscription's detail, next to its Joined / Not Joined badge. | ✅ | resource (ResourceRef), space (?SpaceRef), joined (bool) |
creator_login_method | A sign-in button on the creator's sign-in and sign-up pages, one per available connector that fills it. | ✅ | — (read your own platform installation) |
portal_grant_action | The button a member taps to open one grant on the portal's membership page. | ✅ | title, url (the grant's link, when it has one), resourceId |
payment_setup | The setup screen of a native payment method in the payment-method editor. | ✅ | the provider key, the project |
checkout_method | The checkout option of a native payment method on the portal. | ✅ | the provider key, the plan |
access_code_redemption_hint | Under "Where members redeem a code" in the access-code generator, one per live installation of the project. | ✅ | installation (InstallationRef) |
broadcast_hints | Under the editor in the broadcast composer, one per live installation of the project. | ✅ | installation (InstallationRef) |
support_relay_options | Under the relay mode picker in the support settings, explaining each mode. | ✅ | mode, linked, handle |
recovery_actions | The "what you can do now" card on the Disaster Recovery page. | ✅ | the installation, the incident |
recovery_prevention | The connector's section of the Prevention page. | ✅ | the installation, the coverage |
recovery_steps | The connector's recovery step components (relink an account, replace a place). | — | the installation, the operation |
portal_grant_action has a fallback: when a connector fills nothing the core renders a neutral link button from the grant's URL, so a bearer_link connector without a slot still gives the member something to tap.
Livewire components
A contribution may name a Livewire component instead of a view when the slot has to react (a relink handshake that polls, a picker). Register the component in your service provider under your own namespace, give it a @placeholder, and name it in component. The component follows the same reading rule as a view: its context and your services only.
How Telegram does it
The install slot shows the walkthrough video beside the form the core renders from connector.json; resource_link_instructions adds the "add the bot as an administrator" shortcut under the core's request button; portal_grant_action renders the "Join …" button a member taps to open the invite link a grant carries; payment_setup and checkout_method are the Stars explainer and its checkout option; support_relay_options explains the DM and the forum-group modes; creator_login_method is the "Continue with Telegram" widget button on the creator's sign-in and sign-up pages, which hands the widget's answer to the package's own callback route; settings says the bot's name, description, picture and commands live in BotFather and links to the bot; broadcast_hints names the formatting Telegram keeps and the 4,096-character limit; access_code_redemption_hint says a member redeems a code by sending it to the bot; the three recovery_* slots are the relink and replacement steps.
What the kit checks
slots.well_formed: every entry is a SlotContribution, no slot is filled twice, and every contribution ships a non-empty placeholder. Subscriby's own suite adds that every string a slot shows has a translation in each of the ten locales, and review adds that the placeholder mirrors the loaded layout.
A slot is not a page
A contribution decorates a core page; it never carries a flow of its own that the REST API cannot reach. A connector that needs a screen of its own (a wizard the platform imposes) drives it from InstallationDraft::$continueUrl or its own routes/web.php, and keeps the slot to a button that opens it.
How is this guide?
SettingsSchema
The install and settings forms as data — when the manifest binds the port for you, when to write your own, and how the Field objects reach the dashboard, the API and the apps.
Messenger
Sending the core's messages through a connector — send, edit, delete and sendFile, the Message and Recipient objects, and everything the core checks before your port is called.