Files
kiri-router/src/Validator/Binding.php
T

106 lines
3.6 KiB
PHP
Raw Normal View History

2023-12-15 16:14:39 +08:00
<?php
namespace Kiri\Router\Validator;
use Kiri;
use Kiri\Router\Validator\RequestFilter\BetweenValidatorFilter;
use Kiri\Router\Validator\RequestFilter\InValidatorFilter;
use Kiri\Router\Validator\RequestFilter\LengthValidatorFilter;
use Kiri\Router\Validator\RequestFilter\MaxLengthValidatorFilter;
use Kiri\Router\Validator\RequestFilter\MaxValidatorFilter;
use Kiri\Router\Validator\RequestFilter\MinLengthValidatorFilter;
use Kiri\Router\Validator\RequestFilter\MinValidatorFilter;
use Kiri\Router\Validator\RequestFilter\NotBetweenValidatorFilter;
use Kiri\Router\Validator\RequestFilter\NotInValidatorFilter;
use Kiri\Router\Validator\RequestFilter\RequiredValidatorFilter;
use Kiri\Router\Validator\RequestFilter\RoundValidatorFilter;
use Kiri\Router\Validator\RequestFilter\MustValidatorFilter;
use Kiri\Router\Validator\RequestFilter\EmailValidatorFilter;
use Kiri\Router\Validator\RequestFilter\RequestFilterInterface;
use Kiri\Router\Validator\RequestFilter\PhoneValidatorFilter;
/**
*
*/
#[\Attribute(\Attribute::TARGET_PROPERTY)]
class Binding implements RequestFilterInterface
{
const array TYPES = [
'required' => ['class' => RequiredValidatorFilter::class],
'length' => ['class' => LengthValidatorFilter::class],
'minLength' => ['class' => MinLengthValidatorFilter::class],
'maxLength' => ['class' => MaxLengthValidatorFilter::class],
'in' => ['class' => InValidatorFilter::class],
'notIn' => ['class' => NotInValidatorFilter::class],
'between' => ['class' => BetweenValidatorFilter::class],
'notBetween' => ['class' => NotBetweenValidatorFilter::class],
'max' => ['class' => MaxValidatorFilter::class],
'min' => ['class' => MinValidatorFilter::class],
'round' => ['class' => RoundValidatorFilter::class],
'must' => ['class' => MustValidatorFilter::class],
'email' => ['class' => EmailValidatorFilter::class],
'phone' => ['class' => PhoneValidatorFilter::class],
];
/**
* @param string $field
* @param array $rules
* @param mixed $defaultValue
*/
public function __construct(public string $field, public array $rules, public mixed $defaultValue = null)
{
}
/**
* @param object $class
* @param string $property
* @return array
*/
public function dispatch(object $class, string $property): array
{
// TODO: Implement dispatch() method.
$array = [];
2024-04-15 15:15:08 +08:00
if (count($this->rules) < 1) {
return $array;
}
2023-12-15 16:14:39 +08:00
foreach ($this->rules as $key => $rule) {
if (is_string($key)) {
$array[] = $this->getValidator($key, $rule);
} else if (method_exists($this, $rule)) {
$array[] = [$class, $rule, false];
} else {
$array[] = $this->getValidator($key, $rule);
}
}
if (!is_null($this->defaultValue)) {
$class->{$property} = $this->defaultValue;
}
return $array;
}
/**
* @param $key
* @param $rule
* @return array
* @throws
*/
protected function getValidator($key, $rule): array
{
2023-12-18 02:09:27 +08:00
if (is_numeric($key)) {
2023-12-18 02:10:50 +08:00
$class = self::TYPES[$rule];
2023-12-18 02:09:27 +08:00
} else {
2024-04-15 15:15:08 +08:00
$class = array_merge(self::TYPES[$key], ['value' => $rule, 'field' => $key]);
2023-12-18 02:09:27 +08:00
}
2023-12-15 16:14:39 +08:00
$isFirst = false;
if ($class['class'] === RequiredValidatorFilter::class) {
$isFirst = true;
}
2023-12-15 19:45:05 +08:00
return [Kiri::createObject($class), 'dispatch', $isFirst];
2023-12-15 16:14:39 +08:00
}
}