CakePHP 3在控制器中修改请求数据的正确方法

时间:2019-02-22 10:42:30

标签: php cakephp

关于SO的帖子很多,但似乎都过时了。

在2019年使用CakePHP 3.7并遵循有关实现“密码重置”电子邮件的教程:http://web.archive.org/web/20171001155555/http://www.naidim.org/cakephp-3-tutorial-9-reset-password

该应用程序有一个users表,该表包含2个字段,分别为passkeytimeout。在上面链接的示例代码中,当用户重设密码时,他们使用以下方法“取消设置”这两个字段:

$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);

这样做似乎对保存在数据库中的数据没有影响-它将更新密码字段(来自链接文章中的表单)。但这不会修改数据库中的passkeytimeout字段。

如果我debug($save_data)确实给了我一系列:

[
    'password' => 'foo',
    'confirm_password' => 'foo',
    'passkey' => null,
    'timeout' = null
];

这是错误的方法吗?我相信这种更改的原因是与请求对象不可变有关的,尽管像以前一样能够通过$this->request设置数据更加容易。

1 个答案:

答案 0 :(得分:1)

我不确定是否100%理解您的需求,但是可以通过将链接的代码重构为以下内容来确保在重置功能中重置了密码和超时。这可能是一种方式...

//原样

string tumblename = string.Empty;
string tumblepostid = string.Empty;
string tumbleposttext = string.Empty;
string EncodedCharRegex = "&#[X]?[0-9|A-F]{1,12};";
HtmlWeb web = new HtmlWeb();
private void button2_Click(object sender, EventArgs e)
{
   HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.tumblr.com/search/cheese");
   HtmlNodeCollection searchResults = doc.GetElementbyId("search_posts").SelectNodes("//article"); //<-- here
   foreach (HtmlNode result in searchResults)
   {
      tumblename = result.GetAttributeValue("data-tumblelog-name", "NULL");
      tumblepostid = result.GetAttributeValue("data-id", "NULL");
      tumbleposttext = result.ChildNodes[0].InnerText.Trim().Replace("&rsquo;", "'").Replace("&nbsp;", " ").Replace("&lt;", "<").Replace(".", ". ").Replace("&hellip;", "...").Replace("&mdash;", "-");
      var z = Regex.Matches(tumbleposttext, EncodedCharRegex, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
      foreach (Match m in Regex.Matches(tumbleposttext, EncodedCharRegex, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant))
      tumbleposttext = tumbleposttext.Replace(m.Value, WebUtility.HtmlDecode(m.Value));
      listView1.Items.Add(new ListViewItem(new string[] { tumblename, tumblepostid, tumbleposttext }));
    }
}

//对此

// 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)) {
…