Я использую плагин ZF3 и FlashMessenger от Zend. Этот плагин не требует какой-либо настройки. Я переопределяю его только с помощью своего пользовательского класса, потому что я хочу использовать два метода по-другому:
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');
?>
Мои сообщения для просмотра задерживаются на одну страницу обновления.
Например. сценарий:
Плагин Flash Messenger предназначен для отображения сообщений на следующий запрос и полезен, например, с пост-запрос-получить плагин.
Если ваш код генерирует сообщения в том же запросе, который их отображает, просто передайте сообщения напрямую в модель представления, плагин не нужен.
return new ViewModel(
[
'messages' => $form->getMessages(),
// ... other variables
]
);
Не связано с вашим вопросом, но в loginAction
в коде, который вы разместили, метод $this->authManager->login
вызывается независимо от того, была ли ваша форма подтверждена или нет. Вы можете поместить вызов этого метода в другое после if (!$form->isValid()) { ...
Других решений пока нет …