フォームはWebアプリケーションに欠かせない要素です。composer.json にfoa/filter-input-bundle
と foa/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'));