Actionからエラーを渡す

Validatorで判定できず、Action::execute()でエラー判定をした場合にエラーメッセージをerrorListに追加する方法を防備録として書いておきます。

$ cat ~/public_html/cart/login/form.html


<form action="login.php">
<input type="hidden" name="action" value="login_done">
<input name="user">{errorList->getMessage key="user" assign=nameMessages}{foreach from=$nameMessages item=message}{$message|escape}{/foreach}
<input name="password">{errorList->getMessage key="password" assign=nameMessages}{foreach from=$nameMessages item=message}{$message|escape}{/foreach}
<input type="submit">

$ cat ~/webapp/module/login/done/Login_Done.class.php
class Login_Done {

function execute() {
$log =& LogFactory::getLog();
$log->debug("Login_Doneが実行されました", "Login_Done#execute");

$flag = $this->isValidPassword();
if ($flag !== true) {
$container =& DIContainerFactory::getContainer();
$actionChain =& $container->getComponent("ActionChain");
$errorList =& $actionChain->getCurErrorList();
$errorList->add('password', 'パスワードが違います。'."[${type}]");

return "input";
}

return "success";
}

funtion isValidPassword() {
// 実際の判定処理
return false;
}

}

今までは[Validate]セクションでは捕まえられないロジック的なエラーが発生した場合、それを判定したAction::execute()の返り値で表示のHTML(テンプレート)を変更することで対処していました。例で書くと以下の感じです。

class Login_Done {
function execute() {
$log =& LogFactory::getLog();
$log->debug("Login_Doneが実行されました", "Login_Done#execute");

if (パスワードが間違っている場合) {
return "invalid_password";
} elseif (その他も諸々のエラー) {
return "error";
} else {
return "success";
}
}
}

maple/の下を眺めていて「DIContainerFactory::getContainer();」という一文を読んで、今更ながらコンテナをトップレベルから取得できることを知りました。Seasarを含めてDIコンテナをもっと勉強しなければいけないなあと実感。
それにしても、フィルター等を公開されている方々のサンプルであまりこの機能を利用してはいないのは不思議です。バリデーターだとエラーを返すかどうかだから他のコンテナを触る必要がないからですかね。