init
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user