Zend-framework-forms-and-validation
Zend Framework-フォームと検証
Zend Frameworkは、 zend-form という独立したコンポーネントを提供して、フォームの作成と検証プロセスを高速化します。 モデルとビューレイヤーを接続します。 事前定義されたモデルから本格的なhtmlフォームを作成する一連のフォーム要素、フォームに対してモデルを検証する InputFilter クラス、およびフォームからモデルにデータをバインドするオプションを提供します。
フォームコンポーネントのインストール
Zendフォームコンポーネントは、以下に指定されているように Composer コマンドを使用してインストールすることができます-
composer require zendframework/zend-form
Zendフォームフレームワークには、フォームを管理するための3つのサブコンポーネントがあります。 それらは以下で詳細に説明されているとおりです-
- 要素-モデルのプロパティにマッピングされた単一のHTML入力コントロールを定義するために使用されます。
- Fieldset -要素および他の fieldset をネストされた方法でグループ化するために使用されます。
- フォーム-HTMLフォームを作成するために使用され、要素とフィールドセットで構成されています。
Zend Formsは通常、 module//src/Form ディレクトリの下に作成されます。
例
ここで、データベースに book を追加する簡単なフォームを作成しましょう。 これを行うには、次の手順に従う必要があります-
ステップ1:BookFormを作成する
- myapp/module/Tutorial/src/Form」ディレクトリの下に「BookForm.php」を作成します。 ファイルに次の変更を追加します-
<?php
namespace Tutorial\Form;
use Zend\Form\Form;
class BookForm extends Form {
public function __construct($name = null) {
parent::__construct('book');
$this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array(
'name' => 'author',
'type' => 'Text',
'options' => array(
'label' => 'Author',
),
));
$this->add(array(
'name' => 'title',
'type' => 'Text',
'options' => array(
'label' => 'Title',
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}
*Form* クラスは、モデルとそれに対応するフォームの詳細をマッピングする* addメソッド*を提供します。 *Form* クラスを拡張して *BookForm* を作成し、 *Book* モデルのフォームの詳細を追加しました。
ステップ2:ブックモデルBook.phpを更新する
以下に指定されているように、フィルターと検証を使用してモデル「*」を更新します-
<?php
namespace Tutorial\Model;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilter;
class Book implements InputFilterAwareInterface {
public $id;
public $author;
public $title;
protected $inputFilter;
public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$inputFilter->add(array(
'name' => 'id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
));
$inputFilter->add(array(
'name' => 'author',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array(
'name' => 'title',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$this->inputFilter = $inputFilter;
}
return $this->inputFilter;
}
public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->author = (!empty($data['author'])) ? $data['author'] : null;
$this->title = (!empty($data['title'])) ? $data['title'] : null;
}
}
各モデルは InputFilterAwareInterface を実装する必要があります。 InputFilterAwareInterfaceには、* setInputFilter()と getInputFilter()*の2つのメソッドがあります。
getInputFilterは、モデルの検証の詳細を取得するために使用されます。 Zendフレームワークは、フォームを検証するための豊富なフィルターとバリデーターのセットを提供します。 ブックモデルで使用されるフィルタとバリデータのいくつかは次のとおりです-
- StripTags -不要なHTMLを削除します。
- StringTrim -不要な空白を削除します。
- * StringLengthバリデータ*-ユーザーが指定された制限を超える文字を入力しないようにします。
ステップ3:BookTableクラスを更新する
*saveBook* メソッドを含めて、データベースに本を追加します。
*BookTable.php*
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) {
$this->tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
public function getBook($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
public function saveBook(Book $book) {
$data = array (
'author' => $book->author,
'title' => $book->title,
);
$id = (int) $book->id;
if ($id == 0) {
$this->tableGateway->insert($data);
} else {
if ($this->getBook($id)) {
$this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Book id does not exist');
}
}
}
}
ステップ4:TutorialControllerクラスを更新する
チュートリアルコントローラーに新しいアクションaddActionを追加します– myapp/module/Tutorial/src/Controller/TutorialController.php。
public function addAction() {
$form = new BookForm();
$form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) {
$book = new Book();
$form->setInputFilter($book->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$book->exchangeArray($form->getData());
$this->bookTable->saveBook($book);
//Redirect to list of Tutorial
return $this->redirect()->toRoute('tutorial');
}
}
return array('form' => $form);
}
*addAction* メソッドは次のプロセスを行います-
- リクエストオブジェクトを取得します。
- リクエストのhttpメソッドが post メソッドかどうかを確認します。
- リクエストのhttpメソッドが post でない場合、テンプレート add.phtml をレンダリングするだけです
- リクエストのhttpメソッドが post でない場合、 inputfilter を設定し、リクエストデータを取得してinputfilerに設定します。
- Formクラスの* isValid()*メソッドを使用して、フォームが有効かどうかを確認します。
- フォームが無効な場合、テンプレート add.phtml を再度レンダリングします
- フォームが有効な場合、ブックをデータベースに保存し、ホームページにリダイレクトします。
ステップ5:add.phtmlテンプレートを追加する
テンプレートを作成します– myapp/module/Tutorial/view/tutorial/tutorial/add.phtmlの下にあるadd.phtml
*Add.phtml*
<?php
$title = 'Add new Book';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<?php
if(!empty($form)) {
$form->setAttribute('action', $this->url('tutorial', array('action' => 'add')));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('author'))."<br>";
echo $this->formRow($form->get('title'))."<br>";
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
}
ここでは、 Form インスタンス _ $ form_ を使用してブックフォームをレンダリングしています。
ステップ6:アプリケーションを実行する
これで、アプリケーションを実行できます- http://localhost:8080/tutorial/add 。
フォームページ
エラーページの検証