Andoni Larzabal
Dev back PHP/Symfony
Devops à mes heures perdues
Monomaniaque de la dette technique
Artisan des internets
Depuis 2018
AndoniLarz
Le sponsor du jour
Mais sans CDATA
Une refacto
Un endpoint qui renvoie du XML
# mon-fichier-de-previsions.xml
<?xml version="1.0" encoding="utf-8"?>
<LIEUX>
<LIEU Nom="Acigné">
<ID>216652</ID>
<DEPARTEMENT>Ille-et-Vilaine</DEPARTEMENT>
<CODE_POSTAL>35690</CODE_POSTAL>
<URL_COURTE><![CDATA[lcm://?view=car&id=216652&t_e=101]]></URL_COURTE>
</LIEU>
</LIEUX>
Interdit de mettre du CDATA
Pas de budget ou de temps alloué
Refacto d'abord en JSON
A la fin, on normalisera en XML
Petit détail : on a des URLs dans nos données
Un ensemble de composants
Le Serializer
(Json, CSV, XML...)
📍
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
class XmlEncoder
{
// ...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
class XmlEncoder
{
// ...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
class XmlEncoder
{
// ...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}
Modifier directement le code dans les vendor
Ecrasé si je réinstalle les vendors
Fonctionne que sur mon PC
Ouvrir une issue sur le Github Symfony
Client moyen chaud
Proposer une PR, demande du temps à priori
Hacker le XmlEncoder
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
<?php
namespace Symfony\Component\Serializer\Encoder;
// use classes...
class XmlEncoder
{
// other methods...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
<?php
namespace Symfony\Component\Serializer\Encoder;
// use classes...
class XmlEncoder
{
// other methods...
private function needsCdataWrapping(string $val): bool
{
return \preg_match('/[<>&]/', $val);
}
}
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
<?php
namespace Symfony\Component\Serializer\Encoder;
// use classes...
use function preg_match;
class XmlEncoder
{
// other methods...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}
# functions/functions.php
namespace Symfony\Component\Serializer\Encoder;
function preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false {
// Notre code custom
if ('/[<>&]/' === $pattern) {
return false;
}
return \preg_match($pattern, $subject, $matches, $flags, $offset);
}
Proposer une PR
Trouver ou créer l'issue
Attendre la relecture
Forker le projet
Changes + tests + documentation
(créez une branche)
Trouver un mentor
Chercher dans la commu (Slack, Bluesky, etc.)
AndoniLarz