php – Symfony2表单验证器 – 在刷新之前比较旧值和新值
发布时间:2020-12-13 17:30:05 所属栏目:PHP教程 来源:网络整理
导读:我想知道是否有一种方式来比较一个实体之前的验证器中的旧值和新值. 我有一个服务器实体呈现一个表格的罚款.实体与状态(N→1)有关系,当状态从Unracked更改为Racked时,需要检查SSH和FTP对服务器的访问.如果未实现访问,则验证程序将失败. 我已经将验证器回调映
我想知道是否有一种方式来比较一个实体之前的验证器中的旧值和新值.
我有一个服务器实体呈现一个表格的罚款.实体与状态(N→1)有关系,当状态从Unracked更改为Racked时,需要检查SSH和FTP对服务器的访问.如果未实现访问,则验证程序将失败. 我已经将验证器回调映射到服务器实体中的方法isServerValid(),如这里所述 在伪代码中,这样的东西: public function isAuthorValid(ExecutionContextInterface $context) { $original = ... ; // get old values if( $this->status !== $original->status && $this->status === 'Racked' && $original->status === 'Unracked' ) { // check ftp and ssh connection // $context->addViolationAt('status','Unable to connect etc etc'); } } 提前致谢!
Symfony 2.5(
http://symfony.com/doc/current/cookbook/validation/custom_constraint.html)的完整示例
在此示例中,实体“NoDecreasingInteger”的“integerField”字段的新值必须高于存储值. 创建约束: // src/Acme/AcmeBundle/Validator/Constraints/IncrementOnly.php; <?php namespace AcmeAcmeBundleValidatorConstraints; use SymfonyComponentValidatorConstraint; /** * @Annotation */ class IncrementOnly extends Constraint { public $message = 'The new value %new% is least than the old %old%'; public function getTargets() { return self::CLASS_CONSTRAINT; } public function validatedBy() { return 'increment_only'; } } 创建约束验证器: // src/Acme/AcmeBundle/Validator/Constraints/IncrementOnlyValidator.php <?php namespace AcmeAcmeBundleValidatorConstraints; use SymfonyComponentValidatorConstraint; use SymfonyComponentValidatorConstraintValidator; use DoctrineORMEntityManager; class IncrementOnlyValidator extends ConstraintValidator { protected $em; public function __construct(EntityManager $em) { $this->em = $em; } public function validate($object,Constraint $constraint) { $new_value = $object->getIntegerField(); $old_data = $this->em ->getUnitOfWork() ->getOriginalEntityData($object); // $old_data is empty if we create a new NoDecreasingInteger object. if (is_array($old_data) and !empty($old_data)) { $old_value = $old_data['integerField']; if ($new_value < $old_value) { $this->context->buildViolation($constraint->message) ->setParameter("%new%",$new_value) ->setParameter('%old%',$old_value) ->addViolation(); } } } } 将验证器绑定到实体: // src/Acme/AcmeBundle/Resources/config/validator.yml AcmeAcmeBundleEntityNoDecreasingInteger: constraints: - AcmeAcmeBundleValidatorConstraintsIncrementOnly: ~ 将EntityManager注入IncrementOnlyValidator: // src/Acme/AcmeBundle/Resources/config/services.yml services: validator.increment_only: class: AcmeAcmeBundleValidatorConstraintsIncrementOnlyValidator arguments: ["@doctrine.orm.entity_manager"] tags: - { name: validator.constraint_validator,alias: increment_only } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |