/** * @param Config $config * @param Constraint $constraint */ public function validate($config, Constraint $constraint) { // Проверка правильности типа if (!array_key_exists($config->getType(), $config->getAvailableTypes())) { $this->context->buildViolation($constraint->invalidTypeMessage)->atPath('type')->addViolation(); } // Если поле "тип" изменилось, валидация завершается if (in_array('type', $config->getChangedFields())) { return; } $valueConstraints = []; if ($config->getRequired()) { $valueConstraints[] = new Assert\NotBlank(); } // Валидация поля "значение" в зависимости от типа switch ($config->getType()) { case Config::TYPE_TEXT: case Config::TYPE_TEXTAREA: case Config::TYPE_WYSIWYG: $valueConstraints[] = new Assert\Type('string'); break; case Config::TYPE_INTEGER: $valueConstraints[] = new Assert\Type('integer'); break; case Config::TYPE_BOOLEAN: $valueConstraints[] = new Assert\Type('boolean'); break; case Config::TYPE_SELECT: case Config::TYPE_MULTICHOICE: $valueConstraints[] = new Assert\Choice(['choices' => array_keys((array) json_decode($config->getChoices()))]); break; case Config::TYPE_EMAIL: $valueConstraints[] = new Assert\Email(); break; case Config::TYPE_URL: $valueConstraints[] = new Assert\Url(); break; case Config::TYPE_REGEX: $valueConstraints[] = new Assert\Regex(['pattern' => $config->getChoices()]); break; } if ($valueConstraints) { $errorList = $this->validator->validate($config->getValue(), $valueConstraints); if ($errorList->count()) { $this->context->buildViolation($errorList)->atPath('value')->addViolation(); } } }