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

142 lines
3.1 KiB
PHP
Raw Normal View History

2023-04-15 23:29:27 +08:00
<?php
2023-04-16 01:24:30 +08:00
declare(strict_types=1);
2023-04-15 23:29:27 +08:00
2023-04-15 23:31:16 +08:00
namespace Kiri\Router\Validator;
2023-04-15 23:29:27 +08:00
2023-04-15 23:31:16 +08:00
use Kiri\Router\Interface\ValidatorInterface;
2023-04-16 00:06:10 +08:00
use Kiri\Router\Request;
2023-11-09 22:08:24 +08:00
use Psr\Http\Message\RequestInterface;
2023-04-15 23:31:16 +08:00
use Psr\Http\Message\ServerRequestInterface;
2023-04-15 23:29:27 +08:00
2023-10-08 18:48:09 +08:00
/**
* class Validator
*/
2023-04-15 23:29:27 +08:00
class Validator
{
2023-08-18 21:08:58 +08:00
/**
* @var ValidatorInterface[]
*/
2023-08-21 17:24:55 +08:00
protected array $rules = [];
2023-04-15 23:29:27 +08:00
2023-08-21 17:24:55 +08:00
protected string $message = '';
2023-04-15 23:29:27 +08:00
2023-08-21 17:24:55 +08:00
protected object $formData;
2023-04-15 23:31:16 +08:00
2023-08-18 21:08:58 +08:00
/**
* @param object $formData
*/
public function setFormData(object $formData): void
{
$this->formData = $formData;
}
2023-04-16 03:51:18 +08:00
2023-08-18 21:08:58 +08:00
/**
* @return object
*/
public function getFormData(): object
{
return $this->formData;
}
2023-04-16 03:51:18 +08:00
2023-08-18 21:08:58 +08:00
/**
* @param string $name
* @param ValidatorInterface $rule
* @return void
*/
public function addRule(string $name, ValidatorInterface $rule): void
{
2023-11-09 20:45:16 +08:00
if (!isset($this->rules[$name])) {
$this->rules[$name] = [];
}
$this->rules[$name][] = $rule;
2023-08-18 21:08:58 +08:00
}
2023-04-15 23:31:16 +08:00
2023-05-02 15:28:28 +08:00
/**
* @param ServerRequestInterface|Request $request
* @return Validator
*/
2023-08-18 21:08:58 +08:00
public function bindData(ServerRequestInterface|Request $request): static
{
if ($request->isPost) {
$data = $request->getParsedBody();
} else {
$data = $request->getQueryParams();
}
foreach ($data as $key => $value) {
2023-11-09 22:08:24 +08:00
if (!property_exists($this->formData, $key)) {
$this->addError($key);
return $this;
}
$type = new \ReflectionProperty($this->formData, $key);
if (!($type->getType() instanceof \ReflectionUnionType)) {
$value = match ($type->getType()?->getName()) {
'int' => (int)$value,
'float' => (float)$value,
default => $value
};
2023-08-18 21:08:58 +08:00
}
2023-11-09 22:08:24 +08:00
if ($value === 'Null') {
$value = null;
}
$this->formData->{$key} = $value;
2023-08-18 21:08:58 +08:00
}
return $this;
}
/**
2023-11-09 22:08:24 +08:00
* @param RequestInterface $request
2023-08-18 21:08:58 +08:00
* @return bool
*/
2023-11-09 22:08:24 +08:00
public function run(RequestInterface $request): bool
2023-08-18 21:08:58 +08:00
{
2023-11-09 22:08:24 +08:00
if (!empty($this->message)) {
return false;
}
2023-08-18 21:08:58 +08:00
foreach ($this->rules as $name => $rule) {
2023-11-09 22:08:24 +08:00
$value = $request->query($name, null);
if ($request->getIsPost()) {
$value = $request->post($name, null);
}
2023-11-09 20:45:16 +08:00
foreach ($rule as $item) {
2023-11-09 22:08:24 +08:00
/** @var ValidatorInterface $item */
if (!$item->dispatch($value, $this->formData)) {
2023-11-09 20:45:16 +08:00
return $this->addError($name);
}
2023-08-18 21:08:58 +08:00
}
2023-11-09 22:08:24 +08:00
$this->formData->{$name} = $value;
2023-08-18 21:08:58 +08:00
}
return true;
}
/**
* @param $field
* @return bool
*/
private function addError($field): bool
{
2023-11-09 20:45:16 +08:00
$this->message = 'Field ' . $field . ' param format fail.';
2023-08-18 21:08:58 +08:00
return false;
}
/**
* @return string
*/
public function error(): string
{
return $this->message;
}
2023-04-15 23:29:27 +08:00
}