我們有一個(gè) CakePHP 3.x 應(yīng)用程序,我們已將其更新到最新的 CakePHP 4.x。作為這項(xiàng)工作的一部分,我們還從 PHP 7 更改為 PHP 8。
在測(cè)試應(yīng)用程序時(shí),我們注意到一個(gè)功能已停止工作。
該應(yīng)用程序是一個(gè)可搜索的數(shù)據(jù)庫(kù),并與 Redis 集成以進(jìn)行緩存。其中一項(xiàng)功能意味著用戶搜索在頁(yè)面重新加載之間得以保留。這是通過(guò)將序列化表單數(shù)據(jù)寫(xiě)入 Redis,然后將其重新填充回模板中的 input
字段來(lái)實(shí)現(xiàn)的。這意味著用戶可以看到他們輸入的搜索條件;刷新頁(yè)面時(shí),他們不需要重新輸入搜索條件。
CakePHP 3.x 應(yīng)用程序中重新填充 input
表單字段的代碼如下所示:
$form_fields = ['f1', 'f2', 'f3'];
$form_fields
數(shù)組包含模板中 input
表單的名稱。舉個(gè)例子:
<input type="text" name="f1">
代碼的下一部分重新填充表單。在本例中,$user_search
是從 Redis 獲取并反序列化的數(shù)據(jù)數(shù)組。例如,我們可能有 $user_search['f1']
和 $user_search['f3']
包含 Redis 數(shù)據(jù); f2
未填充,因?yàn)橛脩魶](méi)有使用該字段進(jìn)行搜索。
foreach ($form_fields as $form_field) { $this->request->getData()[$form_field] = (isset($user_search[$form_field])) ? $user_search[$form_field] : ''; }
在 Cake 3.x 應(yīng)用程序中,上述工作正常。當(dāng)頁(yè)面重新加載時(shí),表單字段由于設(shè)置請(qǐng)求數(shù)據(jù)而設(shè)置,例如在上面的循環(huán)中,它的計(jì)算結(jié)果為:
$this->request->getData()['f1'] = 'foo'; $this->request->getData()['f3'] = 'bar';
這意味著請(qǐng)求數(shù)據(jù)的“foo”為 f1
,“bar”為 f3
。 f2
中沒(méi)有任何內(nèi)容,因此根據(jù) : '';
條件將其設(shè)置為空字符串。
在 CakePHP 4.x 應(yīng)用程序中,這不起作用;頁(yè)面重新加載時(shí),所有表單字段均未填充。我已經(jīng)通過(guò)將上面提到的 : '';
條件修改為 : 'test';
來(lái)確認(rèn)它們沒(méi)有被設(shè)置為空字符串,并確保字符串“test”沒(méi)有顯示在字段中。 p>
數(shù)據(jù)存在于 Redis 中,并且我已經(jīng)確認(rèn) $user_search
包含上面顯示的內(nèi)容 - 換句話說(shuō),數(shù)據(jù)沒(méi)有丟失,所以我們已經(jīng)排除了這一點(diǎn)。
當(dāng)我閱讀 https://book.cakephp.org/4/en/controllers/request-response.html 時(shí),我看不到設(shè)置請(qǐng)求數(shù)據(jù)的示例。有一個(gè)方法 getData()
可以實(shí)現(xiàn)您所期望的功能 - 它讀取請(qǐng)求數(shù)據(jù)。
有沒(méi)有辦法在 Cake 4.x 中設(shè)置請(qǐng)求數(shù)據(jù),以便上面的代碼可以工作?
在普通 PHP 中,我們所做的相當(dāng)于
$_POST['f1'] = 'foo'; $_POST['f2'] = ''; // empty string as no value set by user $_POST['f3'] = 'bar';
據(jù)我所知,這在 PHP 中曾經(jīng)并且仍然有效;您可以使用代碼中的任何內(nèi)容設(shè)置/覆蓋請(qǐng)求數(shù)據(jù)。如果這是錯(cuò)誤的,請(qǐng)告訴我應(yīng)該做什么。
為了清楚起見(jiàn),我們以這種方式設(shè)置請(qǐng)求數(shù)據(jù)的原因是因?yàn)樗阉魇峭ㄟ^(guò) ajax 調(diào)用進(jìn)行的。當(dāng)用戶最初輸入搜索條件時(shí),頁(yè)面尚未重新加載,因此表單字段似乎已正確填充。此問(wèn)題發(fā)生在頁(yè)面重新加載時(shí)。在這種情況下,我們希望使用他們?cè)谥匦录虞d頁(yè)面之前輸入的值重新填充表單。
您正在尋找的函數(shù)是withData
。請(qǐng)記住,請(qǐng)求對(duì)象是不可變的,因此您需要將該函數(shù)調(diào)用的結(jié)果分配回請(qǐng)求對(duì)象,例如與$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar'))
。