【Laminas】Formを作成する!

Laminas

どーも!marusukeです!

今回は、新しいデータをブラウザから入力できるように、Formを作成します!

前回は記事はこちら(【Laminas】Viewを設定し、ブラウザに表示する!

進めていきましょう!

AlbumForm.phpを作る!

Formを司るAlbumForm.phpを作っていきます。入力フォームの作成に必要なものはlaminas-formコンポーネントで、検証に必要なコンポーネントは、laminas-inputfilterです。インストールの仕方は、こちらです。(laminas-formコンポーネントlaminas-inputfilterコンポーネント

AlbumForm.phpファイルの場所はここです。module/Album/src/Form/AlbumForm.php

記述内容は以下の通りです。

namespace Album\Form;

use Laminas\Form\Form;

class AlbumForm extends Form
{
    public function __construct($name = null)
    {
        // コンストラクタの引数は無視してください。
        parent::__construct('album');

        $this->add([
            'name' => 'id',
            'type' => 'hidden',
        ]);
        $this->add([
            'name' => 'title',
            'type' => 'text',
            'options' => [
                'label' => 'Title',
            ],
        ]);
        $this->add([
            'name' => 'artist',
            'type' => 'text',
            'options' => [
                'label' => 'Artist',
            ],
        ]);
        $this->add([
            'name' => 'submit',
            'type' => 'submit',
            'attributes' => [
                'value' => 'Go',
                'id'    => 'submitbutton',
            ],
        ]);
    }
}

AlbumForm.phpの概要を説明すると、laminas-formコンポーネントからformクラスをextendsし、id, artist, title, submitのフォーム名、属性、型タイプ、そしてラベル(表示名)を与えています。

ちなみに、laminas-formは、デフォルトでPOST通信となっています。

FilterとValidatorsを作る!

Form作成ができたので、次にFilterとValidatorを作ります。

作る場所は、エンティティであるmodule/Album/src/Model/Album.php内です。

以下のようにAlbum.phpに追記します。

namespace Album\Model;

// 以下を追記してください。
use DomainException;
use Laminas\Filter\StringTrim;
use Laminas\Filter\StripTags;
use Laminas\Filter\ToInt;
use Laminas\InputFilter\InputFilter;
use Laminas\InputFilter\InputFilterAwareInterface;
use Laminas\InputFilter\InputFilterInterface;
use Laminas\Validator\StringLength;

class Album implements InputFilterAwareInterface
{
    public $id;
    public $artist;
    public $title;

    // このvaildation用のpropertyを追加してください。
    private $inputFilter;

    public function exchangeArray(array $data)
    {
        $this->id     = !empty($data['id']) ? $data['id'] : null;
        $this->artist = !empty($data['artist']) ? $data['artist'] : null;
        $this->title  = !empty($data['title']) ? $data['title'] : null;
    }

    /* 以下を追記します!(長いです) */

    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new DomainException(sprintf(
            '%s does not allow injection of an alternate input filter',
            __CLASS__
        ));
    }

    public function getInputFilter()
    {
        if ($this->inputFilter) {
            return $this->inputFilter;
        }

        $inputFilter = new InputFilter();

        $inputFilter->add([
            'name' => 'id',
            'required' => true,
            'filters' => [
                ['name' => ToInt::class],
            ],
        ]);

        $inputFilter->add([
            'name' => 'artist',
            'required' => true,
            'filters' => [
                ['name' => StripTags::class],
                ['name' => StringTrim::class],
            ],
            'validators' => [
                [
                    'name' => StringLength::class,
                    'options' => [
                        'encoding' => 'UTF-8',
                        'min' => 1,
                        'max' => 100,
                    ],
                ],
            ],
        ]);

        $inputFilter->add([
            'name' => 'title',
            'required' => true,
            'filters' => [
                ['name' => StripTags::class],
                ['name' => StringTrim::class],
            ],
            'validators' => [
                [
                    'name' => StringLength::class,
                    'options' => [
                        'encoding' => 'UTF-8',
                        'min' => 1,
                        'max' => 100,
                    ],
                ],
            ],
        ]);

        $this->inputFilter = $inputFilter;
        return $this->inputFilter;
    }
    /* 追記はここまでです!*/
}

setInputFilter()メソッドは、例外処理です。

getInputFilter()メソッドは、inputFilterインスタンスにid, artist, titleの入力フィールドごとにFilterやVaildatorsの設定を追加していきます。

簡単にFilterとValidatorの説明をしていきます!

‘filters’ => []について

‘name’ => の部分で必要なFilterのクラスの呼び出しを行なっています。今回は、ToInt::class、StripTags::classとStringTrim::classを呼び出しています。ToInt::classは、スカラー値を返します。StripTags::classは、xmlやhtmlタグを取り除き、StringTrim::classは、文頭と文尾の空白を取り除きます。

詳細はこちら(ToIntの詳細StripTagsの詳細StringTrimの詳細

‘validators’ => []について

‘name’ => の部分で必要なValidatorsのクラスの呼び出しを行なっています。今回は、StringLength::classを呼び出しています。StringLength::classは、optionsで指定した配列の内容で検証します。詳細はこちら(StringLengthの詳細

今回は、ここまでです。お疲れ様でした!Formを司るAlbumForm.phpを作り、エンティティであるAlbum.phpにFormのFilterとValidatorsを追記しました。

次は、これらのFormを動かすための設定をControllerにします!

コメント

タイトルとURLをコピーしました