我有一个控制器,它将输入从表单传递到模型类以执行验证。如果验证成功,我希望允许流程继续并呈现与控制器关联的默认视图。
我的问题是,如果验证不成功,那么我希望模型传回验证错误消息并将它们显示在单独的视图中。如何在替代视图上设置错误消息?
提前致谢。
我有一个控制器,它将输入从表单传递到模型类以执行验证。如果验证成功,我希望允许流程继续并呈现与控制器关联的默认视图。
我的问题是,如果验证不成功,那么我希望模型传回验证错误消息并将它们显示在单独的视图中。如何在替代视图上设置错误消息?
提前致谢。
好吧,您可以从控制器将它们重定向到另一个控制器中的另一个操作:
$this->_forward($newactionname,
$newcontrollername,
$newmodulename,
Array($parameters_to_pass);
}
或者你只是渲染一个不同的视图文件:
$this->render('index_alternative');
如果要重定向到同一控制器中的操作,请不要使用 _forward(),只需使用 $this->fooAction() 直接调用操作,而不是 this->_forward('foo'...
原因是由于控制器正在构建而可能发生的性能和错误。当您调用 _forward 时,不仅 predispatch 再次运行(这是意料之中的),而且 init() 和构造函数也被再次调用。如果您的控制器从其他控制器扩展,那么所有这些控制器也将被调用,包括它们的 init()。如果您的 init() 中有代码,它将运行两次,如果您正在写入数据库,它将写入两次!避免整个事情并直接调用操作并改用 $this->render() 。
如果你分析你的代码,你可以很容易地看到这个问题,
为什么要在不同的视图中显示错误消息?为什么不在视图中构建条件?如果表单有错误,则回显消息,否则回显表单。
您可以使用 $this->_forward 转发到具有相应视图的另一个操作。你可以随心所欲地传递。只需传递表单对象,它包含所有错误消息。或者,您可以从表单对象中检索某些错误消息或所有错误消息,并将它们传递给视图或操作。
FlashMessenger 可以成为解决方案的一部分吗? http://framework.zend.com/manual/en/zend.controller.actionhelpers.html