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.