フォーム

フォームはWebアプリケーションに欠かせない要素です。composer.json にfoa/filter-input-bundlefoa/filter-input-bundle を追加してください。

{
    // more
    "require": {
        // more
        "foa/filter-input-bundle": "~1.1",
        "foa/filter-intl-bundle": "~1.1"
    }
}

使い方

フォームを作るためにはAura\Input\Formクラスを拡張し、initメソッドをオーバーライドします。

以下に例を示します。

<?php
/**
 * {$PROJECT_PATH}/src/App/Input/ContactForm.php
 */
namespace App\Input;

use Aura\Input\Form;

class ContactForm extends Form
{
    public function init()
    {
        $states = array(
            'AL' => 'Alabama',
            'AK' => 'Alaska',
            'AZ' => 'Arizona',
            'AR' => 'Arkansas',
            // ...
        );
        // すべてのフィールド名が一つの配列としてセットアップされるようにします。そうすることですべてのフィールドの値を$_POST['contact']で取得することができます。
        $this->setName('contact');
        // inputフィールドを設定します。
        // first_nameフィールドは、sizeとmaxlength属性を持つinput text として扱うようにビューレイヤーに知らせます。
        $this->setField('first_name', 'text')
            ->setAttribs(array(
                'id' => 'first_name',
                'size' => 20,
                'maxlength' => 20,
            ));

        // stateフィールドは、特定のオプション属性を持ったselectとして扱うようにビューレイヤーに知らせます(配列のキーがオプションのvalueとなり、配列の値が表示テキストになります)。
        $this->setField('state', 'select')
            ->setAttribs(array(
                 'id' => 'state',
            ))
            ->setOptions($states);

        $this->setField('message', 'textarea')
            ->setAttribs([
                'id' => 'message',
                'cols' => 40,
                'rows' => 5,
            ]);
        // etc.

        // フィルタオブジェクトを取得します。
        $filter = $this->getFilter();
        // フィルタをセットします。
        $filter->addSoftRule('first_name', $filter::IS, 'string');
        $filter->addSoftRule('first_name', $filter::IS, 'strlenMin', 4);
        $filter->addSoftRule('state', $filter::IS, 'inKeys', array_keys($states));
        $filter->addSoftRule('message', $filter::IS, 'string');
        $filter->addSoftRule('message', $filter::IS, 'strlenMin', 6);
    }
}

Note : input, intl, filterはv1のコンポーネントを使用しています。

設定

App\Input\ContactFormを使うクラスのコンストラクタでタイプヒントを指定している場合、依存を注入するためにdiを使用するのはとても賢明なやり方です。

また、下記のようにすることもできます。

$di->params['Vendor\Package\SomeDomain']['contact_form'] = $di->lazyNew('App\Input\ContactForm');

値の設定

fill()メソッドを使用してフォームの値を集めます。

$this->contact_form->fill($_POST['contact']);

このメソッドはAuraの文脈では$this->request->post->get()に相当します。

ユーザー入力のバリデーション

filter()メソッドを使用してフォームのバリデーションを行えます。

// フィルタを適用します。
$pass = $this->contact_form->filter();

// すべてのフィルタをパスしましたか?
if ($pass) {
    // はい、入力値は妥当です。
} else {
    // いいえ、入力値は妥当ではありません。
}

レンダリング

ContactFormオブジェクトを渡したと仮定すると、ビューにアサインされる変数名はcontact_formとなります。フィールドの付属情報を取得するために、フォームオブジェクトのgetメソッドが使用でき、取得した値をそのままinputヘルパーに渡すことができます。

例を下記に示します :

echo $this->input($this->contact_form->get('first_name'));