From d4122f116c937e0ec509d8cefe540146ec27a0cd Mon Sep 17 00:00:00 2001 From: "David T. Sadler" Date: Wed, 20 Oct 2021 20:59:55 +0100 Subject: Validate fields --- src/DTS/Errors.php | 30 ++++++++++++++++++ src/DTS/Session.php | 6 ++-- src/DTS/Validated.php | 14 +++++++++ src/DTS/Validator.php | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ src/templates/create.php | 9 ++++++ src/templates/edit.php | 9 ++++++ 6 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 src/DTS/Errors.php create mode 100644 src/DTS/Validated.php create mode 100644 src/DTS/Validator.php (limited to 'src') diff --git a/src/DTS/Errors.php b/src/DTS/Errors.php new file mode 100644 index 0000000..3c1dd5d --- /dev/null +++ b/src/DTS/Errors.php @@ -0,0 +1,30 @@ +errors[$key][] = $value; + } + + public function get(string $key): array + { + return $this->errors[$key]; + } + + public function has(string $key): bool + { + return array_key_exists($key, $this->errors); + } + + public function count(): int + { + return count($this->errors); + } +} diff --git a/src/DTS/Session.php b/src/DTS/Session.php index 956f4e5..e5da42f 100644 --- a/src/DTS/Session.php +++ b/src/DTS/Session.php @@ -29,13 +29,13 @@ class Session } } - public function set(string $key, string $value): void + public function set(string $key, mixed $value): void { $this->session[$key] = $_SESSION[$key] = $value; } - public function get(string $key): ?string + public function get(string $key, mixed $default = null): mixed { - return $this->session[$key] ?? null; + return $this->session[$key] ?? $default; } } diff --git a/src/DTS/Validated.php b/src/DTS/Validated.php new file mode 100644 index 0000000..5df8af7 --- /dev/null +++ b/src/DTS/Validated.php @@ -0,0 +1,14 @@ +errors = new Errors(); + + $this->validated = new Validated(); + + $this->validateUrl($request['url'], 8, 512); + + $this->validateTitle($request['title'], 8, 256); + + $this->validateTag($request['tag'], 2, 8); + } + + private function validateUrl(string $url, int $minLength, int $maxLength): void + { + $url = trim($url); + + if (filter_var($url, FILTER_VALIDATE_URL) === false) { + $this->errors->add('url', 'Must be a URL'); + } + + if (strlen($url) < $minLength || strlen($url) > $maxLength) { + $this->errors->add('url', "Must be between $minLength and $maxLength in characters in length"); + } + + if (!$this->errors->has('url')) { + $this->validated->url = $url; + } + } + + private function validateTitle(string $title, int $minLength, int $maxLength): void + { + $title = trim($title); + + if ($title === '') { + return; + } + + if (strlen($title) < $minLength || strlen($title) > $maxLength) { + $this->errors->add('title', "Must be between $minLength and $maxLength in characters in length"); + } + + if (!$this->errors->has('tite')) { + $this->validated->title = $title; + } + } + + private function validateTag(string $tag, int $minLength, int $maxLength): void + { + $tag = trim($tag); + + if ($tag === '') { + return; + } + + if (strlen($tag) < $minLength || strlen($tag) > $maxLength) { + $this->errors->add('tag', "Must be between $minLength and $maxLength in characters in length"); + } + if (preg_match('/\W/', $tag) === 1) { + $this->errors->add('tag', 'May only contain word characters'); + } + + if (!$this->errors->has('tag')) { + $this->validated->tag = strtolower($tag); + } + } +} diff --git a/src/templates/create.php b/src/templates/create.php index 483e49e..2769290 100644 --- a/src/templates/create.php +++ b/src/templates/create.php @@ -9,8 +9,17 @@ Back

+ has('url')) { ?> +

get('url')); ?>

+
+ has('title')) { ?> +

get('title')); ?>

+
+ has('tag')) { ?> +

get('tag')); ?>

+
diff --git a/src/templates/edit.php b/src/templates/edit.php index d5f5a08..c1b7bda 100644 --- a/src/templates/edit.php +++ b/src/templates/edit.php @@ -10,8 +10,17 @@

+ has('url')) { ?> +

get('url')); ?>

+
+ has('title')) { ?> +

get('title')); ?>

+
+ has('tag')) { ?> +

get('tag')); ?>

+
-- cgit v1.2.3-13-gbd6f