1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
<?php
namespace BEdita\Core\Model\Validation;
class LocationsValidator extends ObjectsValidator
{
public function __construct()
{
parent::__construct();
$this->setProvider('locations', self::class);
$this
->add('coords', 'valid', [
'rule' => 'checkWkt',
'provider' => 'locations',
])
->allowEmptyString('coords')
->allowEmptyString('address')
->allowEmptyString('locality')
->allowEmptyString('postal_code')
->allowEmptyString('country_name')
->allowEmptyString('region');
}
public static function checkWkt($value)
{
static $regex = '/^POINT\s?\((?P<lng>\-?[0-9\.]+) (?P<lat>\-?[0-9\.]+)\)$/i';
if (!is_string($value) || !preg_match($regex, $value, $matches)) {
return 'invalid Well-Known Text';
}
return static::checkCoordinates([$matches['lat'], $matches['lng']]);
}
public static function checkCoordinates($value)
{
if (!is_array($value) || count($value) !== 2 || !isset($value[0]) || !isset($value[1])) {
return 'coordinates must be a pair of values';
}
$lat = filter_var($value[0], FILTER_VALIDATE_FLOAT);
if ($lat === false || abs($lat) > 90) {
return 'invalid latitude';
}
$lng = filter_var($value[1], FILTER_VALIDATE_FLOAT);
if ($lat === false || $lng > 180 || $lng <= -180) {
return 'invalid longitude';
}
return true;
}
}