2017-09-13 102 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