【问题标题】:How to check if a Flash message exists in CakePHP 3?如何检查 CakePHP 3 中是否存在 Flash 消息?
【发布时间】:2018-04-26 12:22:43
【问题描述】:

在 Yii(两个版本)中,对于 flash 消息,我们有如下方法:hasFlash 用于预先检查 flash 消息是否存在,getFlash 用于获取特定 flash 消息的内容...

在 Yii 1x 中我会说这样的话(无论是在控制器中还是在视图中):

查看:

<?php if(Yii::app()->user->hasFlash('success')): ?>
    <div class="alert alert-success">
        <?=Yii::app()->user->getFlash('success'); ?>
    </div>
<?php endif; ?>

控制器:

if($something->happend()) {
    Yii::app()->user->setFlash('success', 'You\'ve done something wonderful.');
    return $this->redirect('/elsewhere');
}

在 CakePHP 3 中这似乎是不可能的,因为我唯一能做的就是设置一个 Flash 消息:

$this->Flash->set('Welcome, to the real world.', [
    'element' => 'success',
]);

没有用于 Flash 消息的 gethas 方法,或者我能找到的与 FlashComponentFlashHelper 类相关的任何类似方法。

关于在 CakePHP 3 中实现 Flash 消息的另一件事是您呈现它们并将其显示给访问者的方式;您只需在视图/布局中说以下内容:

<?= $this->Flash->render(); ?>

该方法实际上会进行渲染,检查是否存在 Flash,等等...问题是我需要检查 Flash 消息是否已发送/存在,然后在布局中执行其他操作。现在对我来说这似乎是不可能的,或者我没有找到正确的方向。

我会注意到这是 CakePHP 3 中 Flash 消息的一个非常奇怪和糟糕的实现......

最后,问题:

如何检查 Flash 消息是否存在,无论是在视图中还是在控制器中?

【问题讨论】:

  • 为什么它“奇怪”(只是因为你习惯了 Yii?),为什么它不好?这很简单,而且工作得很好。我发现手动检查闪光灯只是为了渲染它非常不方便。我不介意改进代码,但仅仅因为它不符合您的 期望而将其称为不好并不会使它变坏。 IMO 检查控制器中是否存在闪存消息是糟糕的设计。这听起来好像有更多不应该存在的逻辑。您将视图层相关逻辑放入控制器中。很明显违反了 MVC 模式。
  • @burzum 如果您对 Flash 消息传递系统有任何想法,您会意识到 FlashHelper 中的“渲染”方法实际上必须执行检查,然后强制渲染它,而不受 if 的任何控制程序员。我称之为一个非常糟糕的设计和一种完全奇怪的方法。谢谢。
  • 你想要的缺失方法使它成为一个糟糕的设计?哈哈,请坚持Yii。 ;) 我正要进行 PR 并添加缺少的方法,但由于某些原因,我突然失去了这样做的动力。
  • 总有一天你还是要这么做。

标签: php cakephp


【解决方案1】:

您可以在设置 Flash 时使用key。见下文

$this->Flash->set('Welcome, to the real world.', ['key' => 'alert']);

调用前在渲染中检查key

<?php 
if($this->Flash->render('alert')){
    echo $this->Flash->render('alert');
}
?>

【讨论】:

    【解决方案2】:

    Setting Flash Messages 上的文档说消息存储在会话中。更具体地说,它说:

    FlashComponent 的 __call() 和 set() 方法可选地接受第二个参数,一个选项数组:

    • key 默认为“flash”。会话中 Flash 键下的数组键。

    所以要检查是否存在闪存消息,您可以这样做:

    $session->check('Flash.flash')
    

    或者,如果您在设置 flash 消息时指定了一个键,您会这样做:

    $session->check('Flash.INSERT_CUSTOM_KEY')
    

    【讨论】:

    • 感谢您的回答。实际上,我自己研究了 FlashHelper 类并发现了相同的内容,但框架开发人员完全错过了这一点。这是一个方便的选择。
    • 可能是因为以前没有其他人需要这样做。 ;) 随意在 Github 上创建一张票,也许有人会做得更好:做一个拉取请求。如果您包含对新方法的适当测试,我会合并它。
    【解决方案3】:

    一个丑陋而快速的方法是:

    <?php $flashRender = $this->Flash->render(); ?>
    <?php if(!empty($flashRender)) : ?>
          <?= $flashRender ?>
    <?php endif; ?>
    

    仅在设置时渲染闪光灯

    【讨论】:

      【解决方案4】:

      $this->Session->check('Message.location_key');

      它返回真/假取决于是否有任何这样的闪存消息集。 ->read() 做同样的事情,但如果有,则返回 flash 数据(任何重要的是,它会离开会话 var,因此以后仍可以回显它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 2014-06-18
        相关资源
        最近更新 更多