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 95 96 97 98 99 100 101 102 103 104
<?php
namespace ICanBoogie\Validate\Validator;
use ICanBoogie\Validate\Context;
class Type extends AbstractValidator
{
const ALIAS = 'type';
const DEFAULT_MESSAGE = "should be of type {type}";
const PARAM_TYPE = 'type';
static private $mapping = [
'is' => [ 'array', 'bool', 'double', 'float', 'int', 'integer', 'long',
'null', 'numeric', 'object', 'real', 'resource', 'scalar', 'string' ],
'ctype' => [ 'alnum', 'alpha', 'cntrl', 'digit', 'graph', 'lower',
'print', 'punct', 'space', 'upper', 'xdigit' ]
];
public function validate($value, Context $context)
{
$context->message_args[self::PARAM_TYPE] = $type = $context->param(self::PARAM_TYPE);
$callable = $this->resolve_callable($this->normalize_type($type));
if ($callable)
{
return $callable($value);
}
return $value instanceof $type;
}
protected function get_params_mapping()
{
return [ self::PARAM_TYPE ];
}
protected function normalize_type($type)
{
$type = strtolower($type);
if ($type == 'boolean')
{
$type = 'bool';
}
return $type;
}
protected function resolve_callable($type)
{
foreach (self::$mapping as $prefix => $types)
{
if (in_array($type, $types))
{
return "{$prefix}_{$type}";
}
}
return null;
}
}