php - CakePHP 3 修改控制器中请求数据的正确方法
问题描述
SO上有很多关于这个的帖子,但似乎都过时了。
在 2019 年使用 CakePHP 3.7 并遵循有关实施“密码重置”电子邮件的教程:http://web.archive.org/web/20171001155555/http: //www.naidim.org/cakephp-3-tutorial-9-重设密码
该应用程序有一个users
表,其中有 2 个字段,称为passkey
和timeout
。在上面链接的示例代码中,当用户重置密码时,他们使用以下内容“取消设置”这两个字段:
$this->request->data['passkey'] = null;
$this->request->data['timeout'] = null;
这似乎已被弃用,您不能再像这样在控制器中设置请求数据。
我的计划是尝试使用array_merge()
来合并请求数据和我们想要修改的任何内容,如下所示:
$save_data = array_merge($this->request->getData(), ['passkey' => null, 'timeout' => null]);
// Note $user is the result of a find query done earlier.
$this->Users->patchEntity($user, $save_data);
这样做似乎对保存在数据库中的数据没有影响 - 它会更新密码字段(来自链接帖子上的表单)。但它不会修改数据库中的passkey
ortimeout
字段。
如果我debug($save_data)
确实给了我一个数组:
[
'password' => 'foo',
'confirm_password' => 'foo',
'passkey' => null,
'timeout' = null
];
这是错误的方法吗?我相信这已经改变的原因是请求对象是不可变的,尽管$this->request
像以前一样通过编程方式设置数据更容易。
解决方案
我不是 100% 确定我已经理解您的需求,但可以通过将链接代码重构到下面来确保在重置功能中重置密码和超时。这可能是一种方式...
// 原样
// Clear passkey and timeout
$this->request->data['passkey'] = null;
$this->request->data['timeout'] = null;
$user = $this->Users->patchEntity($user, $this->request->data);
if ($this->Users->save($user)) {
…
//到这个
$user = $this->Users->patchEntity($user, $this->request->getData());
// Clear passkey and timeout
$user->passkey = null;
$user->timeout = null;
if ($this->Users->save($user)) {
…
推荐阅读
- javascript - 带有反应的谷歌分析不起作用
- java - 403 禁止 - Spring Security
- git - 如何在 Windows 中基于文件夹设置和切换两个 Github 账户?
- c# - C# 应用程序测试连接(ping、下载、上传)到 Web 服务
- python - url中的下一个参数未显示但在django中正确打印
- android - 如何使图像适合 CardView 的大小
- aws-lambda - Cloudformation:通过 API GW 集成发现 Lambda 函数的权限无效
- unity3d - 如何在贝塞尔样条曲线上估算行进距离
- ruby - 如何优化 Ruby 方法
- python - 基于元素中文本条件的 Python Selenium Web 驱动程序等待