web-dev-qa-db-fra.com

Comment définir un cookie à l'aide de $ response-> headers-> setCookie () dans un gestionnaire de soumission de formulaire?

J'ai lu Déprécier user_cookie_save () et user_cookie_delete (). que user_cookie_save() sera déprécié dans Drupal 9 et que nous devrions maintenant utiliser le Symfony's , comme dans le code suivant.

$response = new Response();
$response->headers->setCookie(new Cookie('foo', 'bar'));
return $response->send();

Si j'utilise ce code dans un gestionnaire de soumission d'un formulaire personnalisé, $response-send() renvoie simplement une page vide, plutôt que mon site. Qu'est-ce que j'oublie ici?

ÉDITER:

OK, j'ai donc déplacé mon code de configuration des cookies vers une méthode de contrôleur:

public function setusercookies($Zip, $license){
    $destination = urldecode(\Drupal::request()->query->get('destination'));
    $response = new RedirectResponse(!empty($destination) ? $destination : '/');
    $response->headers->setCookie(new Cookie('Zip', $Zip, strtotime( '+1 year' ), '/'));
    $response->headers->setCookie(new Cookie('license', $license, strtotime( '+1 year' ), '/'));
    $response->send();
    return $response;
}

Et dans la fonction submitForm de mon formulaire:

$form_state->setRedirect('mycontroller.setusercookies', [
      'Zip' => $Zip,
      'license' => $license
    ], [
      'destination' => $destination
    ]);

Dans les deux Chrome et inspecteurs Firefox, je peux voir que les cookies sont définis, mais maintenant je ne peux plus les récupérer. J'ai essayé les deux:

$Zip = \Drupal::request()->cookies->get('Zip', 'oops');
/* and */
$Zip = $_COOKIE['Zip'];

MISE À JOUR 2: Commencer à penser que c'est un problème d'environnement ... Lando avec recette de panthéon.

RESOLU: Pendant tout le temps, il semble que ce soit un problème de plate-forme:

https://pantheon.io/docs/caching-advanced-topics/#using-your-own-session-style-cookies

2
Delford Chaffin

Vous ne pouvez pas envoyer de réponse à partir d'un code personnalisé dans Drupal. Vous devez le renvoyer d'un contrôleur.

Vous pouvez également définir une réponse ou ajouter le cookie à une réponse existante dans un abonné à l'événement. Dans votre cas, définissez la réponse dans le formulaire d'envoi, puis Drupal le fait pour vous dans un abonné principal:

$form_state->setResponse($response);

Pour éviter la page vide, vous souhaiterez probablement remplir la réponse avec du contenu ou ajouter le cookie à une réponse de redirection pour afficher une page différente.


Ne pas $response->send()

Pour expliquer pourquoi ne pas envoyer de réponse. Lorsque vous trouvez un exemple de code pour le composant Symfony HttpFoundation envoyant une réponse, il n'est pas valide pour le code personnalisé dans Drupal. Voir l'avertissement dans ce document:

Cet article explique comment utiliser les fonctionnalités HttpFoundation en tant que composant indépendant dans n'importe quelle application PHP. Dans les applications Symfony, tout est déjà configuré et prêt à l'emploi. Lisez l'article Controller pour savoir comment les utiliser. fonctionnalités lors de la création de contrôleurs.

De plus, le noyau Drupal est enveloppé dans des middlewares de pile en utilisant Stack/Builder . Ainsi, l'envoi d'une réponse peut même être un risque pour la sécurité si vous avez par exemple installé un middleware fournissant contrôles de sécurité.

5
4k4