2017-09-13 146 views
0

我有一个验证器,看起来像这样:的Symfony验证修改表单字段

class ValidUSPSAddressValidator extends ConstraintValidator 
    { 
     public function validate($protocol, Constraint $constraint) 
     { 
      $verify = new USPSAddressVerify('*******'); 
      $uspsAddress = new USPSAddress(); 
      $apartment = $protocol->getApartment(); 
      $address = $protocol->getAddress(); 
      $city = $protocol->getCity(); 
      $state = $protocol->getState(); 
      $zip = $protocol->getZip(); 


      $uspsAddress->setApt($apartment); 
      $uspsAddress->setAddress($address); 
      $uspsAddress->setCity($city); 
      $uspsAddress->setState($state); 
      $uspsAddress->setZip5($zip); 
      $uspsAddress->setZip4(''); 
      $verify->addAddress($uspsAddress); 

      $verify->verify(); 
      $response = $verify->getArrayResponse(); 
      $responseAddress = $response['AddressValidateResponse']['Address']; 


      if ($verify->isError()) { 
       $this->context->buildViolation($constraint->message) 
        ->addViolation(); 
      }else{ 
       $protocol->setAddress($responseAddress['Address2']); 
       $protocol->setCity($responseAddress['City']); 
       $protocol->setState($responseAddress['State']); 
       $protocol->setZip($responseAddress['Zip5']); 

       //****** THE BELOW IF ****************** 
       if($responseAddress['Address2'] != $address || $responseAddress['City'] != $city || $responseAddress['State'] != $state || $responseAddress['Zip5'] != $zip){ 
        $this->context->buildViolation($constraint->verify) 
         ->addViolation(); 
       } 

      } 
     } 
    } 

望着最终的IF内它的语句和代码...我想设置字段什么USPS的反应是和验证器基本上给用户最后一次机会,看到更新后的数据修改字段,然后再次重新验证,只要数据与USPS数据完全匹配,它就会保留它。问题是protocol-> setXXXXX()设置要保留的对象上的数据,但只是在重新显示表单时不显示字段中的数据...

回答

0

Validator是验证对象,也许尝试使用data transformersform listeners或甚至event listeners,并跳过验证器内部的这种逻辑。

+0

我最终添加到窗体监听器“PRE_SUBMIT”。它做我需要的东西,但是感觉就像这个解决方案,至少我这样做的方式有点破解...当响应从USPS回来时,我改变所有的字段以匹配,如果有任何数据从用户最初提交的内容改变,我添加一个错误的表单只是基本上说要仔细检查地址。在这一点上,用户希望接受更正后的地址,然后再次提交...任何其他指针可以改进此过程? – snoop168