Использование компонента Symfony Validation для проверки конкретной структуры массива в зависимости от ключа внутри данного массива - PullRequest
0 голосов
/ 23 апреля 2019

Учитывая следующий массив:

$a = [
    ['type' => 'foo', 'abc' => 'whatever'],
    ['type' => 'bar', 'xyz' => 'whatever'],
];

Я хотел бы использовать компонент проверки Symfony для проверки $a.$a должен иметь тип array, и каждый из элементов внутри него должен быть массивом и соответствовать одному из двух правил:

  • , если ключ "type" элемента равен "foo",тогда требуется ключ "abc"
  • если ключ "type" элемента равен "bar", тогда требуется ключ "xyz"

Я пытался использовать All ограничение вместе с Collection ограничение на указание полей, но это не помогло, так как в основном это заставило меня сделать "abc" и "xyz" необязательными.

Как можно было бы проверить это

1 Ответ

0 голосов
/ 23 апреля 2019

Какую версию symfony вы используете?

Я бы предложил вам создать собственное ограничение проверки для выполнения задачи.

Для этого вам нужно будет создать и расширитьдва класса.

  • A Constraint, которые будут использоваться для именования ограничения и его использования.
  • A ConstraintValidator, который будет выполнять проверку.

Оба класса должны находиться в одном и том же пространстве имен.

Примером Ограничения может быть:

namespace FooBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class ArrayStructure extends Constraint
{
    public $message = "The array structure is invalid";
}

NB Свойство "message" будетиспользуется в валидаторе для отображения сообщения об ошибке. *

ConstraintValidator может быть:

namespace FooBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

class ArrayStructureValidator extends ConstraintValidator
{
    public function validate($array, Constraint $constraint)
    {
        if (!$constraint instanceof ArrayStructure) {
            throw new UnexpectedTypeException($constraint, ArrayStructure::class);
        }

        foreach ($array as $element) {
            $reqired = null;
            switch ($element['type']) {
                case 'foo':
                    $reqired = "abc";
                case 'bar':
                    $reqired = "xyz";
            }

            if ($reqired) {
                if (array_key_exists($reqired, $element)) {
                    $this->context
                        ->buildViolation($constraint->message)
                        ->addViolation()
                    ;
                }
            }
        }
    }
}

NB Имя класса должно бытьтак же, как Constraint + "Validator" *

Вы можете использовать созданное вами пользовательское ограничение Validation, указав его использование в форме в нужных полях, например:

// ...
use FooBundle\Validator\Constraints\ArrayStructure;

class FooBarType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add("array", BarType::class, [
                "constraints" => [new ArrayStructure ()]
            ])
        // ...
    }
}

Для полной ссылки перейдите по этой ссылке .

Я надеюсь, что это было полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...