On this page


Using Laminas InputFilter with Static Analysis Tools

It can be tedious to assert that the array returned by a given input filter contains the keys and value types that you would expect before using those values in your domain. If you use static analysis tools such as Psalm or PHPStan, InputFilterInterface defines a generic template that can be used to refine the types you receive from the getValues() method.


namespace My;

use Laminas\Filter\ToInt;
use Laminas\Filter\ToNull;
use Laminas\I18n\Validator\IsInt;
use Laminas\InputFilter\InputFilter;use Laminas\Validator\GreaterThan;

 * @psalm-type ValidPayload = array{
 *     anInteger: int<1, max>,
 * }
 * @extends InputFilter<ValidPayload>     
final class SomeInputFilter extends InputFilter
    public function init(): void
            'name' => 'anInteger',
            'required' => true,
            'filters' => [
                ['name' => ToNull::class],
                ['name' => ToInt::class],
            'validators' => [
                ['name' => NotEmpty::class],
                ['name' => IsInt::class],
                    'name' => GreaterThan::class,
                    'options' => [
                        'min' => 1,

With the above input filter specification, one can guarantee that, if the input payload is deemed valid, then you will receive an array with the expected shape from InputFilter::getValues(), therefore, your static analysis tooling will not complain when you pass that value directly to something that expects a positive-int, for example:

 * @param positive-int $value
 * @return positive-int 
function addTo5(int $value): int
    return $value + 5;

$filter = new SomeInputFilter();
$filter->setData(['anInteger' => '123']);

$result = addTo5($filter->getValues()['anInteger']);

Further reading