フォームがsubmitされた際に実行されるアクション「login_do」を追加します。
vendor/bin/ethnam-generator add-action login_do
生成されたファイルの中を見ると、'login_do'という遷移名を返すだけのアクションになっています。 今回のケースでは'login_do'というビューは不要なので、以下のように変更しておきます。
app/action/Login/Do.php:
public function perform()
{
- return 'login_do';
+ return 'index';
}
以上の状態でログインボタンを押すと、
- コントローラがlogin_doアクション呼び出す
- Sample_Action_LoginDo::perform()メソッドが実行される
- 遷移名としてindexが返される
という処理の流れで、ホーム画面が表示されると思います。
実際には画面遷移する前に、(あたりまえですが)フォーム値のチェックや認証処理を行い、エラーが発生した場合はエラーメッセージを表示させる必要があります。
認証を行うためには、フォームから送信された値を取得する必要があります。そのためには、アクションクラスと1対1で生成されるアクションフォームというオブジェクトを利用します。アクションフォームのクラス定義は、ethnam-generator add-action
を実行すると、アクションクラスと同時に生成されていますので、まずは何も考えず、app/action/Login/Do.php
に以下のようなコードを追加してみてください。
app/action/Login/Do.php
public $form = array(
+ 'mailaddress' => [
+ 'type' => VAR_TYPE_STRING,
+ ],
public function perform()
{
+ die($this->af->get('mailaddress'));
以上の状態で、フォームの「メールアドレス」に適当な文字を入力してsubmitすると、その値が表示されるかと思います。
これで何となくお分かりかと思いますが、フォーム値にアクセスするには(非常に大雑把に言うと)
- アクションフォームでフォーム定義を記述する
- アクションクラスにメンバ変数として設定されている$afオブジェクト(ActionFormの略です)のアクセサ(get()/set())を通じて値を取得/設定する
という手順になります。
たかがフォーム値にアクセスするのに何故こんな面倒な手順が必要なのか、にはいくつか理由がありますが(ほとんどはセキュリティ上の理由)、この方法の最大のメリットはフォーム値の自動検証です。
アクションスクリプトのスケルトンを生成すると、アクションフォームに以下のようなコメントも生成されているかと思います。
/*
'sample' => array(
'name' => 'Sample',
'required' => true,
'min' => null,
'max' => null,
'regexp' => null,
'custom' => null,
'filter' => null,
'form_type' => FORM_TYPE_TEXT,
'type' => VAR_TYPE_INT,
),
*/
上記のように、各フォーム値には'name'〜'type'まで計9つの属性を設定することが出来ます(必須なのは'type'のみです)。Ethnamでは、ここで設定されら属性を利用したフォーム値の自動検証機能を提供しています。
ここで先ほどのフォーム値'mailaddress'を利用して実際に試してみます。まず、先ほどの'mailaddress'の属性を下記のように変更します。
'mailaddress' => [
+ 'name' => 'メールアドレス',
+ 'required' => true,
'type' => VAR_TYPE_STRING,
],
+ 'password' => [
+ 'name' => 'パスワード',
+ 'required' => true,
+ 'type' => VAR_TYPE_STRING,
+ ],
これは、フォーム値'mailaddress'の表示名が「メールアドレス」であり、また入力が必須であることを示しています。ついでにpasswordも必須としてしまいます。
次に、アクションクラスで自動入力処理を行います。具体的には、アクションクラスのprepare()メソッドに以下のような処理を追加します。
public function prepare()
{
+ if ($this->af->validate() > 0) {
+ return 'login';
+ }
アクションフォームのvalidate()メソッドは、定義に従ってフォーム値を自動検証し、検出したエラーの数を戻り値として返します(発生したエラーの扱い等については後述します)。
この状態で、メールアドレスを空欄にしてsubmitすると以前と異なりトップページは表示されず、再度ログインページが表示されるのが分かるかと思います。
以上が、フォーム値の検証に関する基本的な説明でした。
なお、アクションクラスのprepare()メソッドとperform()メソッドの関係を知りたい場合は、Ethna_Controller::perform()のコードを見るのが手っ取り早いです。 まずアクションクラスのprepare()メソッドが呼ばれ、prepare()メソッドがnullを返した場合のみperform()メソッドが呼び出されます。
ようするに、prepare()メソッドでフォーム値の検証を行うこと、perform()メソッドでは全てのデータはサニタイズされているという前提で処理を行うことが出来る、安全且つ簡潔なコードが書けるというわけです(やっぱりStrutsの真似)。
なお、フォーム値のバリデーションについては別記事をご覧下さい。
see also: [フォーム値のバリデーションを行う]