【发布时间】: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 消息的 get 或 has 方法,或者我能找到的与 FlashComponent 和 FlashHelper 类相关的任何类似方法。
关于在 CakePHP 3 中实现 Flash 消息的另一件事是您呈现它们并将其显示给访问者的方式;您只需在视图/布局中说以下内容:
<?= $this->Flash->render(); ?>
该方法实际上会进行渲染,检查是否存在 Flash,等等...问题是我需要检查 Flash 消息是否已发送/存在,然后在布局中执行其他操作。现在对我来说这似乎是不可能的,或者我没有找到正确的方向。
我会注意到这是 CakePHP 3 中 Flash 消息的一个非常奇怪和糟糕的实现......
最后,问题:
如何检查 Flash 消息是否存在,无论是在视图中还是在控制器中?
【问题讨论】:
-
为什么它“奇怪”(只是因为你习惯了 Yii?),为什么它不好?这很简单,而且工作得很好。我发现手动检查闪光灯只是为了渲染它非常不方便。我不介意改进代码,但仅仅因为它不符合您的 期望而将其称为不好并不会使它变坏。 IMO 检查控制器中是否存在闪存消息是糟糕的设计。这听起来好像有更多不应该存在的逻辑。您将视图层相关逻辑放入控制器中。很明显违反了 MVC 模式。
-
@burzum 如果您对 Flash 消息传递系统有任何想法,您会意识到 FlashHelper 中的“渲染”方法实际上必须执行检查,然后强制渲染它,而不受 if 的任何控制程序员。我称之为一个非常糟糕的设计和一种完全奇怪的方法。谢谢。
-
你想要的缺失方法使它成为一个糟糕的设计?哈哈,请坚持Yii。 ;) 我正要进行 PR 并添加缺少的方法,但由于某些原因,我突然失去了这样做的动力。
-
总有一天你还是要这么做。