Skip to content

Extension and action examples

Use the action functions with records and Data objects supplied by your application. They pass each argument to the package operation and return its result.

These adapters show container registration. Use the owning package registry when a contract requires contributor discovery.

Contract adapters wrap an existing implementation. Call their registration function from your service provider with that implementation; tagged contracts keep their declared tag. Resolve the backend by its concrete class before registration so the replacement contract does not resolve itself. Static contract metadata uses one backend class per adapter.

Contract Capell\Newsletter\Contracts\NewsletterAudienceProvider

Section titled “Contract Capell\Newsletter\Contracts\NewsletterAudienceProvider”
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
final class NewsletterAudienceProviderAdapter implements \Capell\Newsletter\Contracts\NewsletterAudienceProvider
{
public function __construct(private readonly \Capell\Newsletter\Contracts\NewsletterAudienceProvider $backend) {}
#[\Override]
public function audiencesForSite(int $siteId): \Illuminate\Support\Collection
{
return $this->backend->audiencesForSite($siteId);
}
}
function registerNewsletterAudienceProviderAdapter(\Capell\Newsletter\Contracts\NewsletterAudienceProvider $backend): void
{
app()->bind(NewsletterAudienceProviderAdapter::class, static fn (): NewsletterAudienceProviderAdapter => new NewsletterAudienceProviderAdapter($backend));
app()->bind(\Capell\Newsletter\Contracts\NewsletterAudienceProvider::class, NewsletterAudienceProviderAdapter::class);
}

Contract Capell\Newsletter\Contracts\NewsletterProviderAdapter

Section titled “Contract Capell\Newsletter\Contracts\NewsletterProviderAdapter”
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
final class NewsletterProviderAdapterAdapter implements \Capell\Newsletter\Contracts\NewsletterProviderAdapter
{
public function __construct(private readonly \Capell\Newsletter\Contracts\NewsletterProviderAdapter $backend) {}
#[\Override]
public function listAudiences(\Capell\Newsletter\Models\ProviderConnection $connection): array
{
return $this->backend->listAudiences($connection);
}
#[\Override]
public function normalizeWebhook(\Capell\Newsletter\Models\ProviderConnection $connection, \Illuminate\Http\Request $request): \Illuminate\Support\Collection
{
return $this->backend->normalizeWebhook($connection, $request);
}
#[\Override]
public function supportsOAuth(): bool
{
return $this->backend->supportsOAuth();
}
#[\Override]
public function supportsProviderOwnedConfirmation(): bool
{
return $this->backend->supportsProviderOwnedConfirmation();
}
#[\Override]
public function syncSubscriber(\Capell\Newsletter\Models\ProviderConnection $connection, \Capell\Newsletter\Models\ProviderAudience $audience, \Capell\Newsletter\Data\ProviderSubscriberData $subscriber): \Capell\Newsletter\Data\ProviderSyncResultData
{
return $this->backend->syncSubscriber($connection, $audience, $subscriber);
}
#[\Override]
public function verifyWebhook(\Capell\Newsletter\Models\ProviderConnection $connection, \Illuminate\Http\Request $request): bool
{
return $this->backend->verifyWebhook($connection, $request);
}
}
function registerNewsletterProviderAdapterAdapter(\Capell\Newsletter\Contracts\NewsletterProviderAdapter $backend): void
{
app()->bind(NewsletterProviderAdapterAdapter::class, static fn (): NewsletterProviderAdapterAdapter => new NewsletterProviderAdapterAdapter($backend));
app()->bind(\Capell\Newsletter\Contracts\NewsletterProviderAdapter::class, NewsletterProviderAdapterAdapter::class);
}

Contract Capell\Newsletter\Contracts\NewsletterSegmentProvider

