S2Container+S2Dao.PHP5を使ってみる(その4)

S2Base.PHP5 with Smartyで組み合わせると、ありがたいことに画面遷移の仕組みは提供されているので、それをそのまま使います。actionからtemplateや他のactionへのredirectを指定してやれば良いという訳です。面倒なデータアクセス関係は全部s2daoがやってくれるので、あとは

  • action→dto
  • action→service
  • service→dxo
  • service→dao
  • service→他のservice
  • logic→dao
  • logic→他のlogic

という依存関係の決まりを守って作っていけば、自動的に分かりやすいプログラムが書けそうな感じです。

そんな訳で、まあUIから作っていきます。templateとactionは一対で、templateを処理する直前にactionのexecuteが実行される、ということなので、htmlのフォームで自分自身へPOSTするようにして、actionのexecute内でrequestの内容をチェックし、クリックされたsubmitボタンの名前によって遷移先を判断し、他のactionへredirectするなり自身のtemplateを指定してやるようにする、というのを基本に考えれば良さそうです。

  • memberLogin.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Login</title>
</head>
<body>

<form action="d.php" method="post">
	<input type="hidden" name="mod" value="Login"/>
	<input type="hidden" name="act" value="memberLogin"/>
	メールアドレスとパスワードを入力してログインしてください
	<br/>
	e-mail
	<br/>
	<input type="text" name="email" size="30" value="{$dto->getEmail()}"/>
	<br/>
	password
	<br/>
	<input type="password" name="password" size="30" value="{$dto->getPassword()}"/>
	<br/>
	<input type="submit" name="memberLogin:viewCart" value="ログイン"/>
	<br />
	<input type="submit" name="memberLogin:memberEntry" value="新規登録"/>
</form>

</body>
</html>

とりあえずこんな感じ。ログインはemailとpasswordで行う、という前提で、それら二つのテキストボックスと、「ログイン」「新規登録」の二つのボタンを用意します。submitボタンの名前は、わかりやすいように"遷移元のaction名:遷移先のaction名"にしてみました。別に他の命名法でもいいかと思いますが、今のところこれで不便はありません。

	<input type="hidden" name="act" value="memberLogin"/>

と、actパラメータをmemberLoginにして、自身へのPOSTを指定しています。
テキストボックスのvalueに、それぞれ
{$dto->getEmail()}
{$dto->getPassword()}
と指定していますが、viewにdtoをassignする想定です。dtoはこの画面に必要なデータのフィールドを持ち、それらそれぞれにgetter、setterがある、という訳です。まあここは後で書けばいいんですが、どうせ次はdtoを書くので...。


で、次はdtoですが、emailとpasswordは要るとして、他に余計なフィールドまで勢いで書いてしまいました。まあ、ほんとはisAuthorizedとかは後で付け足したのですが、気にしない。また、結局不要なフィールドもあるんですが、とりあえず使わなければいいだけなので放置。

<?php
class MemberLoginDto
{	
	private $id;
	private $firstName;
	private $lastName;
	private $email;
	private $password;
	private $isAuthorized;
	private $message;

	public function getId(){return $this->id;}
	public function setId($id){$this->id = $id;}
	public function getFirstName(){return $this->firstName;}
	public function setFirstName($firstName){$this->firstName = $firstName;}
	public function getLastName(){return $this->lastName;}
	public function setLastName($lastName){$this->lastName = $lastName;}
	public function getEmail(){return $this->email;}
	public function setEmail($email){$this->email = $email;}
	public function getPassword(){return $this->password;}
	public function setPassword($password){$this->password = $password;}	
	public function getIsAuthorized(){return $this->isAuthorized;}
	public function setIsAuthorized($isAuthorized){$this->isAuthorized = $isAuthorized;}	
	public function getMessage(){return $this->message;}
	public function setMessage($message){$this->message = $message;}	
	
	public function __construct(){}
}
?>

次にaction。S2Base with Smartyの機能を利用するため、implements S2Base_Actionになってます。まあ、S2Baseのaction commandで勝手にそのように生成されるので、気にせずいきます。
service interfaceとdtoのフィールドがあります。setter/getterを書いておいて、actionにDIするようにする、と。"memberLogin:memberEntry"のsubmitボタンで新規登録用actionへredirect、"memberLogin:viewCart"のsubmitボタンでログイン処理を行って、ログイン処理が成功すればviewCartへredirect。それ以外はmemberLogin自身のtemplateを処理してます。ログイン処理はまだ書いてないですが、serviceにauthorizeメソッドを実装して、結果がdto→isAuthorizedに設定されるようにしようかなーと。

<?php
class MemberLoginAction implements S2Base_Action
{
	private $service;
	private $dto;

	public function setService(MemberLoginService $service = null){ $this->service = $service; }
	public function getService(){ return $this->service; }

	public function setDto(MemberLoginDto $dto = null){ $this->dto = $dto; }
	public function getDto(){ return $this->dto; }

	public function execute(S2Base_Request $request, S2Base_View $view)
	{
		
		if($request->getParam('memberLogin:memberEntry') != null)
		{
			return "redirect:memberEntry";
		}
		elseif($request->getParam('memberLogin:viewCart') != null)
		{
			$this->dto->setEmail($request->getParam('email'));		
			$this->dto->setPassword($request->getParam('password'));
			//$this->service->authorize($this->dto); //ログイン処理をする
			//if($this->dto->getIsAuthorized() == true)
			//{
			//	$view->assign('dto',$this->dto);
			//	return "redirect:viewCart";
			//}
			$view->assign('dto', $this->dto);
			return "memberLogin.tpl";
		}
		else
		{
			$view->assign('dto', $this->dto);
			return "memberLogin.tpl";
		}
	}

}
?>

あとはaction diconですが、最初にaction classに書かれたserviceとdtoだけを使う分には、自動生成されたやつをそのまま使えば大丈夫なはず。

そんな感じで、次はserviceとdxoを書いていきます。

続く...