forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
				
			
		
			
				
	
	
		
			81 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Google's dataset includes regular expressions for validating postal codes.
 | |
|  * These regular expressions are meant to be consumed by Google's Java library,
 | |
|  * and compatibility with PHP's preg_match is not 100% guaranteed.
 | |
|  * This scripts performs validation to ensure compatibility.
 | |
|  */
 | |
| 
 | |
| include '../vendor/autoload.php';
 | |
| 
 | |
| use CommerceGuys\Addressing\Address;
 | |
| use CommerceGuys\Addressing\AddressFormat\AddressField;
 | |
| use CommerceGuys\Addressing\AddressFormat\AddressFormatRepository;
 | |
| use CommerceGuys\Addressing\Country\CountryRepository;
 | |
| use CommerceGuys\Addressing\Validator\Constraints\AddressFormatConstraint;
 | |
| use Symfony\Component\Validator\Validation;
 | |
| 
 | |
| $addressFormatRepository = new AddressFormatRepository();
 | |
| 
 | |
| $address = new Address();
 | |
| $address = $address
 | |
|   ->withAddressLine1('Address line1')
 | |
|   ->withAddressLine1('Address line2')
 | |
|   ->withLocality('Locality');
 | |
| 
 | |
| $validator = Validation::createValidator();
 | |
| 
 | |
| // Create a list of countries for which Google has definitions.
 | |
| $foundCountries = ['ZZ'];
 | |
| $countryRepository = new CountryRepository();
 | |
| $countries = $countryRepository->getList();
 | |
| $serviceUrl = 'http://i18napis.appspot.com/address';
 | |
| $index = file_get_contents($serviceUrl);
 | |
| foreach ($countries as $countryCode => $countryName) {
 | |
|   $link = "<a href='/address/data/{$countryCode}'>";
 | |
|   // This is still faster than running a file_exists() for each country code.
 | |
|   if (strpos($index, $link) !== FALSE) {
 | |
|     $foundCountries[] = $countryCode;
 | |
|   }
 | |
| }
 | |
| 
 | |
| foreach ($foundCountries as $countryCode) {
 | |
|   $addressFormat = $addressFormatRepository->get($countryCode);
 | |
|   if (!in_array(AddressField::POSTAL_CODE, $addressFormat->getUsedFields())) {
 | |
|     continue;
 | |
|   }
 | |
| 
 | |
|   $definition = file_get_contents('assets/google/' . $countryCode . '.json');
 | |
|   $definition = json_decode($definition, TRUE);
 | |
|   // If country definition has zip examples, check if they pass validation.
 | |
|   if (isset($definition['zipex'])) {
 | |
|     $zipExamples = explode(',', $definition['zipex']);
 | |
|     $address = $address->withCountryCode($countryCode);
 | |
| 
 | |
|     foreach ($zipExamples as $zipExample) {
 | |
|       if (strpos($zipExample, ':') !== FALSE) {
 | |
|         // Ignore ranges for now, the non-range examples are enough.
 | |
|         continue;
 | |
|       }
 | |
| 
 | |
|       $address = $address->withPostalCode($zipExample);
 | |
|       $violations = $validator->validate($address, new AddressFormatConstraint());
 | |
|       $formattedExamples = implode(', ', $zipExamples);
 | |
|       foreach ($violations as $violation) {
 | |
|         if ($violation->getPropertyPath() == '[postalCode]') {
 | |
|           $message = $violation->getMessage();
 | |
|           $postalCodePattern = $addressFormat->getPostalCodePattern();
 | |
|           echo "Error for countrycode '$countryCode' with postal code '$zipExample'.\n";
 | |
|           echo "Error: $message\n";
 | |
|           echo "Postal code pattern: $postalCodePattern\n";
 | |
|           echo "All available postal code examples: $formattedExamples\n\n";
 | |
| 
 | |
|           // Once we catch an error in a country, don't try other examples.
 | |
|           continue 3;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |