Kami mempunyai aplikasi CakePHP 3.x yang telah kami kemas kini kepada CakePHP 4.x terkini. Sebagai sebahagian daripada kerja ini, kami juga menukar daripada PHP 7 kepada PHP 8.
Semasa menguji apl, kami mendapati bahawa ciri telah berhenti berfungsi.
Aplikasi ini adalah pangkalan data yang boleh dicari dan disepadukan dengan Redis untuk caching. Satu ciri sedemikian bermakna carian pengguna dikekalkan antara muat semula halaman. Ini dicapai dengan menulis data borang bersiri ke Redis dan kemudian mengisinya semula ke dalam medan input
dalam templat. Ini bermakna pengguna boleh melihat istilah carian yang mereka masukkan, mereka tidak perlu memasukkan semula istilah carian apabila halaman dimuat semula.
Kod untuk mengisi semula input
medan borang dalam aplikasi
$form_fields = ['f1', 'f2', 'f3'];Tatasusunan
$form_fields
數組包含模板中 input
$form_fields
mengandungi nama borang dalam templat. Contohnya:
<input type="text" name="f1">
$user_search
是從 Redis 獲取并反序列化的數據數組。例如,我們可能有 $user_search['f1']
和 $user_search['f3']
包含 Redis 數據; f2
Bahagian seterusnya kod mengisi semula borang. Dalam kes ini, tidak diisi kerana pengguna tidak mencari menggunakan medan tersebut.
foreach ($form_fields as $form_field) { $this->request->getData()[$form_field] = (isset($user_search[$form_field])) ? $user_search[$form_field] : ''; }Dalam aplikasi Cake 3.x, perkara di atas berfungsi dengan baik. Apabila halaman dimuat semula, medan borang ditetapkan sebagai hasil daripada set meminta data, contohnya dalam gelung di atas ia menilai kepada:
$this->request->getData()['f1'] = 'foo'; $this->request->getData()['f3'] = 'bar';
f1
,“bar”為 f3
。 f2
中沒有任何內容,因此根據 : '';
Ini bermakna data yang diminta untuk "foo" ialah dan syarat menetapkannya kepada rentetan kosong.
Dalam aplikasi CakePHP 4.x, ini tidak berfungsi : '';
條件修改為 : 'test';
; apabila halaman dimuat semula, semua medan borang tidak diisi. Saya telah mengesahkan bahawa mereka tidak ditetapkan kepada rentetan kosong dengan menambahkan p> yang dinyatakan di atas dan memastikan bahawa rentetan "ujian" tidak ditunjukkan dalam medan.
$user_search
Data wujud dalam Redis, dan saya telah mengesahkan bahawa
Apabila saya membaca https://book.cakephp.org/4/en/controllers/request-response.html, saya tidak nampak contoh tetapan getData()
permintaan data. Terdapat kaedah yang melakukan apa yang anda harapkan - ia membaca
Adakah cara untuk menetapkan data permintaan dalam Cake 4.x supaya kod di atas boleh berfungsi?
Dalam PHP biasa, apa yang kami lakukan adalah bersamaan dengan
$_POST['f1'] = 'foo'; $_POST['f2'] = ''; // empty string as no value set by user $_POST['f3'] = 'bar';Setahu saya ini adalah dan masih berfungsi dalam PHP anda boleh menetapkan/mengatasi data permintaan menggunakan apa-apa sahaja dalam kod anda; Jika ini salah, sila beritahu saya apa yang perlu saya lakukan. ??
Sekadar untuk kejelasan, sebab kami menyediakan data permintaan dengan cara ini adalah kerana carian dilakukan melalui panggilan ajax. Apabila pengguna mula-mula memasukkan kriteria carian, halaman belum dimuat semula, jadi medan borang kelihatan diisi dengan betul. Isu ini berlaku apabila halaman dimuat semula. Dalam kes ini, kami ingin mengisi semula borang dengan nilai yang mereka masukkan sebelum memuat semula halaman.
Fungsi yang anda cari ialah withData
。請記住,請求對象是不可變的,因此您需要將該函數調用的結果分配回請求對象,例如與$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar'))
.