【Laminas】laminas-formコンポーネントでblog記事の入力フォームを作る!

Laminas

どーも!marusukeです!

前回の記事で、blog詳細ページを作成しました!今回は、blog記事を追加するための入力フォームをlaminas-formコンポーネントを活用して作ります!

作成の流れとしては、

  • Formクラスを作成する。 <= 現在ここです!
  • コントローラーを作る。
  • コントローラーのインスタンス化のためのFactoryとルートを作る。
  • モデル(repositoryクラス)を作成する。
  • view側を作る。

となります!少し長いですが、記事を分けながら少しづつ進めていきます!

laminas-formコンポーネントとは?

簡単に説明すると、laminasでのformインスタンス作成用コンポーネントです。

laminasでは、formをインスタンスとして作成し、view側でそのメソッドを呼び出して、ユーザーがデータを入力するformを作成します。

laminas-formコンポーネントの特徴として、

  • 「fieldset」というformの雛形のようなインスタンスを作成できること
  • formコンポーネント内部に検証ルールがあるため、isValid()メソッドを呼び出すだけで、入力されたデータの検証ができること(エンティティオブジェクトにinputfilterの設定が必要です)

などがあります。

laminas-formについての公式ドキュメントはこちらです。

Components laminas-form

blog記事入力用のFieldsetを作る

laminas-formコンポーネントを使用して、Formインスタンスの元となるFieldsetを作成します。

Fieldsetは、Formインスタンス作成時に使用する使い回し可能な、Formの雛形のようなものです。Fieldsetについての公式ドキュメントはこちらです。Form Collections

今回のFieldsetクラスは以下のような実装になります。

srcディレクトリ内に新たにFormディレクトリを作成し、その中にFieldsetクラスとFormクラスを作成していきます。

module/Blog/src/Form/PostFieldset.php

<?php
// namespaceは新たに作ったFormディレクトリになります。
namespace Blog\Form;

// Fieldsetサブコンポーネントの呼び出しです。
use Laminas\Form\Fieldset;

// 今回はPostFieldsetというクラス名にしています。
class PostFieldset extends Fieldset
{
    // init()メソッドが必要になります。
    public function init()
    {
        
        $this->add([
            'type' => 'hidden',
            'name' => 'id',
        ]);
        
        // ①
        $this->add([
            'type' => 'text',
            'name' => 'title',
            'options' => [
                'label' => 'Post Title',
            ],
        ]);

        $this->add([
            'type' => 'textarea',
            'name' => 'text',
            'options' => [
                'label' => 'Post Text',
            ],
        ]);
    }
}

// ①について簡単に説明します。

以下のような既存のaddメソッドにtype, nameなどの属性を指定します。

 $this->add([
      'type' => 'text',    // HTMLのinputタグのtype属性を指定します。
      'name' => 'title',   // name属性を指定します。
      'options' => [
            'label' => 'Post Title',   // label名を指定します。
      ],
 ]);

これでFieldsetが完成しました!次はFormクラスを作っていきます。

Formクラスを作成する!

今回作成するPostFormクラスは以下のようになります。先ほど作ったPostFieldsetクラスを使用して簡単に作成します。

module/Blog/src/Form/PostForm.php

<?php
namespace Blog\Form;

// Formコンポーネントを使えるようにします。
use Laminas\Form\Form;

class PostForm extends Form
{
    // Formクラスを作るときもinit()メソッドを作成します。
    public function init()
    {

        // ①
        $this->add([
            'name' => 'post',
            'type' => PostFieldset::class,
        ]);

        // ②
        $this->add([
            'type' => 'submit',
            'name' => 'submit',
            'attributes' => [
                'value' => 'Insert new Post',
            ],
        ]);
    }
}

// ①// ②の説明をします。

// ①について

$this->add([
    // view側でPostFormインスタンスを呼び出す時のnameの指定です。
    'name' => 'post',  

    // 使用するFieldsetクラスを呼び出します。
    'type' => PostFieldset::class,  
]);

// ②について

$this->add([
    'type' => 'submit',  // HTMLのinputタグのtype属性の指定です。
    'name' => 'submit',  // HTMLのinputタグのname属性の指定です。
    'attributes' => [
        'value' => 'Insert new Post',  // ボタンの文字を指定しています。
    ],
]);

ここまでで、この記事の目標であるPostFieldsetクラスとPostFormクラスを作成することが出来ました!

お疲れ様でした!

次はコントローラー(WriteController)を作成していきます!

コメント

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