どーも!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にします!
コメント