1

我正在使用 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并且工作正常。

我的问题是,当我想在屏幕上显示消息时:

用户控制器.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,
        ]);
}

布局/登录.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');
?>

我要查看的消息延迟一页刷新。例如。设想:

  1. 进入登录页面
  2. 想用错误的密码登录并点击提交
  3. 页面刷新,找不到任何信息
  4. 使用良好的信用登录并单击提交
  5. 我已登录并在主页上看到错误消息(密码错误)。
4

1 回答 1

1

flash messenger 插件旨在在下一个请求时显示消息,并且可用于例如post-request-get 插件

如果您的代码在呈现它们的同一请求中生成消息,则只需将消息直接传递给视图模型,无需插件。

return new ViewModel(
    [
        'messages' => $form->getMessages(),
        // ... other variables
    ]
);

与您的问题无关,但在loginAction您发布的代码中$this->authManager->login,无论您的表单是否已验证,都会调用该方法。您可能希望在 else 之后调用该方法if (!$form->isValid()) { ...

于 2018-03-26T17:09:24.293 回答