ユーザー登録を処理する
アカウントテーブル、モデル、登録フォームが用意できたので、次は、ユーザーの登録情報を確認し、アカウントを作成するコードを記述します。この例では、フォームのアクションとして、account
という名前のコントローラ内に作成したregister
という名前のアクションが設定されているものとします。
01 public function registerAction() 02 { 03 // Create array for errors 04 $this->view->errors = array(); 05 06 if ($this->getRequest()->isPost()) { 07 08 $customer = new Default_Model_Customer(); 09 10 $result = $customer->save($this->_request->getPost()); 11 12 if (! is_array($result)) { 13 14 $this->view->created = 1; 15 16 } else { 17 18 $this->view->errors = $result; 19 20 $this->view->firstName = $this->_request->getPost('first-name'); 21 $this->view->lastName = $this->_request->getPost('last-name'); 22 $this->view->email = $this->_request->getPost('email'); 23 $this->view->pswd = $this->_request->getPost('pswd'); 24 $this->view->userName = $this->_request->getPost('username'); 25 26 } 27 28 } 29 30 }
このアクションのうち、少しわかりにくいと思われる部分について説明しておきます。
- 04行目では、データ確認プロセス全体を通して発生する、任意のエラーを格納するための配列を初期化しています。
- 登録フォームが送信された場合は、06行目で
POST
されたデータを検出し、確認およびアカウント作成プロセスを開始します。 - 10行目では、アカウントモデル内の
save()
というメソッドを呼び出して、ユーザーアカウントの作成を試みます。確認と挿入に関するロジックはすべてこのメソッドにまとめてあるため、最小限のコードで軽量なコントローラを作成できるようになっています(save()
メソッドの具体的なコードはこの後で紹介します)。ここでは、このメソッドを呼び出して配列が返された場合は、1つ以上のエラーが生じたことになるため、それらをview
変数に代入し(18行目)、フォームに情報を再表示するために各種変数に値を設定します。配列が返されなかった場合は、$this->view->created
というview
変数を作成します。この変数は、アカウントが正常に作成されたことをユーザーに通知するために使用します。
アカウントモデルのsave()
メソッドは次のようになります。
01 public function save(array $data) 02 { 03 04 // Initialize the errors array 05 $errors = array(); 06 07 // First Name 08 if (! Zend_Validate::is($data['first-name'], 'NotEmpty')) { 09 $errors[] = "Please provide your first name."; 10 } 11 12 // Last Name 13 if (! Zend_Validate::is($data['last-name'], 'NotEmpty')) { 14 $errors[] = "Please provide your last name."; 15 } 16 17 // Does Email already exist? 18 if (Zend_Validate::is($data['email'], 'EmailAddress')) { 19 20 $result = $this->findByEmail($data['email']); 21 22 if ($result != false) { 23 $errors[] = "An account using this e-mail address already exists."; 24 } 25 26 } else { 27 $errors[] = "Please provide a valid e-mail address."; 28 } 29 30 // Password must be at least 6 characters 31 $valid_pswd = new Zend_Validate_StringLength(6,20); 32 if (! $valid_pswd->isValid($data['pswd'])) { 33 $errors[] = "Your password must be 6-20 characters."; 34 } 35 36 // If no errors, insert the 37 if (count($errors) == 0) { 38 39 $data = array ( 40 'first_name' => $data['first-name'], 41 'last_name' => $data['last-name'], 42 'email' => $data['email'], 43 'pswd' => md5($data['pswd']), 44 'recovery_key' => '' 45 ); 46 47 return $this->insert($data); 48 49 } else { 50 return $errors; 51 } 52 53 }
このコードはごく単純なものなので、各行についての細かい説明は省略します。20行目に出てくるfindByEmail()
メソッドは、指定された電子メールを使用するアカウントがまだ存在しないことを確認するためのもので、これもモデル内の簡単なメソッドです。
ここで紹介した方法は、登録ロジックを作成するためのいくつかの方法のうちの1つにすぎないということを覚えていてください。しかし、ここで示したような、「モデルはファット(豊富)に、コントローラはシン(軽量)に」という原則に従うことをお勧めします。Zend Frameworkプロジェクトを統括するMatthew Weier O'Phinney氏が、まさにこの話題に関する素晴らしいブログ投稿をここに公開しています。