Zend-framework-forms-and-validation

提供:Dev Guides
移動先:案内検索

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

フォームページ

フォームページ

エラーページの検証

エラーページ