Skip to content

Commit

Permalink
add filter and keys style
Browse files Browse the repository at this point in the history
  • Loading branch information
brunogab committed Mar 11, 2020
1 parent cb83cca commit 1e5e8ff
Show file tree
Hide file tree
Showing 17 changed files with 946 additions and 502 deletions.
231 changes: 151 additions & 80 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
# Simple Input Sanitizer with auto Type-Casting

The most sanitizer loop your filters and apply it on input-data. `This helper:`
Sanitizer, Filter, Custom Filter, Hepler, Type-Casting for Inputs

- loop your inputs-data and search for filter and apply it.
- If no filter was found or not defined, auto Type-Casting will be apply on inputs-data.
- You can defined keys, witch will returns from inputs-data.
- Apply Filter on your Inputs-data.
- If no Filter was found/defined, automatic Type-Casting will be apply on Inputs-data.
- You can defined Keys, witch will returns from Inputs-data.

## Table of Contents

- [Installation](#installation)
- [Usage](#useage)
- [Inputs](#inputs)
- [Filters](#filters)
- [Keys](#keys)
- [Example](#example)
- [Custom Rule](#custom-rule)

## Installation

Expand All @@ -24,11 +34,10 @@ or add to your composer.json and run `composer update`:
}
```

## usage and basic example in `example.php`
## NOTICE:

> NOTICE:<br>
> Some value cannot be decided between bool-type and interer/string type ("1", 1, 0, on, off..)<br>
> Bool value check has a higher priority `by auto type-casting`:<br>
> Some value cannot be decided between bool-type and integer/string type ("1", 1, 0, on, off..)<br>
> Bool value check has a higher priority `by automatic type-casting:`<br>
>
> - `1 is bool-true (not integer)`
> - `'1' is bool-true (not string)`
Expand All @@ -41,99 +50,162 @@ or add to your composer.json and run `composer update`:
> - `'false' is bool-false (not string)`
> - `'off' is bool-false (not string)`
> - `'no' is bool-false (not string)`
> - `null is bool-false (not null)`
> - `'' is bool-false (not empty)`
- Inputs must be Array
- Filters can be String or Array or Closure or empty
- Keys can be be String or Array or empty
## Usage

```php
use Brunogab\InputHelper\InputHelper;

/** Input Data */
$inputhelper = new InputHelper;
$result = $inputhelper->run($inputs, $filters, $keys);
```

## Inputs

Inputs must be an Array:

```php
$inputs = [
'col_a' => ' ColA ',
'col_b' => ' COlB',
'col_c' => ' colc* ',
'col_d' => ' colD ',
'col_int' => ' 22 ', //given as string with space
'col_float' => ' 184.5 ', //given as string with space
'key_a' => 'Value_A',
'key_b' => 'value_B',
'key_c' => 'Value_c',
];
```

## Filters

Filter can be Empty:

```php
$filters = ''; //automatic type-casting will be applied for ALL input value
```

Filter can be String:

```php
$filters = 'trim'; //trim will be applied for ALL input value
```

Filter can be String with Pipe:

```php
$filters = 'trim|upper'; //trim and upper will be applied for ALL input value
```

Filter can be Sequential Array:

```php
$filters = ['trim','upper']; //trim and upper will be applied for ALL input value
```

Filter can be Associative Array:

```php
$filters = [
'key_a' => 'trim',
'key_b' => 'trim|upper',
'key_c' => ['trim'],
'key_d' => ['trim', 'upper'],
'key_e' => ['trim', 'upper', function ($val) {
return $val.' + closure';
}],
'key_f' => function ($val) {
return $val.' + closure';
}
];
```

> Notice: <br>
> For Inputs where no Filter was found: `automatic type-casting` will be applied
## Keys

Keys can be Empty:

```php
$keys = ''; //Result: (array) Inputs
```

Keys can be String:

```php
$keys = 'key_a'; //key_a value will be returned, Result: (string) "VALUE_A"
```

> Notice: <br>
> If the requested key was not found, Result will be: NULL
Keys can be String with Pipe:

```php
$keys = 'key_a|key_b'; //key_a and key_b value will be returned, Result: array("VALUE_A","VALUE_B")
```

> Notice: <br>
> If none of the requested keys were found, Result will be: NULL
Keys can be Sequential Array:

```php
$keys = [
'key_a',
'key_b',
'key_invalid', //not valid key -> will be ignored
];
//Result: array("VALUE_A","VALUE_B")
```

> Notice: <br>
> If none of the requested keys were found, result will be: NULL
## Example

> see in example.php
Automatic Type-Casting for Boolean Values

```php
/** Automatic Type-Casting for Boolean Values */
$inputs = [
'col_bool_1' => '1',
'col_bool_1_1' => 1,
'col_bool_true' => 'true',
'col_bool_on' => 'on',
'col_bool_yes' => 'yes',

'col_bool_0' => '0',
'col_bool_0_0' => 0,
'col_bool_false' => 'false',
'col_bool_off' => 'off',
'col_bool_no' => 'no',

'col_bool_null' => null,
'col_bool_empty' => '',
];
```

- all these Filters Styles are valid:

```php
/** Filters */
$filters = [
'col_a' => ['trim', 'lower'], //array style
'col_b' => 'trim|upper', //sting with a pipe style
'col_c' => ['trim', 'lower', function ($value) { //closure in array style
return str_replace('*', '+ replaced by closure', $value);
}],
'col_d' => function ($value) { //closure
$value = trim($value);
return ucfirst($value);
},
'col_int' => 'int',
'col_float' => 'dummy' //dummy is not valid filter -> auto type-casting
//Notice: bool has no filter defined -> auto type-casting
];

/** Filter can be String -> apply for all inputs-data */
$filters = 'trim';

/** Keys to return */
$keys = [
'col_a',
'col_b',
'asd', //not valid keys -> will be ignored
];

/** Keys can be string*/
$keys = 'col_b';

$inputhelper = new InputHelper;
$result = $inputhelper->run($inputs, $filters, $keys);
/* Result:
array (size=12)
'col_bool_1' => boolean true
'col_bool_1_1' => boolean true
'col_bool_true' => boolean true
'col_bool_on' => boolean true
'col_bool_yes' => boolean true

'col_bool_0' => boolean false
'col_bool_0_0' => boolean false
'col_bool_false' => boolean false
'col_bool_off' => boolean false
'col_bool_no' => boolean false

'col_bool_null' => boolean false
'col_bool_empty' => boolean false
*/
```

//Result without Keys:
array (size=18)
'col_a' => string 'cola' (length=4)
'col_b' => string 'COLB' (length=4)
'col_c' => string 'colc+ replaced by closure' (length=25)
'col_d' => string 'ColD' (length=4)
'col_int' => int 22
'col_float' => float 184.5
'col_bool_1' => boolean true
'col_bool_1_1' => boolean true
'col_bool_true' => boolean true
'col_bool_on' => boolean true
'col_bool_yes' => boolean true
'col_bool_0' => boolean false
'col_bool_0_0' => boolean false
'col_bool_false' => boolean false
'col_bool_off' => boolean false
'col_bool_no' => boolean false
'col_bool_null' => boolean false
'col_bool_empty' => boolean false
```

## Custom Sanitizers
## Custom Rule

You can write your custom Code and save into src/Filters/`Yourcodename`Filter.php

Expand All @@ -148,9 +220,8 @@ class YourcodenameFilter
return is_bool($val) ? 'Y' : 'N';
}
}
//then
//then simply use your custom filter
$filters = [
//simply use your custom filter
'col_a' => 'yourcodename',
'col_a' => 'yourcodename'
];
```
4 changes: 2 additions & 2 deletions docs/coverage/Filters/BoolFilter.php.html
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@
<tr><td><div align="right"><a name="10"></a><a href="#10">10</a></div></td><td class="codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr><td><div align="right"><a name="11"></a><a href="#11">11</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">do</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">)</span></td></tr>
<tr><td><div align="right"><a name="12"></a><a href="#12">12</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin"><td data-title="1 test covers line 13" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_is_empty&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true"><div align="right"><a name="13"></a><a href="#13">13</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span class="default">&nbsp;</span><span class="default">filter_var</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">FILTER_VALIDATE_BOOLEAN</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">FILTER_NULL_ON_FAILURE</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="covered-by-large-tests popin"><td data-title="2 tests cover line 13" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_is_empty&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_assoc_array_filter_invalid_or_empty&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true"><div align="right"><a name="13"></a><a href="#13">13</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span class="default">&nbsp;</span><span class="default">filter_var</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">FILTER_VALIDATE_BOOLEAN</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">FILTER_NULL_ON_FAILURE</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="warning"><td><div align="right"><a name="14"></a><a href="#14">14</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr><td><div align="right"><a name="15"></a><a href="#15">15</a></div></td><td class="codeLine"><span class="keyword">}</span></td></tr>

Expand All @@ -154,7 +154,7 @@ <h4>Legend</h4>
<span class="warning"><strong>Dead Code</strong></span>
</p>
<p>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 8.0.0</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.2</a> with <a href="https://xdebug.org/">Xdebug 2.9.2</a> and <a href="https://phpunit.de/">PHPUnit 9.0.1</a> at Sun Mar 8 14:28:17 UTC 2020.</small>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 8.0.0</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.2</a> with <a href="https://xdebug.org/">Xdebug 2.9.2</a> and <a href="https://phpunit.de/">PHPUnit 9.0.1</a> at Wed Mar 11 16:26:17 UTC 2020.</small>
</p>
<a title="Back to the top" id="toplink" href="#">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M12 11L6 5l-6 6h12z"/></svg>
Expand Down
2 changes: 1 addition & 1 deletion docs/coverage/Filters/FloatFilter.php.html
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ <h4>Legend</h4>
<span class="warning"><strong>Dead Code</strong></span>
</p>
<p>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 8.0.0</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.2</a> with <a href="https://xdebug.org/">Xdebug 2.9.2</a> and <a href="https://phpunit.de/">PHPUnit 9.0.1</a> at Sun Mar 8 14:28:17 UTC 2020.</small>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 8.0.0</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.2</a> with <a href="https://xdebug.org/">Xdebug 2.9.2</a> and <a href="https://phpunit.de/">PHPUnit 9.0.1</a> at Wed Mar 11 16:26:17 UTC 2020.</small>
</p>
<a title="Back to the top" id="toplink" href="#">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M12 11L6 5l-6 6h12z"/></svg>
Expand Down
6 changes: 3 additions & 3 deletions docs/coverage/Filters/IntFilter.php.html
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@
<tr><td><div align="right"><a name="10"></a><a href="#10">10</a></div></td><td class="codeLine"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></td></tr>
<tr><td><div align="right"><a name="11"></a><a href="#11">11</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span class="default">&nbsp;</span><span class="keyword">function</span><span class="default">&nbsp;</span><span class="default">do</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">)</span></td></tr>
<tr><td><div align="right"><a name="12"></a><a href="#12">12</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">{</span></td></tr>
<tr class="covered-by-large-tests popin"><td data-title="3 tests cover line 13" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_arrayvalue_has_invalid_filter&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_with_array&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_with_string&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true"><div align="right"><a name="13"></a><a href="#13">13</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">$val</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">\</span><span class="default">filter_var</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">FILTER_SANITIZE_NUMBER_INT</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="covered-by-large-tests popin"><td data-title="3 tests cover line 14" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_arrayvalue_has_invalid_filter&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_with_array&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_with_string&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true"><div align="right"><a name="14"></a><a href="#14">14</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span class="default">&nbsp;</span><span class="default">\</span><span class="default">intval</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="covered-by-large-tests popin"><td data-title="9 tests cover line 13" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_is_empty&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_is_not_assoc_array_with_invalid_filter&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_empty&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_string&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_string_not_valid&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_string_with_pipe&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_sequential_array&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_key_invalid&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_key_all_invalid&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true"><div align="right"><a name="13"></a><a href="#13">13</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="default">$val</span><span class="default">&nbsp;</span><span class="keyword">=</span><span class="default">&nbsp;</span><span class="default">\</span><span class="default">filter_var</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">,</span><span class="default">&nbsp;</span><span class="default">FILTER_SANITIZE_NUMBER_INT</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="covered-by-large-tests popin"><td data-title="9 tests cover line 14" data-content="&lt;ul&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_is_empty&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__filter_is_not_assoc_array_with_invalid_filter&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_empty&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_string&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_string_not_valid&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_string_with_pipe&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_is_sequential_array&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_key_invalid&lt;/li&gt;&lt;li class=&quot;covered-by-large-tests&quot;&gt;InputTest::test_inputs__keys_key_all_invalid&lt;/li&gt;&lt;/ul&gt;" data-placement="top" data-html="true"><div align="right"><a name="14"></a><a href="#14">14</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span class="default">&nbsp;</span><span class="default">\</span><span class="default">intval</span><span class="keyword">(</span><span class="default">$val</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
<tr class="warning"><td><div align="right"><a name="15"></a><a href="#15">15</a></div></td><td class="codeLine"><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">}</span></td></tr>
<tr><td><div align="right"><a name="16"></a><a href="#16">16</a></div></td><td class="codeLine"><span class="keyword">}</span></td></tr>

Expand All @@ -155,7 +155,7 @@ <h4>Legend</h4>
<span class="warning"><strong>Dead Code</strong></span>
</p>
<p>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 8.0.0</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.2</a> with <a href="https://xdebug.org/">Xdebug 2.9.2</a> and <a href="https://phpunit.de/">PHPUnit 9.0.1</a> at Sun Mar 8 14:28:17 UTC 2020.</small>
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 8.0.0</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.2</a> with <a href="https://xdebug.org/">Xdebug 2.9.2</a> and <a href="https://phpunit.de/">PHPUnit 9.0.1</a> at Wed Mar 11 16:26:17 UTC 2020.</small>
</p>
<a title="Back to the top" id="toplink" href="#">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M12 11L6 5l-6 6h12z"/></svg>
Expand Down
Loading

0 comments on commit 1e5e8ff

Please sign in to comment.