我们使用消息管理器来管理消息。 消息类型分有:正确提示ok、警告消息warn、错误消息err。 在程序执行流程中,消息从模型传递到控制器,然后再从控制器设置到消息管理器,视图显示的时候自动从消息管理器获取信息。 消息最终传递到html视图或json数据响应到客户端。
模型只将错误消息传递到控制器,而没有warn和ok消息。 传递方式为: 模型里面有错误的时候,使用$this->setErr(错误信息)设置错误信息并返回false,在控制器中使用 $modelObj->getErrs() 获取模型错误信息。
消息传递案例
namespace module\user\controller;
use wf\Message;
/**
* 典型的控制器中消息传递的实例
* 控制器从模型取得错误信息并通过Message::setErr()传到视图
* 如果没有错误,则传递成功的提示信息到视图
*/
class AccountController extends \wf\mvc\Controller {
public function loginAction() {
if($this->request->isPost()) {
$account = $this->request->getRequest('account');
$password = $this->request->getRequest('password');
// 处理用户登录
$userObj = new \module\user\model\UserModel();
// 执行业务逻辑
if(false !== $userObj->login($account, $password)) {
Message::setOK('登录成功'); // 将登录成功的信息传递到视图
} else {
$errs = $userObj->getErrs(); // 从模型取得错误信息
Message::setErr($errs); // 将模型返回的错误信息传递到视图以响应请求
}
// 如果是ajax请求则返回JSON数据格式
if($this->request->isAjax()) {
//输出消息
$this->showMessage();
return;
}
}
// 显示视图,视图自动去获取消息
$this->view()->render();
}
}
<!--{if Message::hasMessage()}-->
<!--{if Message::hasErr()}-->
<div class="section prompt err">
<div class="section-hd"><span class="l"></span><span class="r"></span></div>
<div class="section-bd">
<div class="box box-error-msg">
<ol class="">
<!--{loop Message::getErrs() $k $err}-->
<li>{$err}</li>
<!--{/loop}-->
</ol>
</div>
</div>
<div class="section-ft"><span class="l"></span><span class="r"></span></div>
</div>
<!--{/if}-->
<!--{if Message::hasWarn()}-->
<div class="section prompt warn">
<div class="section-hd"><span class="l"></span><span class="r"></span></div>
<div class="section-bd">
<div class="box box-warning">
<ol>
<!--{loop Message::getWarns() $warn}-->
<li>{$warn}</li>
<!--{/loop}-->
</ol>
</div>
</div>
<div class="section-ft"><span class="l"></span><span class="r"></span></div>
</div>
<!--{/if}-->
<!--{if Message::hasOK()}-->
<div class="section prompt ok">
<div class="section-hd"><span class="l"></span><span class="r"></span></div>
<div class="section-bd">
<div class="box box-success">
<ol>
<!--{loop Message::getOKs() $ok}-->
<li>{$ok}</li>
<!--{/loop}-->
</ol>
</div>
</div>
<div class="section-ft"><span class="l"></span><span class="r"></span></div>
</div>
<!--{/if}-->
控制器调用$this->showMessage();的时候,如果$_GET['ajax'] == true 或 $_GET['ajax_callback'] == true 或客户端使用XmlHttpRequest则自动响应json格式数据。 如果需要传递其它消息,则统一将返回消息设置在message下标中的值。
class AccountController extends \wf\mvc\Controller {
public function loginAction() {
Message::setErr('err 1');
Message::setErr('err 2', 302); // 设置消息下标为302
Message::setWarn('warn message');
Message::setOK('ok message');
// 如果是ajax请求则返回JSON数据格式
if($this->request->isAjaxRequest()) {
//输出消息
$this->showMessage('other message'); // 参数设置其他消息,类型可以是标量或数组
return;
}
}
}
消息最终输出为
{"err":{"0":"err 1","302":"err 2"},"ok":["ok message"],"warn":["warn message"],"message":"other message"}
err、ok、warn消息值都是字符串数组
模型中只需将业务逻辑错误的信息传递给调用者,没有warn和ok信息。 模型中执行业务逻辑的时候,如果产生错误,则设置错误消息,并返回false。控制器发现返回只false的时候,再去主动去获取错误信息。 案例:
class AccountController extends \wf\mvc\Controller {
public function loginAction() {
// 使用模型
$userObj = new \module\user\model\UserModel();
// 执行模型业务逻辑
if(false !== $userObj->doLogin($params)) {
Message::setOK('登录成功!');
} else {
//从模型获取错误信息并传递给消息管理器
Message::setErr($userObj->getErrs());
}
$this->showMessage();
}
}