Я создал свой собственный валидатор ограничений:
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
,
смотреть на ExecutionContextInterface это говорит о том, что:
getObject () Возвращает текущий проверенный объект.
Если валидатор в настоящее время проверяет ограничение класса,
объект этого класса возвращается. Если это проверка собственность или
ограничение получения, объект, которому принадлежит свойство / получатель, является
вернулся.В других случаях возвращается ноль.
Итак, как вы можете видеть, вы должны присвоить классу, свойству или получателю. В противном случае вы получите null
,
Если вы develep Валидатор класса не забудьте добавить метод getTargets в качестве примера:
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
Как описано Вот в доке
Это может помочь тем, кто проверяет формы с помощью зависимостей.
Я предполагаю, что версия 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.
// 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 пусто
Ответ прост. Написать :
this->context->getRoot()->getData()
и у тебя есть объект.