Справочник интерфейсов
Модуль Contracts (TcpdfNext\Contracts) определяет общие интерфейсы, которым следуют все модули TCPDF-Next. Зависимость от контрактов, а не от конкретных классов, позволяет подставлять тестовые дублёры, создавать альтернативные реализации и поддерживать стабильный публичный API между мажорными версиями.
PdfDocumentInterface
Namespace: TcpdfNext\Contracts\PdfDocumentInterface
Основной API-контракт, реализуемый классом Document. Любой класс, удовлетворяющий этому интерфейсу, может использоваться как прямая замена встроенной модели документа.
Методы
Пример
use TcpdfNext\Contracts\PdfDocumentInterface;
use TcpdfNext\Contracts\OutputDestination;
function generateReport(PdfDocumentInterface $pdf): string
{
return $pdf
->addPage()
->font('Helvetica', size: 14)
->text('Quarterly Report')
->output(OutputDestination::String);
}FontManagerInterface
Namespace: TcpdfNext\Contracts\FontManagerInterface
Определяет загрузку, регистрацию, подмножественное встраивание и поиск метрик шрифтов. Встроенный FontManager реализует этот интерфейс, но вы можете предоставить пользовательскую реализацию для специализированных источников шрифтов.
Методы
Пример
use TcpdfNext\Contracts\FontManagerInterface;
function addCustomFonts(FontManagerInterface $fonts): void
{
$fonts->registerFont('/fonts/NotoSans-Regular.ttf', 'NotoSans');
$fonts->registerFont('/fonts/NotoSans-Bold.ttf', 'NotoSans');
if ($fonts->hasFont('NotoSans', 'B')) {
$info = $fonts->getFont('NotoSans', 'B');
echo "Ascender: {$info->ascender}";
}
}SignerInterface
Namespace: TcpdfNext\Contracts\SignerInterface
Определяет контракт для любого провайдера цифровой подписи. Реализуйте этот интерфейс для интеграции с программными сертификатами, облачными хранилищами ключей или аппаратными модулями безопасности (HSM).
Методы
Пример
use TcpdfNext\Contracts\SignerInterface;
class FileSigner implements SignerInterface
{
public function __construct(
private readonly string $certPath,
private readonly string $keyPath,
private readonly string $password,
) {}
public function sign(string $data): string
{
$cert = file_get_contents($this->certPath);
$key = openssl_pkey_get_private(
file_get_contents($this->keyPath),
$this->password,
);
openssl_pkcs7_sign(/* ... */);
// Return raw signature bytes
}
public function certificate(): string { /* ... */ }
public function chain(): array { return []; }
public function estimatedSize(): int { return 8192; }
public function algorithm(): string { return 'sha256WithRSAEncryption'; }
}HsmSignerInterface
Namespace: TcpdfNext\Contracts\HsmSignerInterface
Расширяет SignerInterface для аппаратных модулей безопасности, которые никогда не раскрывают приватный ключ. Вместо подписания сырых данных HSM подписывает предварительно вычисленный дайджест.
Методы
Все методы из SignerInterface, плюс:
Пример
use TcpdfNext\Contracts\HsmSignerInterface;
class AwsCloudHsmSigner implements HsmSignerInterface
{
public function __construct(
private readonly string $keyId,
private readonly AwsKmsClient $kms,
private readonly string $certPem,
) {}
public function sign(string $data): string
{
$digest = hash('sha256', $data, binary: true);
return $this->signDigest($digest, 'sha256');
}
public function signDigest(string $digest, string $algorithm): string
{
$result = $this->kms->sign([
'KeyId' => $this->keyId,
'Message' => $digest,
'MessageType' => 'DIGEST',
'SigningAlgorithm' => 'RSASSA_PKCS1_V1_5_SHA_256',
]);
return $result['Signature'];
}
public function certificate(): string { return $this->certPem; }
public function chain(): array { return []; }
public function estimatedSize(): int { return 16384; }
public function algorithm(): string { return 'sha256WithRSAEncryption'; }
}Использование интерфейсов для тестирования
Все четыре интерфейса спроектированы для лёгкого мокирования с помощью PHPUnit или Mockery.
use PHPUnit\Framework\TestCase;
use TcpdfNext\Contracts\FontManagerInterface;
class TextRendererTest extends TestCase
{
public function testCalculatesWidth(): void
{
$fonts = $this->createMock(FontManagerInterface::class);
$fonts->method('hasFont')->willReturn(true);
$fonts->method('stringWidth')
->with('Hello', 'Helvetica', 12.0, '')
->willReturn(26.64);
$renderer = new TextRenderer($fonts);
$this->assertEqualsWithDelta(26.64, $renderer->width('Hello'), 0.01);
}
}См. также
- Обзор API -- Все пакеты одним взглядом
- Справочник Enums -- Enum-ы, используемые этими интерфейсами (Orientation, Alignment, OutputDestination)
- API документа -- Конкретный класс, реализующий PdfDocumentInterface
- Руководство по безопасности -- Полное руководство по шифрованию и цифровым подписям