Débugger une erreur silencieuse Symfony dans Prestashop 1.7.8 +
Récemment j’ai été confronté à un problème pour lequel je n’ai trouvé aucune réponse en cherchant avec plusieurs mots clés et en Français ou Anglais, certaines fois le changement de langue aide.
Énoncé du problème :
Impossible de créer ou modifier une adresse client dans la partie admin, alors que dans la partie front aucun souci. La page se recharge au lieu de charger la liste des adresses lorsque l’opération est un succès.
Problème, aucune erreur ni en mode debug, ni dans la console, le debugage en ajoutant des var_dump ou autre ne donnait rien sur les classes participant au process, ou donnait un dépassement de pile.
Solution :
Sauf que dans le cas présent je ne cherchais pas au bon endroit, en effet certains objets symfony (peut être tous d’ailleurs, je ne suis pas très familier de Symfony) possèdent une fonction getErrors, qui, je dois le dire, malgré mon expérience Prestashop m’était inconnue, et c’est l’ami chatgpt, une fois n’est pas coutume, qui m’a mis sur la piste parmi ses nombreuses causes, et je vous donne donc la procédure à suivre qui est assez simple :
Dans la classe où se situe le souci, dans mon cas il s’agit de /src/PrestaShopBundle/Controller/Admin/Sell/Address/AddressController.php, dans la fonction createAction (ou editAction), j’ai modifié le code comme suit :
if ($handlerResult->isSubmitted() && $handlerResult->isValid()) {
...
} else if ($handlerResult->isSubmitted()) {
dump($addressForm->getErrors(true));
die;
}
Le code en gras est la partie ajoutée, dans le cas où le formulaire est soumis mais non valide, je vérifie que le formulaire soit soumis pour éviter un dump à l’affichage de la page, puis je réalise un dump des erreurs générées par le formulaire et les affichent, ce qui me donne un résultat édifiant :
AddressController.php on line 377:
FormErrorIterator {#3195 ▼
-form: Form {#3212 ▶}
-errors: array:1 [▼
0 => FormError {#3517 ▼
#messageTemplate: "An address located in a country containing states must have a state selected."
#messageParameters: []
#messagePluralization: null
-message: "An address located in a country containing states must have a state selected."
-cause: ConstraintViolation {#3527 ▶}
-origin: Form {#3251}
}
]
}
Effectivement en vérifiant le pays en question les états étaient activés alors qu’il n’y en a aucun de défini dans la configuration, le souci est que ce problème est apparu après migration d’une 1.7.6 à une 1.7.8, sans autre modification, donc bizarre, mais ça m’aura permis de trouver un nouvel angle de debugage pour les points Symfony.
En espérant que ça aidera d’autres devs.