目次

実用的なアプリケーション開発 2 (ログイン処理)

ログインアクションの追加

フォームが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';
}

以上の状態でログインボタンを押すと、

という処理の流れで、ホーム画面が表示されると思います。

実際には画面遷移する前に、(あたりまえですが)フォーム値のチェックや認証処理を行い、エラーが発生した場合はエラーメッセージを表示させる必要があります。

フォーム値の取得

認証を行うためには、フォームから送信された値を取得する必要があります。そのためには、アクションクラスと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すると、その値が表示されるかと思います。

これで何となくお分かりかと思いますが、フォーム値にアクセスするには(非常に大雑把に言うと)

という手順になります。

バリデーション(フォーム値の検証)

たかがフォーム値にアクセスするのに何故こんな面倒な手順が必要なのか、にはいくつか理由がありますが(ほとんどはセキュリティ上の理由)、この方法の最大のメリットはフォーム値の自動検証です。

アクションスクリプトのスケルトンを生成すると、アクションフォームに以下のようなコメントも生成されているかと思います。

         /*
         '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: [フォーム値のバリデーションを行う]