SIGNALS Documentation
API Reference

Plugin documents

Extend the document engine from a plugin — documentType, documentResolver, extendDocumentResolver, pdfDriver, and seedDocumentTemplates with exact registrar signatures.

Overview

Document seams pre-date the Plugin SDK packaging work and are fully shipped on PluginRegistrar. None of these methods are manifest-gated — declare whatever types/resolvers your plugin owns, and keep permissions sensible (documents.create default on documentType).

Guide index for related contracts:

Seam Contract page
Document types Document Type Registry
Resolvers / extenders Document Resolver Registry
PDF drivers PDF Driver Manager
Template seeders Plugin Document Template Seeder Registry

Signatures (copied from PluginRegistrar)

public function documentType(
    string $documentType,
    string $resolverType,
    string $modelType,
    string $label,
    string $description = '',
    string $permission = 'documents.create',
    ?string $category = null,
    array $aliases = [],
): self

public function documentResolver(DocumentDataResolver $resolver): self

public function extendDocumentResolver(string $resolverType, callable $extender): self
// @param callable(array<string, mixed>, Model): array<string, mixed> $extender

public function pdfDriver(string $name, string $driverClass): self
// @param class-string<PdfDriver> $driverClass

public function seedDocumentTemplates(callable $seeder): self
// @param callable(Warehouse): void $seeder

Typical patterns

Register a document type + resolver

$registrar
    ->documentType(
        documentType: 'acme.packing_note',
        resolverType: 'acme.packing_note',
        modelType: Rental::class,
        label: 'Acme packing note',
        description: 'Warehouse packing note for the rental.',
        permission: 'documents.create',
        category: 'operations',
    )
    ->documentResolver(new AcmePackingNoteResolver);

Implement App\Contracts\Documents\DocumentDataResolver for the resolver.

Extend an existing resolver’s merge payload

$registrar->extendDocumentResolver(
    'invoice',
    function (array $data, Model $model): array {
        $data['acme_footer'] = 'Packed with care';

        return $data;
    },
);

Register a PDF driver

$registrar->pdfDriver('acme-chromium', AcmeChromiumPdfDriver::class);

$driverClass must implement App\Contracts\Documents\PdfDriver.

Seed store-scoped templates

$registrar->seedDocumentTemplates(function (Warehouse $warehouse): void {
    // create/update DocumentTemplate rows for $warehouse
});

Callbacks are collected by PluginDocumentTemplateSeederRegistry and invoked when warehouses are provisioned / seeded per that registry’s contract.

Config-driven rendering reminder

Plugins still must not ship Blade views for document HTML. Template bodies are stored as core document templates (Blade strings in the DB / seeder output), resolved through the document engine — not as package view files.