Maison  >  Questions et réponses  >  le corps du texte

Définition des données de demande - CakePHP 4

Nous avons une application CakePHP 3.x que nous avons mise à jour vers la dernière version de CakePHP 4.x. Dans le cadre de ce travail, nous sommes également passés de PHP 7 à PHP 8.

Lors du test de l'application, nous avons remarqué qu'une fonctionnalité ne fonctionnait plus.

L'application est une base de données consultable et intégrée à Redis pour la mise en cache. L'une de ces fonctionnalités signifie que les recherches des utilisateurs sont préservées entre les rechargements de pages. Ceci est accompli en écrivant les données du formulaire sérialisé dans Redis, puis en les repeuplant dans le champ input du modèle. Cela signifie que les utilisateurs peuvent voir les termes de recherche qu'ils ont saisis ; ils n'ont pas besoin de les saisir à nouveau lorsque la page est actualisée.

Le code pour repeupler les input champs du formulaire dans l'application

CakePHP 3.x ressemble à ceci :

$form_fields = ['f1', 'f2', 'f3'];
Le tableau $form_fields 数组包含模板中 input$form_fields contient les noms des

formulaires du modèle. Par exemple :

<input type="text" name="f1">
$user_search 是从 Redis 获取并反序列化的数据数组。例如,我们可能有 $user_search['f1']$user_search['f3'] 包含 Redis 数据; f2La partie suivante du code remplit à nouveau le formulaire. Dans ce cas,

n'est pas renseigné car l'utilisateur n'a pas effectué de recherche à l'aide de ce champ.

foreach ($form_fields as $form_field) {
    $this->request->getData()[$form_field] = (isset($user_search[$form_field])) ? $user_search[$form_field] : '';
}
Dans les applications Cake 3.x, ce qui précède fonctionne très bien. Lorsque la page se recharge, les champs du formulaire sont définis à la suite de la demande de données set

, par exemple dans la boucle ci-dessus, il est évalué comme :

$this->request->getData()['f1'] = 'foo';
$this->request->getData()['f3'] = 'bar';
f1,“bar”为 f3f2 中没有任何内容,因此根据 : '';Cela signifie que les données demandées pour "foo" sont

et la condition la définit sur la chaîne vide.

Dans une application CakePHP 4.x, cela ne fonctionne pas : ''; 条件修改为 : 'test'; lorsque la page se recharge, tous les champs du formulaire ne sont pas renseignés. J'ai confirmé qu'ils ne sont pas définis sur une chaîne vide en ajoutant le mentionné ci-dessus et en m'assurant que la chaîne "test" n'est pas affichée dans le champ.

$user_searchLes données existent dans Redis, et j'ai confirmé que

contient ce qui est affiché ci-dessus - en d'autres termes, les données ne sont pas perdues, nous avons donc exclu cela.

Quand je lis https://book.cakephp.org/4/en/controllers/request-response.html, je ne vois pas d'exemple de définition de getData()données de requête. Il existe une méthode qui fait ce que vous attendez : elle lit

les données demandées.

Existe-t-il un moyen de définir les données de la requête dans Cake 4.x afin que le code ci-dessus puisse fonctionner ?

En PHP normal, ce que nous faisons équivaut à

$_POST['f1'] = 'foo';
$_POST['f2'] = ''; // empty string as no value set by user
$_POST['f3'] = 'bar';

Pour autant que je sache, cela fonctionnait et fonctionne toujours en PHP, vous pouvez définir/remplacer les données de la requête en utilisant n'importe quoi dans votre code ; Si c'est faux, dites-moi ce que je dois faire. 🎜

Pour plus de clarté, la raison pour laquelle nous configurons les données de la demande de cette façon est que la recherche est effectuée via un appel ajax. Lorsque l'utilisateur saisit initialement les critères de recherche, la page n'est pas encore rechargée, les champs du formulaire semblent donc être correctement renseignés. Ce problème se produit lors du rechargement de la page. Dans ce cas, nous souhaitons repeupler le formulaire avec les valeurs saisies avant de recharger la page.

P粉212971745P粉212971745228 Il y a quelques jours426

répondre à tous(1)je répondrai

  • P粉722521204

    P粉7225212042024-03-27 00:28:36

    La fonction que vous recherchez est withData。请记住,请求对象是不可变的,因此您需要将该函数调用的结果分配回请求对象,例如与$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar')).

    répondre
    0
  • Annulerrépondre