新規ドキュメントはこちら(http://ozaki.kyoichi.jp/content/blogsection/4/26/)に掲載しております。
ログイン処理の実装
DB(pear)を組み込むの章で作成したアクションを改良します。現状では、validatorを通れば無条件でHelloWorldモジュールのHelloWorldDBアクションにフォワードされてしまいますが、これをデータベースを参照して、入力されたユーザIDとパスワードが正しいか確認を行った上でユーザを成功ページへフォワードするように修正します。
まずユーザIDとパスワードを保持するテーブルを作成しておきます
[k-ozaki@free15 ~]$ psql myproject myproject
myproject=> create table m_login (
myproject(> user_id varchar(16) not null,
myproject(> password varchar(16) not null,
myproject(> constraint m_login_pkey primary key (user_id),
myproject(> constraint m_login_fkey foreign key (user_id) references m_user (user_id));
myproject=> insert into m_login values ('ozaki', 'secretword');
ユーザIDとパスワードよりユーザValueを返すメソッドを作成します。新たにLoginServiceとLoginDAOクラスを作成します。MyProject/webapp/ilb/JP/BANCHO/Logic/Service/LoginService.class.phpは以下のようになります
<?php /* * ログインに関するサービス * @access public * @package JP/BANCHO/Logic/Service/ * @category Service * @author Kyoichi Ozaki* @sourcefile * */ class LoginService extends Service { /* * コンストラクタ * @access public * */ function __construct() { parent::__construct(); } /* * ユーザIDコードとパスワードによりユーザの詳細を返します * @access public * @param String ユーザID * @param String パスワード * @return Object UserValue * */ function searchUserByIdAndPassword($userId, $password) { $dao = new LoginDAO($this->db); $value = $dao->searchUserByIdAndPassword($userId, $password); return $value; } } ?>
MyProject/webapp/ilb/JP/BANCHO/Database/DAO/LoginDAO.class.phpは以下のようになります
<?php /* * ログインに関わるデータにアクセスするクラス * @access public * @package JP/BANCHO/Database/DAO * @category DAO * @author Kyoichi Ozaki* @sourcefile * */ class LoginDAO extends DataAccessObject { function __construct($db) { parent::__construct($db); } /* * ユーザIDとパスワードによりユーザの詳細を返します * @access public * @param String ユーザID * @param String パスワード * @return Object UserValue * */ function searchUserByIdAndPassword($userId, $password) { $sql = " select a.USER_ID, a.FIRST_NAME, a.LAST_NAME "; $sql.= " from M_USER a "; $sql.= " left join M_LOGIN b on a.USER_ID=b.USER_ID "; $sql.= " where b.USER_ID = '".$userId."' "; $sql.= " and b.PASSWORD = '".$password."' "; $rs =& $this->db->query($sql); if (DB::isError($rs)) throw new DatabaseException($rs->getMessage(), $rs->getCode()); $value = NULL; if ($row =& $rs->fetchRow()) { $value = new UserValue(); $value->setUserId($row[0]); $value->setFirstName($row[1]); $value->setLastName($row[2]); } return $value; } } ?>
上記2クラスをautoload.iniに追加します。もうこの辺りはお決まりになってきているので、説明は不要だとは思います。MyProject/webapp/config/autoload.iniに以下の2行を追加します
LoginDAO = "%MO_WEBAPP_DIR%/lib/JP/BANCHO/Database/DAO/LoginDAO.class.php"
LoginService = "%MO_WEBAPP_DIR%/lib/JP/BANCHO/Logic/Service/LoginService.class.php"
最後に、Login処理を行うLoginCommitアクションを修正します。MyProject/webapp/modules/Default/actions/LoginCommitAction.class.phpは以下のようになります
<?php
class LoginCommitAction extends MyAction
{
public function execute ()
{
$context =& $this->getContext();
$controller =& $context->getController();
$request =& $context->getRequest();
$user =& $context->getUser();
$userId = $request->getParameter('loginName');
$password = $request->getParameter('password');
$service = new LoginService ();
$userValue = $service->searchUserByIdAndPassword($userId, $password);
if ($userValue != NULL &&
$userValue->getUserId() == $userId) {
$user->setAuthenticated(TRUE);
$controller->forward('HelloWorld', 'HelloWorldDB');
}
$request->setError('login', 'ユーザIDまたはパスワードが間違っています');
$controller->forward(MO_LOGIN_MODULE, MO_LOGIN_ACTION);
}
public function handleError ()
{
$context =& $this->getContext();
$controller =& $context->getController();
$controller->forward(MO_LOGIN_MODULE, MO_LOGIN_ACTION);
}
}
?>
これで修正は完了です。ログイン画面に行き、SQLでINSERTした通りのユーザID(ozaki)とパスワード(secretword)を入力してください。HelloWorldDBアクションに転送されれば正しく修正できています。また、パスワードをあやまって入力した場合にはエラー画面に遷移することも確認しましょう。
http://192.168.0.15/MyProject/index.php?module=Default&action=Login
まとめると、今回のポイントは:
- actionからserviceを利用してデータの確認を行う
- serviceからデータベースにアクセスするdaoを扱う
- daoクラスで予期せぬDBエラーはmojavi 3付属のDatabaseExceptionを投げる