10 – Create Blog input filter

Something important to note about what’s defined in an InputFilter is that you define both the client-side validation and the server validation. These two are name separated and duplicated. Let me explain.

In an InputFilter you declare ‘filters’ and ‘validators’. Validators are used both server and client side. On the client-side they’re used in the views to add attributes to the form fields. For example, a validator “StringLength” with the option [‘min’ => 10] makes sure that the form field receives an attribute of ‘length’ with value{,10}, which is the Regex pattern for a maximum of 10 characters. A default form error message is also created to show the user in case this validator will be violated and the form will not be send until the condition is met. Server side the validator will be used again to do almost the same, the received value is validated to match the validator and it will throw an error if it’s violated and halt execution. (An example for when this could happen is if you remove the client side attribute in your Dev Tools when you’ve loaded the form).

Filters get executed server-side. They modify the received data and get executed before the validators. (That is important!) Examples are the commonly used filters “StripTags” and “StringTrim”. They’re used to remove HTML tags and special characters, respectively, from strings. This is to prevent malicious code injection. We don’t want a user to execute anything that we don’t know about on our server.

So, a quick summary before we make it work.

We’ve now created the route we need for the view. We created the view to show the PostForm and to fill this view we’ve created the PostForm and it’s parentAbstractForm. To validate any data we might receive we’re creating a PostInputFilter.

Now fill the \module\Blog\src\Blog\InputFilter\PostInputFilter.php file with the code below.

namespace Blog\InputFilter;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;

class PostInputFilter extends InputFilter
{
    public function __construct()
    {
        $factory = new InputFactory();

        $this->add(
            $factory->createInput([
                'name'        => 'id',
                'required'    => false,
                'allow_empty' => true,
                'filters'     => [
                    ['name' => 'Int'],
                ],
            ])
        );

        $this->add(
            $factory->createInput([
                'name'        => 'title',
                'required'    => true,
                'allow_empty' => false,
                'filters'     => [
                    ['name' => 'StripTags'],
                    ['name' => 'StringTrim'],
                ],
                'validators'  => [
                    [
                        'name'    => 'StringLength',
                        'options' => [
                        'min' => '3',
                        'max' => '128',
                        ],
                    ],
                ],
            ])
        );

        $this->add(
            $factory->createInput([
                'name'        => 'body',
                'required'    => true,
                'allow_empty' => false,
                'filters'     => [
                    ['name' => 'StripTags'],
                    ['name' => 'StringTrim'],
                ],
                'validators'  => [
                    [
                        'name'    => 'StringLength',
                        'options' => [
                        'min' => '10',
                        ],
                    ],
                ],
            ])
        );
    }
}