Symfony — получить объект сущности в классе ограничения поля

Я создал свой собственный валидатор ограничений:

class CustomConstraint extends Constraint
{
public $message = '';
}

class CustomConstraintValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
exit($this->context->getObject()); // returns null
}
}

В документы заявлено, что:

Возвращает текущий проверенный объект.

, но для меня это возвращается NULL вместо.

Постскриптум Я не хочу назначать это ограничение для Entity, только для определенных форм или полей.

Моя форма собственности, которая проверена:

->add('rejectReasons', null, array(
'property' => 'name',
'multiple' => true,
'constraints' => array(
new CustomConstraint(array(
'message' => 'Application can not be refused.'
)),
)
));

Недвижимость в юридическом лице:

/**
* @ORM\ManyToMany(targetEntity="RejectReason")
* @ORM\JoinTable(name="relationship_application_reject_reasons",
*      joinColumns={@ORM\JoinColumn(name="application_id", referencedColumnName="id", onDelete="CASCADE")},
*      inverseJoinColumns={@ORM\JoinColumn(name="reject_reason_id", referencedColumnName="id")}
*      )
*/
private $rejectReasons;

ОБНОВИТЬ

Я пытался наложить ограничение на другое свойство строки, я все еще получаю NULL,

2

Решение

смотреть на ExecutionContextInterface это говорит о том, что:

getObject () Возвращает текущий проверенный объект.

Если валидатор в настоящее время проверяет ограничение класса,
объект этого класса возвращается. Если это проверка собственность или
ограничение получения
, объект, которому принадлежит свойство / получатель, является
вернулся.

В других случаях возвращается ноль.

Итак, как вы можете видеть, вы должны присвоить классу, свойству или получателю. В противном случае вы получите null,

2

Другие решения

Если вы develep Валидатор класса не забудьте добавить метод getTargets в качестве примера:

public function getTargets()
{
return self::CLASS_CONSTRAINT;
}

Как описано Вот в доке

0

Это может помочь тем, кто проверяет формы с помощью зависимостей.
Я предполагаю, что версия Symfony 3.4 или 4.1 и у вас есть symfony/form на вашем проекте.

Лучший способ справиться с валидаторами форм Symfony с некоторой зависимостью — это использовать CustomValidators

Выше приведен пример, который я использую для работы с ними.

Предполагается, что у нас есть сущность, как

// src/Entity/myEntity.php
namespace App\Entity;
...

class myEntity
{
private $id;
private $name; // string, required
private $canDrive; // bool, not required (default=false)
private $driveLicense; // string, not required (default = null)

public function __construct()
{
$this->canDrive = false;
}
// getters and setters
}

Нам не нужно заселять $driveLicense (вызывать атрибут не обязательно), но если $canDriveменяться от false в true, сейчас $driveLicense должен иметь значение.

$driveLicense является $canDrive зависимый.

Создать форму для этого и проверить $driveLicense правильно на FormType (лучшая практика) нам нужно построить CustomConstraintValidator.

Здание CanDriveValidator

// src/Validator/Constraints/CanDrive.php
namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

class CanDrive extends Constraint
{
public $message = 'invalid_candrive_args'; // I like translators :D
}

Файл переводчика — необязательно

//src/translators/validators.en.yaml //
invalid_candrive_args: When "{{ candrivelabel }} " field is checked you must fill "{{ drivelicenselabel }}"

Валидатор

// src/Validator/Constraints/CanDriveValidator.php
namespace App\Validator\Constraints;

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

class CanDriveValidator extends ConstraintValidator
{

/**
* Checks if the passed value is valid.
*
* @param mixed $value The value that should be validated
* @param Constraint $constraint The constraint for the validation
*/
public function validate($value, Constraint $constraint)
{
$canDriveField = $this->context->getObject(); // the Field using this validator
$form = $canDriveField->getParent(); // the formType where the Field reside
$myEntity = $form->getData(); // The Entity mapped by formType

if ($myEntity->getCanDrive() == true && $myEntity->getDriveLicense() == null) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ candrivelabel }}', 'Can Drive')
->setParameter('{{ drivelicenselabel }}', 'Drive License')
->addViolation();
}
}
}

Форма myEntityType

//src/Form/myEntityType.php
namespace App\Form;
use App\Entity\myEntity;
use App\Validator\Constraints\CanDrive;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;class myEntityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name')
->add('canDrive', CheckBoxType::class, [
'required' => false,
'constraints' => array(new canDrive()),
]
)
->add('driveLicense', TextType::class, ['required' => false])
;

}public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => myEntity::class]);
}
}

Теперь при использовании звонка isValid() метод формы myEntityType и могу водить поле было проверено и driveLicense пусто, На поле canDrive будет запущено нарушение. Если могу водить имеет значение false (не проверено, не отправлено), ничего не происходит, и форма будет действительной, даже если driveLicense пусто

0

Ответ прост. Написать :

this->context->getRoot()->getData()

и у тебя есть объект.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector