会員登録フォームのバリデーション

会員登録フォームのバリデーションの処理を書いていきましょう。バリデーションとは、ユーザーから入力されたデータが正しいものであるかを検証する作業のことをいいます。

送信されたユーザー情報を取得する

送信されたユーザー情報は、パラメーターから取得します。ユーザー情報が入ったパラメーターを取得するにはparamメソッドを使用します。

会員登録フォームからPOSTされた情報を受け取ってみましょう。この処理では、POSTであって、仮登録の処理であるかを、事前に確認しています。

<%
  # POSTリクエストの処理
  if ($self->method eq 'POST') {
    # 処理方法
    my $op = param('op');
    $op = '' unless defined $op;
    
    # 仮登録の処理
    if ($op eq 'register') {
      # ユーザー情報の取得
      # ユーザーID
      my $code = param('code');
      
      # パスワード
      my $password = param('password');
      
      # メールアドレス
      my $mail = param('mail');
    }
  }
%>

ユーザーIDのバリデーション

ユーザーIDが正しいものであることを確認しましょう。ユーザーIDが正しいというのは、Mojoliciousスタートアップでは次のように定義します。

  • ユーザーIDが指定されていること
  • ユーザーIDが、ASCIIコードの英数字とアンダーバーの1文字以上で構成されていること
  • ユーザーIDの長さがサービスで利用できるユーザーIDの長さの制限内であること
  • ユーザーIDが、存在するユーザーのユーザーIDと重複しないこと
  • ユーザーIDが、異なるメールアドレスのユーザー認証待ちのユーザーのユーザーIDと重複しないこと

ユーザーIDは、一意でなければならないので、これをチェックするために、データベースにアクセスする必要があることに注意しましょう。

ユーザーIDのバリデーションを書いていきましょう。正しくない場合は、エラー情報に追加するようにしています。

ユーザーIDが指定されていること

まず最初に、ユーザーIDが空ではないことを確認しましょう。エラーは、$errorsというハッシュのリファレンスに保存しておきます。文字列の長さは、length関数で取得できます。

my $errors = {};
if (length $user_code > 0) {
  
}
else {
  # エラー処理
  $errors->{user_code} = 'ユーザーIDを指定してください。';
}

ユーザーIDが、ASCIIコードの英数字とアンダーバーの1文字以上で構成

ユーザーIDが、ASCIIコードの英数字とアンダーバーの1文字(a-zA-Z0-9_)以上で構成されていることをチェックするには、Perlの正規表現を使いましょう。

正規表現は以下の二つのどちらかで表現できます。素直に文字クラスで書くか、PerlのASCIIコードで構成されたワード文字を表現する文字クラスを使います。

# 文字クラスで素直に書く
^[a-zA-Z0-9_]+$

# PerlのASCIIコードで構成されたワード文字を表現する文字クラスを使う
^\p{PosixWord}+$

Perlのコードで書いてみます。


# Perlのワード文字(a-zA-Z0-9_)
if ($user_code =~ /^\p{PosixWord}+$/) {
  
}
else {
  # エラー処理
  $errors->{user_code} = 'ユーザーIDに利用できる文字は「a-zA-Z0-9_」です。';
}

ユーザーIDの長さがサービスで利用できるユーザーIDの長さの制限内であること

ユーザーIDの長さがサービスで利用できるユーザーIDの長さの制限内であることをチェックしましょう。

グローバルに利用されている、Twitterというサービスでは、ユーザーIDは15文字以内となっています。

Mojoliciousスタートアップでは、これを参考にして、ユーザーIDの長さの制限は、15文字以内にします。文字列の長さは、length関数で取得できます。

# ユーザー名の長さの制限 15文字
if (length $user_code <= 15) {
  
}
else {
  # エラー処理
  $errors->{user_code} = 'ユーザーIDに利用できる文字の長さは15文字以内です。';
}

(執筆中)

関連情報