[10], DomainIdentifier::ISBN13 => [13], DomainIdentifier::EAN8 => [8], DomainIdentifier::EAN13 => [13], DomainIdentifier::UPC_A => [12], DomainIdentifier::UPC_E => [8], DomainIdentifier::GTIN => [14], DomainIdentifier::ISSN => [8], DomainIdentifier::ISMN => [13], DomainIdentifier::ASIN => [10], DomainIdentifier::JAN => [13], DomainIdentifier::AIC6 => [6], DomainIdentifier::AIC9 => [9], ]; private IdentifierChecksum $checksum; public function __construct(?IdentifierChecksum $checksum = null) { $this->checksum = $checksum ?? new IdentifierChecksum(); } public function validate(string $identifierType, string $normalizedValue): array { $notes = []; $expectedLengths = self::LENGTHS[$identifierType] ?? []; if ($expectedLengths !== [] && ! in_array(strlen($normalizedValue), $expectedLengths, true)) { $notes[] = 'Length mismatch: expected ' . implode(' or ', $expectedLengths) . ' characters.'; return ['checksum_valid' => null, 'notes' => $notes]; } if ($identifierType === DomainIdentifier::ASIN && preg_match('/^[A-Z0-9]{10}$/', $normalizedValue) !== 1) { $notes[] = 'ASIN contains invalid characters.'; return ['checksum_valid' => null, 'notes' => $notes]; } $checksumValid = $this->checksum->validate($identifierType, $normalizedValue); if ($checksumValid === false) { $notes[] = 'Checksum invalid.'; } elseif ($checksumValid === true) { $notes[] = 'Checksum valid.'; } else { $notes[] = 'Checksum not defined for this identifier family.'; } return ['checksum_valid' => $checksumValid, 'notes' => $notes]; } }