summaryrefslogtreecommitdiff
path: root/src/Http/Validation
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2019-07-09 21:43:18 +0200
committerIgor Scheller <igor.scheller@igorshp.de>2019-07-09 21:43:18 +0200
commit7414f9b23dbcc66e5f0efda3d0cbfd79372ec780 (patch)
tree891a11b71d8b25922fc4b343dbc77a01a0646ba1 /src/Http/Validation
parent508695efb253d7bc0caea1fa017ed5608d774596 (diff)
Implemented Validation for controllers
Diffstat (limited to 'src/Http/Validation')
-rw-r--r--src/Http/Validation/Validates.php154
-rw-r--r--src/Http/Validation/ValidatesRequest.php37
-rw-r--r--src/Http/Validation/ValidationServiceProvider.php28
-rw-r--r--src/Http/Validation/Validator.php76
4 files changed, 295 insertions, 0 deletions
diff --git a/src/Http/Validation/Validates.php b/src/Http/Validation/Validates.php
new file mode 100644
index 00000000..2e3a1a73
--- /dev/null
+++ b/src/Http/Validation/Validates.php
@@ -0,0 +1,154 @@
+<?php
+
+namespace Engelsystem\Http\Validation;
+
+use InvalidArgumentException;
+
+class Validates
+{
+ /**
+ * @param mixed $value
+ * @return bool
+ */
+ public function accepted($value): bool
+ {
+ return in_array($value, ['true', '1', 'y', 'yes', 'on', 1, true], true);
+ }
+
+ /**
+ * @param string $value
+ * @param array $parameters ['min', 'max']
+ * @return bool
+ */
+ public function between($value, $parameters): bool
+ {
+ $this->validateParameterCount(2, $parameters, __FUNCTION__);
+ $size = $this->getSize($value);
+
+ return $size >= $parameters[0] && $size <= $parameters[1];
+ }
+
+ /**
+ * @param mixed $value
+ * @return bool
+ */
+ public function bool($value): bool
+ {
+ return in_array($value, ['1', 1, true, '0', 0, false], true);
+ }
+
+ /**
+ * @param mixed $value
+ * @param array $parameters ['1,2,3,56,7']
+ * @return bool
+ */
+ public function in($value, $parameters): bool
+ {
+ $this->validateParameterCount(1, $parameters, __FUNCTION__);
+
+ return in_array($value, explode(',', $parameters[0]));
+ }
+
+ /**
+ * @param mixed $value
+ * @return bool
+ */
+ public function int($value): bool
+ {
+ return filter_var($value, FILTER_VALIDATE_INT) !== false;
+ }
+
+ /**
+ * @param string $value
+ * @param array $parameters ['max']
+ * @return bool
+ */
+ public function max($value, $parameters): bool
+ {
+ $this->validateParameterCount(1, $parameters, __FUNCTION__);
+ $size = $this->getSize($value);
+
+ return $size <= $parameters[0];
+ }
+
+ /**
+ * @param string $value
+ * @param array $parameters ['min']
+ * @return bool
+ */
+ public function min($value, $parameters)
+ {
+ $this->validateParameterCount(1, $parameters, __FUNCTION__);
+ $size = $this->getSize($value);
+
+ return $size >= $parameters[0];
+ }
+
+ /**
+ * @param mixed $value
+ * @param array $parameters ['1,2,3,56,7']
+ * @return bool
+ */
+ public function notIn($value, $parameters): bool
+ {
+ $this->validateParameterCount(1, $parameters, __FUNCTION__);
+
+ return !$this->in($value, $parameters);
+ }
+
+ /**
+ * @param mixed $value
+ * @return bool
+ */
+ public function numeric($value): bool
+ {
+ return is_numeric($value);
+ }
+
+ /**
+ * @param mixed $value
+ * @return bool
+ */
+ public function required($value): bool
+ {
+ if (
+ is_null($value)
+ || (is_string($value) && trim($value) === '')
+ ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @param mixed $value
+ * @return int|float
+ */
+ protected function getSize($value)
+ {
+ if (is_numeric($value)) {
+ return $value;
+ }
+
+ return mb_strlen($value);
+ }
+
+ /**
+ * @param int $count
+ * @param array $parameters
+ * @param string $rule
+ *
+ * @throws InvalidArgumentException
+ */
+ protected function validateParameterCount(int $count, array $parameters, string $rule)
+ {
+ if (count($parameters) < $count) {
+ throw new InvalidArgumentException(sprintf(
+ 'The rule "%s" requires at least %d parameters',
+ $rule,
+ $count
+ ));
+ }
+ }
+}
diff --git a/src/Http/Validation/ValidatesRequest.php b/src/Http/Validation/ValidatesRequest.php
new file mode 100644
index 00000000..33ff76af
--- /dev/null
+++ b/src/Http/Validation/ValidatesRequest.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Engelsystem\Http\Validation;
+
+use Engelsystem\Http\Exceptions\ValidationException;
+use Engelsystem\Http\Request;
+
+trait ValidatesRequest
+{
+ /** @var Validator */
+ protected $validator;
+
+ /**
+ * @param Request $request
+ * @param array $rules
+ * @return array
+ */
+ protected function validate(Request $request, array $rules)
+ {
+ if (!$this->validator->validate(
+ (array)$request->getParsedBody(),
+ $rules
+ )) {
+ throw new ValidationException($this->validator);
+ }
+
+ return $this->validator->getData();
+ }
+
+ /**
+ * @param Validator $validator
+ */
+ public function setValidator(Validator $validator)
+ {
+ $this->validator = $validator;
+ }
+}
diff --git a/src/Http/Validation/ValidationServiceProvider.php b/src/Http/Validation/ValidationServiceProvider.php
new file mode 100644
index 00000000..2f1c6359
--- /dev/null
+++ b/src/Http/Validation/ValidationServiceProvider.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Engelsystem\Http\Validation;
+
+use Engelsystem\Application;
+use Engelsystem\Container\ServiceProvider;
+use Engelsystem\Controllers\BaseController;
+
+class ValidationServiceProvider extends ServiceProvider
+{
+ public function register()
+ {
+ $validates = $this->app->make(Validates::class);
+ $this->app->instance(Validates::class, $validates);
+
+ $validator = $this->app->make(Validator::class);
+ $this->app->instance(Validator::class, $validator);
+ $this->app->instance('validator', $validator);
+
+ $this->app->afterResolving(function ($object, Application $app) {
+ if (!$object instanceof BaseController) {
+ return;
+ }
+
+ $object->setValidator($app->get(Validator::class));
+ });
+ }
+}
diff --git a/src/Http/Validation/Validator.php b/src/Http/Validation/Validator.php
new file mode 100644
index 00000000..a9235a5f
--- /dev/null
+++ b/src/Http/Validation/Validator.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Engelsystem\Http\Validation;
+
+use Illuminate\Support\Str;
+use InvalidArgumentException;
+
+class Validator
+{
+ /** @var Validates */
+ protected $validate;
+
+ /** @var string[] */
+ protected $errors = [];
+
+ /** @var array */
+ protected $data = [];
+
+ /**
+ * @param Validates $validate
+ */
+ public function __construct(Validates $validate)
+ {
+ $this->validate = $validate;
+ }
+
+ /**
+ * @param array $data
+ * @param array $rules
+ * @return bool
+ */
+ public function validate($data, $rules)
+ {
+ $this->errors = [];
+ $this->data = [];
+
+ foreach ($rules as $key => $values) {
+ foreach (explode('|', $values) as $parameters) {
+ $parameters = explode(':', $parameters);
+ $rule = array_shift($parameters);
+ $rule = Str::camel($rule);
+
+ if (!method_exists($this->validate, $rule)) {
+ throw new InvalidArgumentException('Unknown validation rule: ' . $rule);
+ }
+
+ $value = isset($data[$key]) ? $data[$key] : null;
+ if (!$this->validate->{$rule}($value, $parameters, $data)) {
+ $this->errors[$key][] = implode('.', ['validation', $key, $rule]);
+
+ continue;
+ }
+
+ $this->data[$key] = $value;
+ }
+ }
+
+ return empty($this->errors);
+ }
+
+ /**
+ * @return array
+ */
+ public function getData(): array
+ {
+ return $this->data;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getErrors(): array
+ {
+ return $this->errors;
+ }
+}