summaryrefslogtreecommitdiff
path: root/src/Validator.php
diff options
context:
space:
mode:
authorAsko Nomm <asko@bien.ee>2022-02-22 21:32:37 +0100
committerAsko Nomm <asko@bien.ee>2022-02-22 21:32:37 +0100
commitb0fd14cd71d60c1b9926aff10fe9e8eeebe1285c (patch)
treeff5f1689ffa87a84d8c7487d8a64c885ce7b592e /src/Validator.php
parent4256c45b6b9c96400b8f372b289be1127495ac56 (diff)
Lots of documentation and basic tests
Diffstat (limited to 'src/Validator.php')
-rw-r--r--src/Validator.php175
1 files changed, 0 insertions, 175 deletions
diff --git a/src/Validator.php b/src/Validator.php
deleted file mode 100644
index 72ae8ee..0000000
--- a/src/Validator.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Askonomm\Validator;
-
-/**
- * The Validator takes in an array of fields, an array of
- * rules and optionally an array of validators. If no validators
- * are provided, default validators will be used instead, which are:
- *
- * - `Validators::len()`
- * - `Validators::email()`
- * - `Validators::required()`
- *
- * The key of each item in the `$fields` array must correspond to the
- * the key of each item in the `$rules` array, so that Validator
- * would know how to connect the two to each other.
- *
- * The `$rules` must have a value that is a string where the rules
- * are separated by a `|` character, and each rule must match the key of
- * the implemented validator, such as `len`, `email` or one that you have
- * implemented yourself. Additionally, each rule can take in a modifier,
- * where the name of the rule and the modifier is separated by a `:` character.
- *
- * For example, say we have a validator called `len` which takes a modifier that
- * lets that validator validate the length of a string, in such a case we'd write
- * that rule as `len:8`, which would indicate using a `len` validator and passing
- * a modifier with the value `8` to it.
- *
- * Example usage of Validator:
- *
- * ```php
- * $fields = ['email' => 'asko@bien.ee'];
- * $rules = ['email' => 'required|email'];
- * $validator = new Validator($fields, $rules);
- *
- * if ($validator->fails()) {
- * return $validator->errors();
- * }
- * ```
- *
- * If you want to implement your own validators then simply create
- * a data structure that looks like this:
- *
- * ```php
- * // Create the validator
- * $validator = [
- * 'error' => function(string $field, $modifier): string {
- * return "${field} had some sort of an error.";
- * },
- * 'validates' => function(string $value, $modifier): bool {
- * // validate your $value here and return true if
- * // the validation succeeded, or false if there was
- * // an error, in which case the rule's error will be
- * // added to the array of errors used by Validator.
- * }
- * ];
- *
- * // Add validator to Validator
- * $validator = new Validator($fields, $rules, [
- * 'rule-name' => $validator
- * ]);
- * ```
- *
- * If you want to also use the default validators, and add yours as an extra,
- * simply join the array of your validators with the array that you get from
- * `$validator->defaultValidators()`, for example:
- *
- * ```php
- * $validators = [
- * ...$this->defaultValidators(),
- * 'rule-name' => $validator,
- * ]);
- *
- * $validator = new Validator($fields, $rules, $validators);
- * ```
- * @author Asko Nomm <asko@bien.ee>
- */
-class Validator
-{
- private array $errors = [];
-
- public function __construct(
- private array $fields,
- private array $rules,
- array $validators = [],
- ) {
- if (empty($validators)) {
- $this->validators = $this->defaultValidators();
- }
-
- $this->validate();
- }
-
- /**
- * Returns the default, built-in validators.
- *
- * @return array
- */
- public function defaultValidators(): array
- {
- return [
- 'len' => Validators::len(),
- 'email' => Validators::email(),
- 'required' => Validators::required(),
- ];
- }
-
- /**
- * Runs `$this->rules` over `$this->fields` to construct
- * potential errors that will be stored as an array of strings
- * in `$this->errors`.
- *
- * @return void
- */
- private function validate(): void
- {
- foreach ($this->rules as $field => $rule) {
- $value = $this->fields[$field];
-
- foreach (explode('|', $rule) as $item) {
- if (str_contains($item, ':')) {
- [$name, $modifier] = explode(':', $item);
-
- if (!$this->rules[$name]['validates']($value, $modifier)) {
- $this->errors[] = $this->rules[$name]['error']($field, $modifier);
- }
- } else {
-
- if (!$this->rules[$item]['validates']($value)) {
- $this->errors[] = $this->rules[$item]['error']($field);
- }
- }
- }
- }
- }
-
- /**
- * Returns a boolean `true` if there have been any errors.
- * Returns `false` otherwise.
- *
- * @return boolean
- */
- public function fails(): bool
- {
- return count($this->errors) !== 0;
- }
-
- /**
- * Returns an array of strings where each string
- * is a single error that happened during validation.
- *
- * @return array
- */
- public function errors(): array
- {
- return $this->errors;
- }
-
- /**
- * If errors are present, returns the first one.
- * Otherwise returns an empty string.
- *
- * @return string
- */
- public function firstError(): string
- {
- if (count($this->errors) > 0) {
- return $this->errors[0];
- }
-
- return '';
- }
-}