Section titled “Contract Capell\Newsletter\Contracts\NewsletterSegmentProvider”
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
final class NewsletterSegmentProviderAdapter implements \Capell\Newsletter\Contracts\NewsletterSegmentProvider
{
public function __construct(private readonly \Capell\Newsletter\Contracts\NewsletterSegmentProvider $backend) {}
#[\Override]
public function querySubscribers(\Capell\Newsletter\Models\Segment $segment): \Illuminate\Database\Eloquent\Builder
{
return $this->backend->querySubscribers($segment);
}
}
function registerNewsletterSegmentProviderAdapter(\Capell\Newsletter\Contracts\NewsletterSegmentProvider $backend): void
{
app()->bind(NewsletterSegmentProviderAdapter::class, static fn (): NewsletterSegmentProviderAdapter => new NewsletterSegmentProviderAdapter($backend));
app()->bind(\Capell\Newsletter\Contracts\NewsletterSegmentProvider::class, NewsletterSegmentProviderAdapter::class);
}

Contract Capell\Newsletter\Contracts\NewsletterSendHandoff

Section titled “Contract Capell\Newsletter\Contracts\NewsletterSendHandoff”
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
final class NewsletterSendHandoffAdapter implements \Capell\Newsletter\Contracts\NewsletterSendHandoff
{
public function __construct(private readonly \Capell\Newsletter\Contracts\NewsletterSendHandoff $backend) {}
#[\Override]
public function handoff(\Capell\Newsletter\Models\NewsletterSend $send, array $payload): void
{
$this->backend->handoff($send, $payload);
}
}
function registerNewsletterSendHandoffAdapter(\Capell\Newsletter\Contracts\NewsletterSendHandoff $backend): void
{
app()->bind(NewsletterSendHandoffAdapter::class, static fn (): NewsletterSendHandoffAdapter => new NewsletterSendHandoffAdapter($backend));
app()->bind(\Capell\Newsletter\Contracts\NewsletterSendHandoff::class, NewsletterSendHandoffAdapter::class);
}

Contract Capell\Newsletter\Contracts\ReconcilesNewsletterProviderSync

