我正在使用zend的ZF3和FlashMessenger插件。此插件不需要任何配置。我只用我的自定义类覆盖它,因为我想以其他方式使用两种方法:
class CustomFlashMessenger extends FlashMessenger
{
public function hasMessages($namespace = null)
{
if (null !== $namespace) {
return parent::hasMessages($namespace);
}
return parent::hasMessages('default') ||
parent::hasMessages('error') ||
parent::hasMessages('warning') ||
parent::hasMessages('info') ||
parent::hasMessages('success');
}
public function clearMessages($namespace = null)
{
if (null !== $namespace) {
return parent::clearMessages($namespace);
}
return parent::clearMessages('default') ||
parent::clearMessages('error') ||
parent::clearMessages('warning') ||
parent::clearMessages('info') ||
parent::clearMessages('success');
}
}
它已在Module.php
注册,并且工作正常。
我的问题是,当我想在屏幕上显示消息时:
UserController.php
public function loginAction()
{
$form = new LoginForm();
if (null !== $this->identity()) {
return $this->redirect()->toRoute('home');
}
if ($this->getRequest()->isPost()) {
$data = $this->params()->fromPost();
$form->setData($data);
if (!$form->isValid()) {
foreach ($form->getMessages() as $message) {
if (is_array($message)) {
$message = array_pop($message);
}
$this->flashMessenger()->addErrorMessage($message);
}
}
$data = $form->getData();
$result = $this->authManager->login($data[ 'login' ], $data[ 'password' ], $data[ 'remember_me' ]);
if ($result->getCode() == Result::SUCCESS) {
return $this->redirect()->toRoute('home');
} else {
$this->flashMessenger()->addErrorMessage('Error');
}
}
$this->layout()->setTemplate('layout/login');
return new ViewModel(
[
'form' => $form,
]);
}
布局/ login.phtml
<?php if ($this->flashMessenger()->hasMessages()) { ?>
<div class="message">
<?php echo $this->partial('partial/messages'); ?>
</div>
<?php } ?>
部分/ messages.phtml
<?php
echo $this->flashMessenger()->render('info');
echo $this->flashMessenger()->render('success');
echo $this->flashMessenger()->render('warning');
echo $this->flashMessenger()->render('error');
?>
我要查看的消息会延迟一页刷新。 例如。情形:
答案 0 :(得分:1)
flash messenger插件旨在显示 next 请求中的消息,并且对于例如 post-request-get plugin。
如果您的代码在呈现它们的同一请求中生成消息,那么只需将消息直接传递给视图模型,无需插件。
return new ViewModel(
[
'messages' => $form->getMessages(),
// ... other variables
]
);
与您的问题无关,但在您发布的代码loginAction
中,无论您的表单是否经过验证,都会调用方法$this->authManager->login
。您可能希望在if (!$form->isValid()) { ...