From 3591526d86ae6269c29c097710657565984eb09d Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 13 Aug 2021 08:58:11 -0500 Subject: [PATCH] [8.x] Validated subsets (#38366) * conditional rules * simplify some code * allow closures on conditional * Apply fixes from StyleCI * fix type hint * onlyValidated and exceptValidated * change approach * Apply fixes from StyleCI * magic methods * Update src/Illuminate/Support/ValidatedInput.php Co-authored-by: Mior Muhammad Zaki * Apply fixes from StyleCI * use validator method * add test case Co-authored-by: Taylor Otwell Co-authored-by: Mior Muhammad Zaki --- .../Contracts/Support/ValidatedData.php | 11 + .../Foundation/Http/FormRequest.php | 10 + src/Illuminate/Support/ValidatedInput.php | 208 ++++++++++++++++++ src/Illuminate/Validation/Validator.php | 11 + tests/Support/ValidatedInputTest.php | 20 ++ 5 files changed, 260 insertions(+) create mode 100644 src/Illuminate/Contracts/Support/ValidatedData.php create mode 100644 src/Illuminate/Support/ValidatedInput.php create mode 100644 tests/Support/ValidatedInputTest.php diff --git a/src/Illuminate/Contracts/Support/ValidatedData.php b/src/Illuminate/Contracts/Support/ValidatedData.php new file mode 100644 index 000000000000..8e7a5207886e --- /dev/null +++ b/src/Illuminate/Contracts/Support/ValidatedData.php @@ -0,0 +1,11 @@ +validator->safe(); + } + /** * Get the validated data from the request. * diff --git a/src/Illuminate/Support/ValidatedInput.php b/src/Illuminate/Support/ValidatedInput.php new file mode 100644 index 000000000000..0b44252afc5c --- /dev/null +++ b/src/Illuminate/Support/ValidatedInput.php @@ -0,0 +1,208 @@ +input = $input; + } + + /** + * Get a subset containing the provided keys with values from the input data. + * + * @param array|mixed $keys + * @return array + */ + public function only($keys) + { + $results = []; + + $input = $this->input; + + $placeholder = new stdClass; + + foreach (is_array($keys) ? $keys : func_get_args() as $key) { + $value = data_get($input, $key, $placeholder); + + if ($value !== $placeholder) { + Arr::set($results, $key, $value); + } + } + + return $results; + } + + /** + * Get all of the input except for a specified array of items. + * + * @param array|mixed $keys + * @return array + */ + public function except($keys) + { + $keys = is_array($keys) ? $keys : func_get_args(); + + $results = $this->input; + + Arr::forget($results, $keys); + + return $results; + } + + /** + * Get the input as a collection. + * + * @return \Illuminate\Support\Collection + */ + public function collect() + { + return new Collection($this->input); + } + + /** + * Get the raw, underlying input array. + * + * @return array + */ + public function all() + { + return $this->input; + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return $this->all(); + } + + /** + * Dynamically access input data. + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + return $this->input[$name]; + } + + /** + * Dynamically set input data. + * + * @param string $name + * @param mixed $value + * @return mixed + */ + public function __set($name, $value) + { + $this->input[$name] = $value; + } + + /** + * Determine if an input key is set. + * + * @return bool + */ + public function __isset($name) + { + return isset($this->input[$name]); + } + + /** + * Remove an input key. + * + * @param string $name + * @return void + */ + public function __unset($name) + { + unset($this->input[$name]); + } + + /** + * Determine if an item exists at an offset. + * + * @param mixed $key + * @return bool + */ + #[\ReturnTypeWillChange] + public function offsetExists($key) + { + return isset($this->input[$key]); + } + + /** + * Get an item at a given offset. + * + * @param mixed $key + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($key) + { + return $this->input[$key]; + } + + /** + * Set the item at a given offset. + * + * @param mixed $key + * @param mixed $value + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($key, $value) + { + if (is_null($key)) { + $this->input[] = $value; + } else { + $this->input[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param string $key + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($key) + { + unset($this->input[$key]); + } + + /** + * Get an iterator for the input. + * + * @return \ArrayIterator + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new ArrayIterator($this->input); + } +} diff --git a/src/Illuminate/Validation/Validator.php b/src/Illuminate/Validation/Validator.php index 751b7a04b7da..1daa8aa3963c 100755 --- a/src/Illuminate/Validation/Validator.php +++ b/src/Illuminate/Validation/Validator.php @@ -14,6 +14,7 @@ use Illuminate\Support\Fluent; use Illuminate\Support\MessageBag; use Illuminate\Support\Str; +use Illuminate\Support\ValidatedInput; use RuntimeException; use stdClass; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -500,6 +501,16 @@ public function validateWithBag(string $errorBag) } } + /** + * Get a validated input container for the validated input. + * + * @return \Illuminate\Support\ValidatedInput + */ + public function safe() + { + return new ValidatedInput($this->validated()); + } + /** * Get the attributes and values that were validated. * diff --git a/tests/Support/ValidatedInputTest.php b/tests/Support/ValidatedInputTest.php new file mode 100644 index 000000000000..5a0a6408addd --- /dev/null +++ b/tests/Support/ValidatedInputTest.php @@ -0,0 +1,20 @@ + 'Taylor', 'votes' => 100]); + + $this->assertEquals('Taylor', $input->name); + $this->assertEquals('Taylor', $input['name']); + $this->assertEquals(['name' => 'Taylor'], $input->only(['name'])); + $this->assertEquals(['name' => 'Taylor'], $input->except(['votes'])); + $this->assertEquals(['name' => 'Taylor', 'votes' => 100], $input->all()); + } +}