Skip to content

Worked extension examples

These developer-facing recipes are kept beside the package contract. Replace the example values with the site-specific records and data objects used by the calling workflow.

<?php
declare(strict_types=1);
final class ExampleActionContractImplementation implements \Capell\SeoSuite\Contracts\ActionContract
{
public function handle(mixed ...$args): mixed
{
throw new LogicException('Implement this package contract for the calling site.');
}
/**
* @param array<array-key, mixed> $input
*/
public function validate(array $input): bool
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\ActionContract::class, ExampleActionContractImplementation::class);
<?php
declare(strict_types=1);
final class ExampleContentTargetContractImplementation implements \Capell\SeoSuite\Contracts\ContentTargetContract
{
/**
* @param array<int, array<string, mixed>> $sections
*/
public function apply(array $sections, \Capell\SeoSuite\Models\AiCreatorSession $session): void
{
throw new LogicException('Implement this package contract for the calling site.');
}
public function handles(): string
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\ContentTargetContract::class, ExampleContentTargetContractImplementation::class);
<?php
declare(strict_types=1);
final class ExampleExchangerInterfaceImplementation implements \Capell\SeoSuite\Contracts\ExchangerInterface
{
public function execute(): mixed
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\ExchangerInterface::class, ExampleExchangerInterfaceImplementation::class);
<?php
declare(strict_types=1);
final class ExampleSearchMetaDataSectionExtenderImplementation implements \Capell\SeoSuite\Contracts\Extenders\SearchMetaDataSectionExtender
{
/**
* @return array<int, Action>
*/
public function headerActions(\Filament\Schemas\Components\Section $component): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\Extenders\SearchMetaDataSectionExtender::class, ExampleSearchMetaDataSectionExtenderImplementation::class);
<?php
declare(strict_types=1);
final class ExamplePageSpeedInsightsClientInterfaceImplementation implements \Capell\SeoSuite\Contracts\PageSpeedInsightsClientInterface
{
public function isConfigured(): bool
{
throw new LogicException('Implement this package contract for the calling site.');
}
public function analyze(string $url, \Capell\SeoSuite\Enums\PageSpeedStrategyEnum $strategy): \Capell\SeoSuite\Data\PageSpeedAuditResultData
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\PageSpeedInsightsClientInterface::class, ExamplePageSpeedInsightsClientInterfaceImplementation::class);
<?php
declare(strict_types=1);
final class ExampleSchemaTemplateImplementation implements \Capell\SeoSuite\Contracts\SchemaTemplate
{
/**
* @return array<string, mixed>
*/
public function build(\Capell\Core\Models\Page $page, \Capell\Core\Models\Site $site, \Capell\Core\Models\Language $language): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
/**
* @return list<string>
*/
public function requiredFields(\Capell\Core\Models\Page $page, \Capell\Core\Models\Site $site, \Capell\Core\Models\Language $language): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\SchemaTemplate::class, ExampleSchemaTemplateImplementation::class);
<?php
declare(strict_types=1);
final class ExampleSearchMetaDataSectionExtenderResolverInterfaceImplementation implements \Capell\SeoSuite\Contracts\Schemas\SearchMetaDataSectionExtenderResolverInterface
{
/**
* @return array<int, Action>
*/
public function resolveHeaderActions(\Filament\Schemas\Components\Section $section): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\Schemas\SearchMetaDataSectionExtenderResolverInterface::class, ExampleSearchMetaDataSectionExtenderResolverInterfaceImplementation::class);
<?php
declare(strict_types=1);
final class ExampleSearchConsoleClientInterfaceImplementation implements \Capell\SeoSuite\Contracts\SearchConsoleClientInterface
{
public function isConfigured(): bool
{
throw new LogicException('Implement this package contract for the calling site.');
}
/**
* @return array<int, mixed>
*/
public function pageInsights(string $url): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
/**
* @return array<int, mixed>
*/
public function decliningPages(int $siteId, int $limit = 10): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
/**
* @return array<int, array<string, mixed>>
*/
public function urlMetricRows(int $siteId, int $limit = 100): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
/**
* @return array<int, array<string, mixed>>
*/
public function queryMetricRows(int $siteId, int $limit = 100): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\SearchConsoleClientInterface::class, ExampleSearchConsoleClientInterfaceImplementation::class);
<?php
declare(strict_types=1);
final class ExampleSeoPublishReportProviderImplementation implements \Capell\SeoSuite\Contracts\SeoPublishReportProvider
{
/**
* @return array<int, array{
* page: array{id: int|string|null, uuid?: string|null, label: string},
* issues: array<int, array{key: string, severity: string, message: string}>
* }>
*/
public function forWorkspace(\Capell\PublishingStudio\Models\Workspace $workspace): array
{
throw new LogicException('Implement this package contract for the calling site.');
}
}
app()->bind(\Capell\SeoSuite\Contracts\SeoPublishReportProvider::class, ExampleSeoPublishReportProviderImplementation::class);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildAnswerEngineReadinessAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildCitationCoverageReportAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildCrawlerPreviewReportAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildMarketplaceStructuredDataFreshnessWarningsAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildSchemaTemplateReportAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildSeoAeoAuditAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\BuildSeoSuiteDoctorReportAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\ClearAiDiscoveryCacheAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\InstallSeoSuitePackageAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\ObserveAeoRuntimePublicOutputsAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\PruneSeoTelemetryAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\RefreshStaleAiDiscoveryMarkdownAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\RunAeoPublishObservationRequestAction::class)->handle(...$inputs);
<?php
declare(strict_types=1);
$inputs = []; // Supply the arguments required by the action handle() method.
resolve(\Capell\SeoSuite\Actions\SyncAiDiscoveryPageProfilesAction::class)->handle(...$inputs);