Jquery 用于ajax请求的CakePHP 3.x Flash消息

Jquery 用于ajax请求的CakePHP 3.x Flash消息,jquery,ajax,cakephp,Jquery,Ajax,Cakephp,我有一个用CakePHP3.5.13编写的应用程序 它利用内置的蛋糕。当以标准方式配置时,所有这些都可以正常工作,例如 // src/Controller/SomeController.php public function foo() { $this->Flash->set('Records updated', ['element' => 'success']); return $this->redirect(['action' => 'inde

我有一个用CakePHP3.5.13编写的应用程序

它利用内置的蛋糕。当以标准方式配置时,所有这些都可以正常工作,例如

// src/Controller/SomeController.php
public function foo()
{ 
    $this->Flash->set('Records updated', ['element' => 'success']);
    return $this->redirect(['action' => 'index']);
}

// src/Template/SomeController/index.ctp
<?= $this->Flash->render() ?>
当我使用类
.foo test
单击锚点时,它将发出ajax请求

但是重新加载页面(
window.location.reload
)不会显示flash消息。为什么会这样,因为这相当于浏览器重新加载
/somecontroller/index
,对吗

我认为修改它的唯一方法是让
foo()
返回JSON响应。在我使用的
console.log(response)
中,我可以访问响应数据并确定结果,然后添加flash消息,例如

 if (response.success !== '') {
     $('#outcome').html(response.success).addClass('alert alert-success');
 }
它将响应消息写入ID为
#output
的div,并添加适当的类以进行样式设置

当然还有比这更好的方法,因为它需要重写我需要做的每一个方法

为什么不先执行控制器函数,然后用jquery重新加载页面,记住这样做时它仍然可以访问
$\u会话


我看过插件,但想知道是否有一种我忽略的本地蛋糕方式来实现这一点?Flash组件文档中没有提到Ajax。

好的,在@ndm的帮助下,我在评论中已经解决了这个问题

解决方案是删除
SomeController::foo()中的PHP重定向:

这是因为我们在jquery中执行了等效的重定向:

window.location.href = '/some-controller/index'; 
因此,对
/somecontroller/foo
的ajax请求仍然会设置flash消息。使用jquery重定向重新加载
index.ctp
,然后该文件具有呈现flash消息的代码


如果要以这种方式重构代码,则需要确保本例中相当于
foo()
的操作只设置flash消息,不输出任何内容。您可以使用
$this->autoRender=false
来实现这一点,然后像往常一样使用
$this->Flash->set()
来设置消息。

您可能需要稍微修改一下代码(理想情况下使用实际代码),因为目前的
foo.ctp
永远不会被渲染,访问
/some controller/foo
会创建一个无休止的循环,因为方法会重定向到自身。呃,好吧,有一个输入错误,显然它应该重定向到用户单击初始锚定的页面(
/some controller/index
)。我已经更新了。无论如何,它仍然不起作用。你仍然有一个无休止的重定向循环,并且
foo.ctp
将不会被渲染。。。我假设在您的原始代码中,重定向是有条件的,但是如果看不到实际发生了什么,就很难判断到底出了什么问题。我可以在黑暗中拍摄并猜测模板正在呈现,因此消息将从会话中删除,但仅此而已。没有无休止的循环。当用户单击锚(class
.foo test
)时,它向
/some controller/foo
发出一个ajax请求。您是对的,它没有在浏览器中呈现,因为它是一个ajax请求。但是来自它的响应数据(整个网页)被输出到
console.log(response)
。然后它会重新加载
某些控制器/索引
(由于它使用的是
window.location.href
,因此会在浏览器中呈现)。假设
foo()
中的逻辑基于保存到数据库的结果是有条件的,这是正确的。如果没有ajax,它可以正常工作,那么为什么不使用ajax呢?这个问题是因为执行了
SomeController::foo()
。仅仅因为它是用ajax完成的,并不意味着不能访问
$\u会话
——它仍然是完全可以访问的。然后重新加载页面(
index.ctp
)。在我看来,这与在没有ajax的情况下执行所有这些操作是一样的——您正在
SomeController::foo()
中执行逻辑,它设置flash消息。在重定向时,它应该呈现它们吗?我还有
索引.ctp
public function foo()
{ 
    // There is no template (foo.ctp) associated with this function.
    $this->autoRender = false;

    $this->Flash->set('Records updated', ['element' => 'success']);

    // Remove line below:
    //return $this->redirect(['action' => 'index']);
}
window.location.href = '/some-controller/index';