如何检查CakePHP 3中是否存在Flash消息?

如何检查CakePHP 3中是否存在Flash消息?,php,cakephp,Php,Cakephp,在Yii(两个版本)中,对于flash消息,我们有如下方法:hasFlash用于检查flash消息是否事先存在,以及getFlash用于获取特定flash消息的内容 在Yii 1x中,我会这样说(无论是在控制器中还是在视图中): 视图: 在CakePHP 3中,这似乎是不可能的,因为我唯一能做的就是设置一条Flash消息: $this->Flash->set('Welcome, to the real world.', [ 'element' => 'success',

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

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

视图:

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

$this->Flash->set('Welcome, to the real world.', [
    'element' => 'success',
]);
没有
get
具有用于Flash消息的
方法,或者我可以找到与和类相关的任何类似方法

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

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

该方法将实际执行渲染,检查是否存在flash,无论什么。。。问题是我需要检查Flash消息是否已发送/存在,然后在布局中执行其他操作。现在对我来说,这似乎是不可能的,或者我看的方向不对

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

最后,问题是:

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

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

FlashComponent的_call()和set()方法可以选择使用第二个参数,即选项数组:

  • 键默认为“flash”。会话中闪存密钥下的数组密钥
因此,要检查是否存在flash消息,您需要执行以下操作:

$session->check('Flash.flash')
$session->check('Flash.INSERT_CUSTOM_KEY')
或者,如果您在设置flash消息时指定了一个键,您将执行以下操作:

$session->check('Flash.flash')
$session->check('Flash.INSERT_CUSTOM_KEY')
上的文档说明消息存储在会话中。更具体地说,它说:

FlashComponent的_call()和set()方法可以选择使用第二个参数,即选项数组:

  • 键默认为“flash”。会话中闪存密钥下的数组密钥
因此,要检查是否存在flash消息,您需要执行以下操作:

$session->check('Flash.flash')
$session->check('Flash.INSERT_CUSTOM_KEY')
或者,如果您在设置flash消息时指定了一个键,您将执行以下操作:

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

您可以在设置闪光灯时使用
。见下文

$this->Flash->set('Welcome, to the real world.', ['key' => 'alert']);
通过调用前渲染中的
键进行检查

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

您可以在设置闪光灯时使用
。见下文

$this->Flash->set('Welcome, to the real world.', ['key' => 'alert']);
通过调用前渲染中的
键进行检查

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

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

根据是否设置了此类闪存消息,它返回真/假。->read()执行同样的操作,但如果存在闪存数据,则返回闪存数据(最重要的是,它会离开会话变量,以便以后仍可以回显)。$this->session->check('Message.location_key')


根据是否设置了此类闪存消息,它返回真/假。->read()执行相同的操作,但如果存在闪存数据,则返回闪存数据(最关键的是,它会离开会话变量,以便以后仍能进行回显)。

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

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


只有在设置闪光灯时才渲染它

一种丑陋且快速的方法是:

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


仅在设置闪光灯时渲染闪光灯

谢谢您的回答。实际上,我自己也研究过FlashHelper类,发现了同样的问题,但糟糕的是,框架开发人员完全忽略了这一点。这是一个方便的选择。可能是因为以前没有人需要这样做您可以在Github上随意创建一个票证,也许有人会做得更好:做一个pull请求。如果你对新方法进行适当的测试,我会合并它。谢谢你的回答。实际上,我自己也研究过FlashHelper类,发现了同样的问题,但糟糕的是,框架开发人员完全忽略了这一点。这是一个方便的选择。可能是因为以前没有人需要这样做您可以在Github上随意创建一个票证,也许有人会做得更好:做一个pull请求。如果你为新方法加入适当的测试,我会合并它。为什么它“奇怪”(仅仅因为你习惯了Yii?),为什么它不好?它非常简单,工作也很好。我发现仅仅为了渲染而手动检查闪光灯是非常不方便的。我不介意改进代码,但是仅仅因为它不符合您的期望而称它为坏代码并不会让它变得坏。IMO检查控制器中是否存在闪存消息是错误的设计。这听起来似乎有更多不应该存在的逻辑。您正在将与视图层相关的逻辑放入控制器中。很明显,这违反了MVC模式。@burzum如果您对flash消息传递系统有任何了解,您就会意识到FlashHelper中的“render”方法实际上必须执行检查,然后强制渲染,而程序员不能控制If。我称之为一个非常糟糕的设计和一个完全古怪的方法。谢谢。你想要的一个缺少的方法使它成为一个糟糕的设计?哈哈,请坚持用Yii我正要做一个公关,并添加缺少的方法,但出于某种原因,我突然失去了这样做的动机。总有一天你仍然必须这样做。为什么它“奇怪”(只是因为你习惯了Yii?),为什么它不好?它非常简单,工作也很好。我发现仅仅为了渲染而手动检查闪光灯是非常不方便的。我不介意改进代码,但是仅仅因为它不符合您的期望而称它为坏代码并不会让它变得坏。IMO检查控制器中是否存在闪存消息是错误的设计。这听起来似乎有更多不应该存在的逻辑。您正在将与视图层相关的逻辑放入控制器中。很明显,这违反了MVC模式。@burzum如果您对flash消息传递系统有任何了解,您就会意识到FlashHelper中的“render”方法实际上必须执行检查,并且