This commit is contained in:
emmymayo
2025-02-05 23:15:46 +01:00
commit 7269c99357
16995 changed files with 3389680 additions and 0 deletions
@@ -0,0 +1,17 @@
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
namespace MailPoet\Doctrine\Validator;
if (!defined('ABSPATH')) exit;
use MailPoetVendor\Symfony\Contracts\Translation\TranslatorTrait;
class Translator implements \MailPoetVendor\Symfony\Contracts\Translation\TranslatorInterface {
use TranslatorTrait;
public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null) {
return $this->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
}
}
@@ -0,0 +1,54 @@
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
namespace MailPoet\Doctrine\Validator;
if (!defined('ABSPATH')) exit;
use MailPoetVendor\Symfony\Component\Validator\ConstraintViolationInterface;
use MailPoetVendor\Symfony\Component\Validator\ConstraintViolationListInterface;
class ValidationException extends \RuntimeException {
/** @var string */
private $resourceName;
/** @var ConstraintViolationListInterface|ConstraintViolationInterface[] */
private $violations;
public function __construct(
$resourceName,
ConstraintViolationListInterface $violations
) {
$this->resourceName = $resourceName;
$this->violations = $violations;
$linePrefix = ' ';
$message = "Validation failed for '$resourceName'.\nDetails:\n";
$message .= $linePrefix . implode("\n$linePrefix", $this->getErrors());
parent::__construct($message);
}
/** @return string */
public function getResourceName() {
return $this->resourceName;
}
/** @return ConstraintViolationListInterface|ConstraintViolationInterface[] */
public function getViolations() {
return $this->violations;
}
/** @return string[] */
public function getErrors() {
$messages = [];
foreach ($this->violations as $violation) {
$messages[] = $this->formatError($violation);
}
sort($messages);
return $messages;
}
private function formatError(ConstraintViolationInterface $violation) {
return '[' . $violation->getPropertyPath() . '] ' . $violation->getMessage();
}
}
@@ -0,0 +1,46 @@
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
namespace MailPoet\Doctrine\Validator;
if (!defined('ABSPATH')) exit;
use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
use MailPoet\Doctrine\PSRMetadataCache;
use MailPoetVendor\Symfony\Component\Validator\Validation;
class ValidatorFactory {
const METADATA_DIR = __DIR__ . '/../../../generated/validator-metadata';
/** @var AnnotationReaderProvider */
private $annotationReaderProvider;
public function __construct(
AnnotationReaderProvider $annotationReaderProvider
) {
$this->annotationReaderProvider = $annotationReaderProvider;
}
public function createValidator() {
$builder = Validation::createValidatorBuilder();
// we need to use our own translator here.
// If we let the default translator to be used in the builder it uses an anonymous class and that is a problem
// All integration tests would fail with: [Exception] Serialization of 'class@anonymous' is not allowed
$translator = new Translator();
$translator->setLocale('en');
$builder->setTranslator($translator);
// annotation reader exists only in dev environment, on production cache is pre-generated
$annotationReader = $this->annotationReaderProvider->getAnnotationReader();
if ($annotationReader) {
$builder->setDoctrineAnnotationReader($annotationReader)
->enableAnnotationMapping(true);
}
// metadata cache (for production cache is pre-generated at build time)
$isReadOnly = !$annotationReader;
$builder->setMappingCache(new PSRMetadataCache(self::METADATA_DIR, $isReadOnly));
return $builder->getValidator();
}
}
@@ -0,0 +1 @@
<?php