Section titled “Contract Capell\Newsletter\Contracts\ReconcilesNewsletterProviderSync”
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
final class ReconcilesNewsletterProviderSyncAdapter implements \Capell\Newsletter\Contracts\ReconcilesNewsletterProviderSync
{
public function __construct(private readonly \Capell\Newsletter\Contracts\ReconcilesNewsletterProviderSync $backend) {}
#[\Override]
public function reconcileSubscriber(\Capell\Newsletter\Models\ProviderConnection $connection, \Capell\Newsletter\Models\ProviderAudience $audience, \Capell\Newsletter\Data\ProviderSubscriberData $subscriber): ?\Capell\Newsletter\Data\ProviderSyncResultData
{
return $this->backend->reconcileSubscriber($connection, $audience, $subscriber);
}
}
function registerReconcilesNewsletterProviderSyncAdapter(\Capell\Newsletter\Contracts\ReconcilesNewsletterProviderSync $backend): void
{
app()->bind(ReconcilesNewsletterProviderSyncAdapter::class, static fn (): ReconcilesNewsletterProviderSyncAdapter => new ReconcilesNewsletterProviderSyncAdapter($backend));
app()->bind(\Capell\Newsletter\Contracts\ReconcilesNewsletterProviderSync::class, ReconcilesNewsletterProviderSyncAdapter::class);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runApplyNewsletterTags(\Capell\Newsletter\Models\Subscriber $subscriber, array $tagIds, bool $replace = false): \Capell\Newsletter\Models\Subscriber
{
return \Capell\Newsletter\Actions\ApplyNewsletterTagsAction::run($subscriber, $tagIds, $replace);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runBuildDueNewsletterSends(?\Carbon\CarbonInterface $now = null, int $limit = 50): \Illuminate\Support\Collection
{
return \Capell\Newsletter\Actions\BuildDueNewsletterSendsAction::run($now, $limit);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runBuildListUnsubscribeHeaders(\Capell\Newsletter\Models\Subscriber $subscriber): array
{
return \Capell\Newsletter\Actions\BuildListUnsubscribeHeadersAction::run($subscriber);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runBuildNewsletterSendHandoffPayload(\Capell\Newsletter\Models\NewsletterSend $send): array
{
return \Capell\Newsletter\Actions\BuildNewsletterSendHandoffPayloadAction::run($send);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runConfirmSubscriber(string $token, ?\Capell\Newsletter\Data\ConsentEvidenceData $evidence = null): \Capell\Newsletter\Data\ConfirmSubscriberResultData
{
return \Capell\Newsletter\Actions\ConfirmSubscriberAction::run($token, $evidence);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runCreatePreferenceCenterToken(\Capell\Newsletter\Models\Subscriber $subscriber): string
{
return \Capell\Newsletter\Actions\CreatePreferenceCenterTokenAction::run($subscriber);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runCreateUnsubscribeToken(\Capell\Newsletter\Models\Subscriber $subscriber): string
{
return \Capell\Newsletter\Actions\CreateUnsubscribeTokenAction::run($subscriber);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runEvaluateNewsletterSegment(\Capell\Newsletter\Models\Segment $segment): \Illuminate\Database\Eloquent\Builder
{
return \Capell\Newsletter\Actions\EvaluateNewsletterSegmentAction::run($segment);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runExportSubscribers(int $siteId, ?\Capell\Newsletter\Models\Segment $segment = null): \Illuminate\Support\LazyCollection
{
return \Capell\Newsletter\Actions\ExportSubscribersAction::run($siteId, $segment);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runHandleProviderWebhook(\Capell\Newsletter\Models\ProviderConnection $connection, \Illuminate\Http\Request $request): \Illuminate\Support\Collection
{
return \Capell\Newsletter\Actions\HandleProviderWebhookAction::run($connection, $request);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runImportSubscribers(int $siteId, array $rows, string $consentBasis, bool $dryRun = true, array $tagIds = [], ?\Illuminate\Database\Eloquent\Model $actor = null, ?string $filename = null): \Capell\Newsletter\Models\ImportBatch
{
return \Capell\Newsletter\Actions\ImportSubscribersAction::run($siteId, $rows, $consentBasis, $dryRun, $tagIds, $actor, $filename);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runParseSubscriberCsvRows(string $contents): array
{
return \Capell\Newsletter\Actions\ParseSubscriberCsvRowsAction::run($contents);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runQueueDueNewsletterSends(?\Carbon\CarbonInterface $now = null, int $limit = 50): int
{
return \Capell\Newsletter\Actions\QueueDueNewsletterSendsAction::run($now, $limit);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runQueueProviderSync(\Capell\Newsletter\Models\Subscriber $subscriber, string $operation = 'sync_subscriber', bool $dispatchJobs = true): void
{
\Capell\Newsletter\Actions\QueueProviderSyncAction::run($subscriber, $operation, $dispatchJobs);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runRecordConsentEvent(\Capell\Newsletter\Models\Subscriber $subscriber, \Capell\Newsletter\Enums\ConsentEventType $eventType, ?\Capell\Newsletter\Data\ConsentEvidenceData $evidence = null, ?\Capell\Newsletter\Enums\SubscriberStatus $status = null, ?\Capell\Newsletter\Models\ProviderConnection $providerConnection = null, array $metadata = []): \Capell\Newsletter\Models\ConsentEvent
{
return \Capell\Newsletter\Actions\RecordConsentEventAction::run($subscriber, $eventType, $evidence, $status, $providerConnection, $metadata);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runRecoverStalledSubscriberImports(?\Carbon\CarbonInterface $now = null, int $limit = 100): int
{
return \Capell\Newsletter\Actions\RecoverStalledSubscriberImportsAction::run($now, $limit);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runRequestDoubleOptIn(\Capell\Newsletter\Models\Subscriber $subscriber, ?\Capell\Newsletter\Data\ConsentEvidenceData $evidence = null): ?\Capell\Newsletter\Models\PublicToken
{
return \Capell\Newsletter\Actions\RequestDoubleOptInAction::run($subscriber, $evidence);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runRequeueDueProviderSyncAttempts(?int $limit = null, bool $dispatchJobs = true): int
{
return \Capell\Newsletter\Actions\RequeueDueProviderSyncAttemptsAction::run($limit, $dispatchJobs);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runResolvePreferenceCenter(string $token): \Capell\Newsletter\Data\PreferenceCenterResolutionData
{
return \Capell\Newsletter\Actions\ResolvePreferenceCenterAction::run($token);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runResolveUtmAttribution(?\Capell\Newsletter\Data\ConsentEvidenceData $evidence = null, array $parameters = []): ?\Capell\Newsletter\Data\UtmAttributionData
{
return \Capell\Newsletter\Actions\ResolveUtmAttributionAction::run($evidence, $parameters);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runScheduleNewsletterSend(int $siteId, string $name, string $subject, \Carbon\CarbonInterface|string $scheduledAt, ?int $segmentId = null, ?int $providerAudienceId = null, ?string $preheader = null, ?string $utmSource = null, ?string $utmMedium = null, ?string $utmCampaign = null, ?string $utmTerm = null, ?string $utmContent = null, ?string $utmId = null, array $metadata = []): \Capell\Newsletter\Models\NewsletterSend
{
return \Capell\Newsletter\Actions\ScheduleNewsletterSendAction::run($siteId, $name, $subject, $scheduledAt, $segmentId, $providerAudienceId, $preheader, $utmSource, $utmMedium, $utmCampaign, $utmTerm, $utmContent, $utmId, $metadata);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runSubscribeFromFormSubmission(object $event): ?\Capell\Newsletter\Models\Subscriber
{
return \Capell\Newsletter\Actions\SubscribeFromFormSubmissionAction::run($event);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runSubscribeFromPublicRequest(\Capell\Core\Models\Site $site, array $payload, \Illuminate\Http\Request $request): \Capell\Newsletter\Models\Subscriber
{
return \Capell\Newsletter\Actions\SubscribeFromPublicRequestAction::run($site, $payload, $request);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runSyncNewsletterSubscriberContact(\Capell\Newsletter\Models\Subscriber $subscriber): ?\Capell\Contacts\Data\ContactSourceSyncResultData
{
return \Capell\Newsletter\Actions\SyncNewsletterSubscriberContactAction::run($subscriber);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runSyncSubscriberToProvider(\Capell\Newsletter\Models\SyncAttempt $syncAttempt): \Capell\Newsletter\Models\SyncAttempt
{
return \Capell\Newsletter\Actions\SyncSubscriberToProviderAction::run($syncAttempt);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runUnsubscribeSubscriber(string $token, ?\Capell\Newsletter\Data\ConsentEvidenceData $evidence = null): ?\Capell\Newsletter\Models\Subscriber
{
return \Capell\Newsletter\Actions\UnsubscribeSubscriberAction::run($token, $evidence);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runUpdateNewsletterSendStatus(\Capell\Newsletter\Models\NewsletterSend $send, \Capell\Newsletter\Enums\NewsletterSendStatus $status, ?\Carbon\CarbonInterface $occurredAt = null, array $metadata = []): \Capell\Newsletter\Models\NewsletterSend
{
return \Capell\Newsletter\Actions\UpdateNewsletterSendStatusAction::run($send, $status, $occurredAt, $metadata);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runUpdatePreferenceCenter(string $token, \Capell\Newsletter\Data\PreferenceCenterUpdateData $data): ?\Capell\Newsletter\Data\PreferenceCenterData
{
return \Capell\Newsletter\Actions\UpdatePreferenceCenterAction::run($token, $data);
}
<?php
declare(strict_types=1);
namespace App\CapellExamples\Newsletter;
function runUpsertSubscriber(\Capell\Newsletter\Data\SubscriberData $data, ?\Capell\Newsletter\Data\ConsentEvidenceData $evidence = null, \Capell\Newsletter\Enums\ConsentEventType $eventType = \Capell\Newsletter\Enums\ConsentEventType::FormCapture, bool $recordConsentEvent = true): \Capell\Newsletter\Models\Subscriber
{
return \Capell\Newsletter\Actions\UpsertSubscriberAction::run($data, $evidence, $eventType, $recordConsentEvent);
}