{"id":1292,"date":"2020-11-02T15:05:01","date_gmt":"2020-11-02T13:05:01","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=1292"},"modified":"2020-11-02T15:13:19","modified_gmt":"2020-11-02T13:13:19","slug":"php-le-design-pattern-flyweight","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/","title":{"rendered":"PHP &#8211; Le design pattern Flyweight"},"content":{"rendered":"\n<p>Soyons honn\u00eates, si vous \u00eates un d\u00e9veloppeur web, les chances pour que vous ayez \u00e0 utiliser le design pattern <strong>Flyweight<\/strong> en PHP sont assez minces, en raison du fait que <strong>Flyweight<\/strong> est surtout utile quand vous avez un tr\u00e8s grand nombre d&rsquo;objets en RAM et qu&rsquo;il vous est important d&rsquo;en \u00e9conomiser l&rsquo;instanciation, ce qui arrive rarement lorsque vous d\u00e9veloppez (bien !) une application web. Vous le trouverez davantage dans des domaines comme les traitements de texte ou les jeux vid\u00e9o qui utilisent des environnements multi-t\u00e2ches (<em>multithreaded<\/em>). En PHP, le <em>multithreading<\/em> est \u00e0 ce jour utilisable seulement en ligne de commande, pas dans un environnement de serveur Web.<\/p>\n\n\n\n<p>Cela ne signifie pas pour autant que ce design pattern n&rsquo;est JAMAIS utilis\u00e9, il est par exemple impl\u00e9ment\u00e9 dans l&rsquo;ORM Doctrine, pour la gestion des types.<\/p>\n\n\n\n<h1>Le principe de fonctionnement du design pattern<\/h1>\n\n\n\n<p><strong>Flyweight<\/strong> signifie \u00ab\u00a0poids mouche\u00a0\u00bb en bon fran\u00e7ais, mais pourquoi donc ? Parce que l&rsquo;id\u00e9e est de garder les objets dont nous allons nous servir les plus petits possible, comme la cat\u00e9gorie de boxeurs \u00e0 laquelle ce nom fait r\u00e9f\u00e9rence&#8230;petits certes, mais efficaces !<\/p>\n\n\n\n<p>Ces objets vont avoir deux \u00e9tats:<\/p>\n\n\n\n<ul>\n<li>un \u00e9tat intrins\u00e8que, qui ne d\u00e9pend pas du contexte de l&rsquo;objet<\/li>\n<li>un \u00e9tat extrins\u00e8que<\/li>\n<\/ul>\n\n\n\n<p>Le premier r\u00e9side dans la classe m\u00eame tandis que le second lui sera fourni lors de l&rsquo;appel \u00e0 une de ses m\u00e9thodes.<\/p>\n\n\n\n<p>Prenons comme objet poids mouche un produit culturel donc l&rsquo;\u00e9tat intrins\u00e8que, immuable, sera uniquement compos\u00e9 de son nom. La classe <strong>ProduitCulturel<\/strong> se conformera \u00e0 une interface assez simple, dont l&rsquo;unique m\u00e9thode <code>afficher<\/code> prend en param\u00e8tre l&rsquo;\u00e9tat extrins\u00e8que, c&rsquo;est \u00e0 dire tout ce qui est susceptible de venir enrichir l&rsquo;\u00e9tat intrins\u00e8que de l&rsquo;objet. Le contexte est pass\u00e9 sous forme de tableau pour garder l&rsquo;exemple le plus simple possible mais un objet d\u00e9di\u00e9 \u00e0 ces contextes serait largement pr\u00e9f\u00e9rable.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: true; title: ; notranslate\" title=\"\">\ninterface ProduitCulturelInterface\n{\n    public function affiche(array $contexte): void;\n}\n\nclass ProduitCulturel implements ProduitCulturelInterface\n{\n    protected string $nom;\n\n    public function __construct(string $nom)\n    {\n        $this-&gt;nom = $nom;\n    }\n\n    public function affiche(array $contexte): void\n    {\n        echo &#039;Nom: &#039; . $this-&gt;nom . PHP_EOL;\n\n        foreach ($contexte as $cle =&gt; $valeur) {\n            echo ucfirst($cle) . &#039;: &#039; . $valeur . PHP_EOL;\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<p>Pour g\u00e9rer nos poids mouches, nous allons devoir utiliser une <strong>fabrique<\/strong>, car c&rsquo;est \u00e0 elle que s\u2019adressera le code client pour obtenir ces objets. Il ne doit en aucun cas r\u00e9aliser lui-m\u00eame les instanciations ! Voil\u00e0 ladite fabrique, assez rudimentaire: elle poss\u00e8de une m\u00e9thode <strong>getProduitCulturel<\/strong> qui v\u00e9rifie si une instance est d\u00e9j\u00e0 disponible avec le nom donn\u00e9. Si c&rsquo;est le cas, elle la renvoie, \u00e9vitant une nouvelle instanciation, sinon elle instancie la classe cibl\u00e9e et la range sagement dans son tableau interne, qui sert de \u00ab\u00a0parc \u00e0 poids mouches\u00a0\u00bb comme le nomme si joliment le livre du GoF.<\/p>\n\n\n\n<div class=\"wp-container-1 wp-block-group\"><div class=\"wp-block-group__inner-container\"><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: true; title: ; notranslate\" title=\"\">\nclass FabriqueDeProduitsCulturels\n{\n    protected array $produits = &#91;];\n\n    public function getProduitCulturel(string $nom): ProduitCulturel\n    {\n        if (array_key_exists($nom, $this-&gt;produits)) {\n            $produit = $this-&gt;produits&#91;$nom];\n        } else {\n            $produit = new ProduitCulturel($nom);\n            $this-&gt;produits&#91;$nom] = $produit;\n        }\n\n        return $produit;\n    }\n}\n<\/pre><\/div>\n\n\n<p>Libre \u00e0 vous d&rsquo;en faire une version statique, pour ma part je ne suis pas tellement en faveur des appels statiques car ils complexifient les tests unitaires.<\/p>\n<\/div><\/div>\n\n\n\n<p>Notre code client va utiliser une classe Commande (aucun rapport avec le design pattern du m\u00eame nom !) qui proposera dans son interface publique une m\u00e9thode permettant l&rsquo;ajout de produits culturels. Ces produits li\u00e9s \u00e0 la commande seront stock\u00e9s dans un tableau du m\u00eame nom tandis que leur contexte ira dans un tableau d\u00e9di\u00e9, au m\u00eame indice. Ainsi nous avons d&rsquo;un c\u00f4t\u00e9 les poids mouches et de l&rsquo;autre le contexte auquel ils sont li\u00e9s. Le constructeur de notre classe Commande se verra injecter son unique d\u00e9pendance, la fabrique !<\/p>\n\n\n\n<p>Afficher les produits d&rsquo;une commande consistera tout simplement \u00e0 boucler sur les produits et \u00e0 invoquer leur m\u00e9thode d&rsquo;affichage, qui requiert le contexte en param\u00e8tre.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: true; title: ; notranslate\" title=\"\">\nclass Commande\n{\n    protected FabriqueDeProduitsCulturels $fabrique;\n\n    protected array $produits = &#91;];\n\n    protected array $contextes = &#91;];\n\n    public function __construct(FabriqueDeProduitsCulturels $fabrique)\n    {\n        $this-&gt;fabrique = $fabrique;\n    }\n\n    public function ajouteProduit(string $nom, array $contexte)\n    {\n        $produit = $this-&gt;fabrique-&gt;getProduitCulturel($nom);\n        $this-&gt;produits&#91;] = $produit;\n        $this-&gt;contextes&#91;] = $contexte;\n    }\n\n    public function afficheProduits()\n    {\n        foreach ($this-&gt;produits as $index =&gt; $produit) {\n            $produit-&gt;affiche($this-&gt;contextes&#91;$index]);\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<p>Voici comment tout cela sera utilis\u00e9:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: true; title: ; notranslate\" title=\"\">\n$commande = new Commande(new FabriqueDeProduitsCulturels());\n\n$commande-&gt;ajouteProduit(&#039;Livre&#039;, &#91;&#039;prix&#039; =&gt; 10.99, &#039;titre&#039; =&gt; &#039;1984&#039;, &#039;auteur&#039; =&gt; &#039;George Orwell&#039;]);\n$commande-&gt;ajouteProduit(&#039;Disque&#039;, &#91;&#039;prix&#039; =&gt; 19.99, &#039;titre&#039; =&gt; &#039;1984&#039;, &#039;auteur&#039; =&gt; &#039;Van Halen&#039;]);\n\n$commande-&gt;afficheProduits();\n<\/pre><\/div>\n\n\n<h1>Pour r\u00e9sumer&#8230;<\/h1>\n\n\n\n<p><strong>Flyweight<\/strong> n&rsquo;est utile qui si vous avez un nombre tr\u00e8\u00e8\u00e8\u00e8\u00e8s important d&rsquo;objets de type semblable (si c&rsquo;est le cas, demandez-vous d\u00e9j\u00e0 si c&rsquo;est bien normal !) car son but est d&rsquo;\u00e9conomiser la m\u00e9moire durant le temps d&rsquo;ex\u00e9cution d&rsquo;un processus (g\u00e9n\u00e9ralement multit\u00e2ches)<br><br>Il met en jeu une <strong>fabrique<\/strong> qui sera charg\u00e9e d&rsquo;instancier le cas \u00e9ch\u00e9ant les objets poids mouches et des <strong>classes concr\u00e8tes<\/strong> contenant des \u00e9tats <em>intrins\u00e8ques<\/em>. Une fois l&rsquo;objet obtenu par l&rsquo;utilisation de la fabrique, il ne pourra plus \u00eatre modifi\u00e9 (il est <em>immuable<\/em>) mais le <strong>client<\/strong> pourra lui transmettre son \u00e9tat <em>extrins\u00e8que<\/em> par l&rsquo;appel d&rsquo;une de ses m\u00e9thodes. Ici nous avons utilis\u00e9 une m\u00e9thode terriblement triviale qui r\u00e9alise un simple affichage mais nous aurions pu tout aussi bien invoquer un service web pour commander les produits sur une API externe.<\/p>\n\n\n\n<p>Ce billet a \u00e9t\u00e9 r\u00e9alis\u00e9 en s&rsquo;inspirant librement du livre du <a href=\"https:\/\/www.eyrolles.com\/Informatique\/Livre\/design-patterns-9780201633610\/\">GoF<\/a> et d&rsquo;un ouvrage paru chez <a href=\"https:\/\/www.editions-eni.fr\/livre\/design-patterns-en-php-les-23-modeles-de-conception-descriptions-et-solutions-illustrees-en-uml2-et-php-9782746093218\">ENI \u00c9ditions<\/a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Soyons honn\u00eates, si vous \u00eates un d\u00e9veloppeur web, les chances pour que vous ayez \u00e0 utiliser le design pattern Flyweight en PHP sont assez minces, en raison du fait que Flyweight est surtout utile quand vous avez un tr\u00e8s grand nombre d&rsquo;objets en RAM et qu&rsquo;il vous est important d&rsquo;en \u00e9conomiser l&rsquo;instanciation, ce qui arrive [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1296,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[24,3,29],"tags":[43,112],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP - Le design pattern Flyweight - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP - Le design pattern Flyweight - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Soyons honn\u00eates, si vous \u00eates un d\u00e9veloppeur web, les chances pour que vous ayez \u00e0 utiliser le design pattern Flyweight en PHP sont assez minces, en raison du fait que Flyweight est surtout utile quand vous avez un tr\u00e8s grand nombre d&rsquo;objets en RAM et qu&rsquo;il vous est important d&rsquo;en \u00e9conomiser l&rsquo;instanciation, ce qui arrive [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-02T13:05:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-02T13:13:19+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2020\/11\/mouche.jpg.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"499\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/\",\"name\":\"PHP - Le design pattern Flyweight - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2020-11-02T13:05:01+00:00\",\"dateModified\":\"2020-11-02T13:13:19+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP &#8211; Le design pattern Flyweight\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PHP - Le design pattern Flyweight - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP - Le design pattern Flyweight - La Fabrique de code - Tech blog","og_description":"Soyons honn\u00eates, si vous \u00eates un d\u00e9veloppeur web, les chances pour que vous ayez \u00e0 utiliser le design pattern Flyweight en PHP sont assez minces, en raison du fait que Flyweight est surtout utile quand vous avez un tr\u00e8s grand nombre d&rsquo;objets en RAM et qu&rsquo;il vous est important d&rsquo;en \u00e9conomiser l&rsquo;instanciation, ce qui arrive [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2020-11-02T13:05:01+00:00","article_modified_time":"2020-11-02T13:13:19+00:00","og_image":[{"width":500,"height":499,"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2020\/11\/mouche.jpg.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/","name":"PHP - Le design pattern Flyweight - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2020-11-02T13:05:01+00:00","dateModified":"2020-11-02T13:13:19+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2020\/11\/php-le-design-pattern-flyweight\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP &#8211; Le design pattern Flyweight"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1292"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=1292"}],"version-history":[{"count":9,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1292\/revisions"}],"predecessor-version":[{"id":1304,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1292\/revisions\/1304"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media\/1296"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=1292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=1292"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=1292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}