PHP et YAML
On a desfois besoin de manipuler du YAML
en PHP
mais le support n'est pas natif. Voyons comment ajouter la prise en charge, en lecture et écriture.
Dans le monde php
il y a la bibliothèque native au langage, puis il y a les extensions communautaires hébergées dans le dépôt PECL
(PHP Extension Community Library). L'extension yaml
est distribuée via ce dépôt.
Le contexte est une machine sous MacOS
, cpu Apple Silicon, avec le gestionnaire de paquet homebrew
(le préfixe homebrew
est différent suivant l'architecture).
Installation du module PECL
1brew install php libyaml
2pecl install yaml
Répondre /opt/homebrew/Cellar/libyaml/0.2.5
à la question sur où est installé libyaml
(l'autodetect ne marche pas, adaptez le n° de version si besoin).
Si la compilation se déroule bien, le fichier créé est le suivant : /opt/homebrew/Cellar/php/8.4.3/pecl/20240924/yaml.so
L'installeur a la facheuse tendance de modifier le fichier /opt/homebrew/etc/php/8.4/php.ini
et de le préfixer avec la ligne :
1extension=yaml.so
Ceci crée un warning au runtime et ne charge pas le module. Retirez cette ligne !
Créez d'autre part le fichier /opt/homebrew/etc/php/8.4/conf.d/ext-yaml.ini
avec comme contenu :
1extension=/opt/homebrew/Cellar/php/8.4.3/pecl/20240924/yaml.so
Vérifier que l'extension est bien chargée :
1php -m | grep yaml
2yaml
Voilà, vous pouvez désormais accéder aux fonctions yaml_emit
, yaml_emit_file
, yaml_parse
, yaml_parse_file
et yaml_parse_url
.
Installation de la dépendance composer
Une autre méthode, en pur php, est d'utiliser l'écosystème de composer et le module yaml
développé par symfony
. Ça a l'avantage de ne rien avoir à compiler !
Exécutez :
1composer require symfony/yaml
yaml d'exemple
1global:
2 name: "Le nom du preset"
3tracks:
4 - type: "video"
5 pid: 101
6 - type: "audio"
7 pid: 201
8 - type: "audio"
9 pid: 202
10 - type: "audio"
11 pid: 203
Créez de test
1<?php
2
3use Symfony\Component\Yaml\Yaml;
4
5require 'vendor/autoload.php';
6
7$value = Yaml::parse("foo: bar");
8var_dump($value);
9
10$value = Yaml::parseFile('file.yaml');
11var_dump($value);
Ce qui affichera
1array(1) {
2 ["foo"]=>
3 string(3) "bar"
4}
5array(2) {
6 ["global"]=>
7 array(1) {
8 ["name"]=>
9 string(16) "Le nom du preset"
10 }
11 ["tracks"]=>
12 array(4) {
13 [0]=>
14 array(2) {
15 ["type"]=>
16 string(5) "video"
17 ["pid"]=>
18 int(101)
19 }
20 [1]=>
21 array(2) {
22 ["type"]=>
23 string(5) "audio"
24 ["pid"]=>
25 int(201)
26 }
27 [2]=>
28 array(2) {
29 ["type"]=>
30 string(5) "audio"
31 ["pid"]=>
32 int(202)
33 }
34 [3]=>
35 array(2) {
36 ["type"]=>
37 string(5) "audio"
38 ["pid"]=>
39 int(203)
40 }
41 }
42}