On this page
+-
+
+
- + Further reading + + +
Cookbook
+ + +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.
<?php
+
+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
+ {
+ $this->add([
+ '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']);
+assert($filter->isValid());
+
+$result = addTo5($filter->getValues()['anInteger']);
+