{"id":17013,"date":"2024-04-22T20:13:51","date_gmt":"2024-04-22T20:13:51","guid":{"rendered":"https:\/\/www.directimpactsolutions.com\/lots-de-jobs-dans-laravel\/"},"modified":"2025-05-01T04:41:07","modified_gmt":"2025-05-01T04:41:07","slug":"lots-de-jobs-dans-laravel","status":"publish","type":"post","link":"https:\/\/www.directimpactsolutions.com\/fr\/lots-de-jobs-dans-laravel\/","title":{"rendered":"Lots de jobs dans Laravel"},"content":{"rendered":"<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a2f60b3bc401&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"300\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png\" alt=\"Lots de jobs dans Laravel\" class=\"wp-image-16752\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png 500w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel-300x180.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandir\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><p><\/p><p>Quand est-il utile d&rsquo;utiliser des lots de \u201cjobs\u201d dans Laravel ?<\/p><p>Nous avons \u00e9voqu\u00e9 les files d\u2019attente dans un <a href=\"https:\/\/www.directimpactsolutions.com\/fr\/taches-laravel-travailleur\/\">article pr\u00e9c\u00e9dent<\/a>. Les files d&rsquo;attente sont un outil utile dans Laravel, vous permettant d&rsquo;ex\u00e9cuter des t\u00e2ches compliqu\u00e9es ou fastidieuses en arri\u00e8re-plan. Il y aura des moments o\u00f9 vous devrez ex\u00e9cuter des dizaines, voire des centaines d&rsquo;instances d&rsquo;une t\u00e2che, par exemple, cr\u00e9er des rapports individuels pour un plus grand nombre de clients ou importer un dossier de fichiers .csv.<\/p><p>Pour y parvenir, tu pourrais envisager d\u2019ex\u00e9cuter une seule jobs contenant une boucle pour appliquer la logique n\u00e9cessaire. Toutefois, cette approche pose un probl\u00e8me d\u2019\u00e9volutivit\u00e9. Elle pourrait bien fonctionner si tu as un petit nombre de rapports \u00e0 g\u00e9n\u00e9rer ou de fichiers \u00e0 importer, mais \u00e0 un moment donn\u00e9, le temps d\u2019ex\u00e9cution et la consommation de m\u00e9moire de la t\u00e2che pourraient exc\u00e9der les limites que tu as \u00e9tablies dans la configuration de ton PHP et de ton serveur.<\/p><p>Bien que tu puisses augmenter ces limites, une m\u00e9thode plus efficace serait de traiter chaque rapport comme une t\u00e2che s\u00e9par\u00e9e &#8211; dont le temps d\u2019ex\u00e9cution et la consommation de m\u00e9moire restent relativement faibles &#8211; et de g\u00e9n\u00e9rer un fichier .zip une fois toutes les t\u00e2ches achev\u00e9es. Pour r\u00e9aliser cela, tu peux utiliser la mise en lots des jobs.<\/p><div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><nav><ul><li class=\"\"><a href=\"#what-is-job-batching\">Qu&rsquo;est-ce que le \u201cJob Batching\u201d ?<\/a><\/li><li class=\"\"><a href=\"#creating-a-job-batch\">Cr\u00e9ation d&rsquo;un lot de jobs<\/a><ul><li class=\"\"><a href=\"#creating-the-invoice-job\">Cr\u00e9ation de la t\u00e2che de facturation<\/a><\/li><li class=\"\"><a href=\"#running-the-batch\">Ex\u00e9cution du traitement par lots<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div><h2 class=\"wp-block-heading\" id=\"what-is-job-batching\" style=\"font-style:normal;font-weight:400\">Qu&rsquo;est-ce que le \u201cJob Batching\u201d ?<\/h2><p>La mise en lots des jobs est une fonctionnalit\u00e9 de Laravel. Comme son nom l&rsquo;indique, elle te permet d&rsquo;ex\u00e9cuter un lot de jobs. Les donn\u00e9es relatives au lot sont stock\u00e9es dans une table appel\u00e9e <em>job_batches<\/em>; elle contient des informations utiles sur le lot, telles que le nombre total de jobs, le nombre de jobs ayant \u00e9chou\u00e9, le nombre de jobs encore en cours, etc. Cette table est cr\u00e9\u00e9e \u00e0 l&rsquo;aide des commandes suivantes :<\/p><pre class=\"wp-block-code\"><code>php artisan queue:batches-table\nphp artisan migrate<\/code><\/pre><p>En outre, tu peux d\u00e9finir un certain nombre de fonctions de rappel qui s&rsquo;ex\u00e9cutent lorsque certains \u00e9v\u00e9nements se produisent. Il s&rsquo;agit notamment de :<\/p><ul class=\"wp-block-list\"><li>Progress &#8211; s&rsquo;ex\u00e9cute lorsqu&rsquo;un seul travail est termin\u00e9 avec succ\u00e8s<\/li>\n\n<li>Then &#8211; s&rsquo;ex\u00e9cute lorsque tous les travaux sont termin\u00e9s avec succ\u00e8s<\/li>\n\n<li>Catch &#8211; s&rsquo;ex\u00e9cute la premi\u00e8re fois qu&rsquo;un \u00e9chec de travail est d\u00e9tect\u00e9<\/li>\n\n<li>Finally &#8211; s&rsquo;ex\u00e9cute lorsque tous les travaux ont \u00e9t\u00e9 ex\u00e9cut\u00e9s (avec ou sans succ\u00e8s)<\/li><\/ul><h2 class=\"wp-block-heading\" id=\"creating-a-job-batch\" style=\"font-style:normal;font-weight:400\">Cr\u00e9ation d&rsquo;un lot de jobs<\/h2><p>Afin de d\u00e9montrer ce que tu peux accomplir avec les lots, nous allons utiliser l&rsquo;exemple de la cr\u00e9ation d&rsquo;une facture mensuelle au format PDF pour chacun des clients d&rsquo;un syst\u00e8me de facturation hypoth\u00e9tique. Pour nos besoins, les factures seront sauvegard\u00e9es dans un dossier .zip afin d&rsquo;\u00eatre examin\u00e9es avant d&rsquo;\u00eatre envoy\u00e9es. Le flux de travail ressemblera \u00e0 ceci :<\/p><ol start=\"1\" class=\"wp-block-list\"><li>Trouver tous les clients qui ont besoin d&rsquo;une facture.<\/li>\n\n<li>Passer en revue chacun des clients, g\u00e9n\u00e9rer la facture et enregistrer le PDF sur le serveur.<\/li>\n\n<li>Zipper les factures dans un seul fichier.<\/li>\n\n<li>Envoyer un courriel \u00e0 l&rsquo;utilisateur qui a demand\u00e9 les factures avec un lien vers le fichier .zip.<\/li>\n\n<li>Si l&rsquo;un des PDF \u00e9choue, annuler et informer l&rsquo;utilisateur qu&rsquo;il y a eu un probl\u00e8me.<\/li><\/ol><p>Nous allons garder les choses simples et supposer qu&rsquo;il existe un mod\u00e8le de facture qui poss\u00e8de des m\u00e9thodes pour trouver la liste des clients et g\u00e9n\u00e9rer la facture. La gestion des erreurs sera \u00e9galement minimale et nous nous contenterons d&rsquo;envoyer un courriel si l&rsquo;une des factures \u00e9choue ; nous parlerons plus tard des am\u00e9liorations possibles.<\/p><h3 class=\"wp-block-heading has-ast-global-color-2-color has-text-color has-link-color wp-elements-49e3b24bf7bc1fa515478572e114b228\" id=\"creating-the-invoice-job\">Cr\u00e9ation de la t\u00e2che de facturation<\/h3><p>Pour commencer, nous allons cr\u00e9er la job permettant de g\u00e9n\u00e9rer une seule facture au format PDF. Nous transmettrons l&rsquo;identifiant de la facture et, dans le gestionnaire, nous trouverons la facture appropri\u00e9e et appellerons la m\u00e9thode pour g\u00e9n\u00e9rer et enregistrer le PDF de la facture. Afin d&rsquo;en faire un travail par lots, nous devrons ajouter le trait <em>Illuminate\\Bus\\Batchable<\/em> \u00e0 la classe du job. Ce trait donne acc\u00e8s \u00e0 une m\u00e9thode batch qui nous permettra de r\u00e9cup\u00e9rer le lot auquel le job appartient.<\/p><p>Nous allons commencer par cr\u00e9er un job appel\u00e9 <em>CreateInvoice<\/em> \u00e0 l&rsquo;aide d&rsquo;une commande artisanale.<\/p><pre class=\"wp-block-code\"><code>php artisan make:job CreateInvoice<\/code><\/pre><p>Apr\u00e8s avoir ajout\u00e9 le trait <em>Illuminate\\Bus\\Batchable <\/em> et le code pour g\u00e9n\u00e9rer la facture, la classe de job ressemble \u00e0 ceci :<\/p><pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Jobs;\n\nuse Illuminate\\Bus\\Batchable;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldBeUnique;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse App\\Models\\Invoice;\n\nclass CreateInvoice implements ShouldQueue\n{\n    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    private $invoice_id;\n\n    \/**\n     * Create a new job instance.\n     *\/\n    public function __construct($invoice_id)\n    {\n        $this-&gt;invoice_id = $invoice_id;\n    }\n\n    \/**\n     * Execute the job.\n     *\/\n    public function handle(): void\n    {\n        if ($this-&gt;batch()-&gt;cancelled()) {\n            \/\/ Determine if the batch has been cancelled...\n\n            return;\n        }\n        \n        $invoice = Invoice::find($this-&gt;invoice_id);\n        $invoice-&gt;createPDF();\n    }\n}\n<\/code><\/pre><p>Le gestionnaire se compose maintenant de 3 parties principales :<\/p><ol start=\"1\" class=\"wp-block-list\"><li>Une instruction if qui d\u00e9tecte si le lot a \u00e9t\u00e9 annul\u00e9 &#8211; cela se produit le plus souvent si un job \u00e9choue. Cela permet d&rsquo;\u00e9viter que d&rsquo;autres factures soient g\u00e9n\u00e9r\u00e9es en cas d&rsquo;\u00e9chec de l&rsquo;une d&rsquo;entre elles.<\/li>\n\n<li>Cr\u00e9ation d&rsquo;un objet facture \u00e0 l&rsquo;aide de l&rsquo;identifiant transmis dans le job<\/li>\n\n<li>Appeler la m\u00e9thode createPDF dans le mod\u00e8le de facture pour cr\u00e9er une version PDF de la facture et l&rsquo;enregistrer sur le disque.<\/li><\/ol><h3 class=\"wp-block-heading has-ast-global-color-2-color has-text-color has-link-color wp-elements-f9bfaa97eb3ae0d0a1dd347bf97f3125\" id=\"running-the-batch\">Ex\u00e9cution du traitement par lots<\/h3><p>Pour ex\u00e9cuter notre nouveau job par lots, nous devons appeler la m\u00e9thode <em>batch<\/em> de la fa\u00e7ade <em>Illuminate\\Bus\\Batch<\/em><strong> <\/strong>fa\u00e7ade. Nous allons commencer par un appel basique, en cr\u00e9ant simplement une poign\u00e9e de factures \u00e0 titre d&rsquo;exemple :<\/p><pre class=\"wp-block-code\"><code>use App\\Jobs\\CreateInvoice;\nuse Illuminate\\Bus\\Batch;\nuse Illuminate\\Support\\Facades\\Bus;\nuse Throwable;\n\n$batch = Bus::batch(&#91;\n    new CreateInvoice(1),\n    new CreateInvoice(2),\n    new CreateInvoice(3),\n    new CreateInvoice(4),\n])-&gt;then(function (Batch $batch) {\n    \/\/ All jobs completed successfully...\n})-&gt;catch(function (Batch $batch, Throwable $e) {\n    \/\/ First batch job failure detected...\n})-&gt;dispatch();<\/code><\/pre><p>Nous avons appel\u00e9 la fonction batch, en passant quatre jobs <em>CreateInvoice<\/em>. Nous avons \u00e9galement d\u00e9fini la fonction <em>then<\/em> callback, qui nous permet de zipper les fichiers et d&rsquo;envoyer un lien vers le fichier, ainsi que la fonction <em>catch<\/em> callback, qui nous permet d&rsquo;envoyer un message d&rsquo;erreur \u00e0 l&rsquo;utilisateur au cas o\u00f9 l&rsquo;un des job \u00e9chouerait.<\/p><p>Bien s\u00fbr, nous allons vouloir cr\u00e9er plus de quatre factures. Nous allons \u00e0 nouveau abstraire les choses et supposer que nous avons une m\u00e9thode statique dans le mod\u00e8le de facture, appel\u00e9e <em>getInvoicesByMonth<\/em>, qui renvoie une liste de factures pour un mois sp\u00e9cifique, ainsi qu&rsquo;une m\u00e9thode, appel\u00e9e <em>createZipFile<\/em>, qui zippera les factures et renverra un lien vers le fichier r\u00e9sultant. Nous allons maintenant cr\u00e9er un nouveau job par lots appel\u00e9 <em>LoadInvoiceBatch<\/em>:<\/p><pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Jobs;\n\nuse App\\Models\\Invoice;\nuse Illuminate\\Bus\\Batchable;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldBeUnique;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\n\nclass LoadInvoiceBatch implements ShouldQueue\n{\n    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    private $month;\n\n    \/**\n     * Create a new job instance.\n     *\/\n    public function __construct($month)\n    {\n        $this-&gt;$month = $month;\n    }\n\n    \/**\n     * Execute the job.\n     *\/\n    public function handle(): void\n    {\n        if ($this-&gt;batch()-&gt;cancelled()) {\n            return;\n        }\n\n        $invoice_list = Invoice::getInvoicesByMonth($this-&gt;month);\n        foreach ($invoice_list as $invoice) {\n            $this-&gt;batch()-&gt;add(new CreateInvoice($invoice-&gt;id));\n        }\n    }\n}<\/code><\/pre><p>Avec ceci en place, nous pouvons ex\u00e9cuter notre nouveau job et d\u00e9finir nos rappels :<\/p><pre class=\"wp-block-code\"><code>use App\\Jobs\\LoadInvoiceBatch;\nuse App\\Models\\Invoice;\nuse App\\Notifications\\InvoiceError;\nuse App\\Notifications\\InvoicesCompleted;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\Support\\Facades\\Bus;\n\n$batch = Bus::batch(&#91;\n    new LoadInvoiceBatch($month)\n])-&gt;then(function() {\n    $link = Invoice::createZipFile();\n    Auth::user()-&gt;notify(new InvoicesCompleted($link));\n})-&gt;catch(function() {\n    Auth::user()-&gt;notify(new InvoiceError());\n})-&gt;dispatch();<\/code><\/pre><p>Dans le cadre de la cr\u00e9ation du lot, nous l&rsquo;avons stock\u00e9 dans une variable appel\u00e9e <em>$batch<\/em> ; cela poss\u00e8de un certain nombre de propri\u00e9t\u00e9s et de m\u00e9thodes utiles qui nous donnent des informations sur le lot, notamment l&rsquo;ID du lot, le nombre total de t\u00e2ches dans le lot, le nombre de t\u00e2ches en attente, le nombre de t\u00e2ches ayant \u00e9chou\u00e9, le pourcentage de t\u00e2ches termin\u00e9es et plus. Il existe \u00e9galement une m\u00e9thode pour annuler le job manuellement (si tu en as besoin). Cet exemple \u00e9tait assez simple ; tu peux faire plus avec les lots, comme essayer de relancer les job qui ont \u00e9chou\u00e9 dans le lot. Tu trouveras plus d&rsquo;informations dans la <a href=\"https:\/\/laravel.com\/docs\/10.x\/queues#job-batching\" target=\"_blank\" rel=\"noreferrer noopener\">documentation de Laravel<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Quand est-il utile d&rsquo;utiliser des lots de \u201cjobs\u201d dans Laravel ? Nous avons \u00e9voqu\u00e9 les files d\u2019attente dans un article pr\u00e9c\u00e9dent. Les files d&rsquo;attente sont un outil utile dans Laravel, vous permettant d&rsquo;ex\u00e9cuter des t\u00e2ches compliqu\u00e9es ou fastidieuses en arri\u00e8re-plan. Il y aura des moments o\u00f9 vous devrez ex\u00e9cuter des dizaines, voire des centaines d&rsquo;instances &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/www.directimpactsolutions.com\/fr\/lots-de-jobs-dans-laravel\/\"> <span class=\"screen-reader-text\">Lots de jobs dans Laravel<\/span> Lire la suite >><\/a><\/p>\n","protected":false},"author":9,"featured_media":16753,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"","footnotes":""},"categories":[37],"tags":[154,308],"class_list":["post-17013","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web","tag-laravel-fr","tag-lots-de-jobs"],"uagb_featured_image_src":{"full":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png",500,300,false],"thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel-150x150.png",150,150,true],"medium":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel-300x180.png",300,180,true],"medium_large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png",500,300,false],"large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png",500,300,false],"1536x1536":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png",500,300,false],"2048x2048":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png",500,300,false],"woocommerce_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel-300x300.png",300,300,true],"woocommerce_single":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel.png",500,300,false],"woocommerce_gallery_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/02\/Job-Batches-in-Laravel-100x100.png",100,100,true]},"uagb_author_info":{"display_name":"Alan Bruce","author_link":"https:\/\/www.directimpactsolutions.com\/fr\/author\/alan-bruce\/"},"uagb_comment_info":0,"uagb_excerpt":"Quand est-il utile d&rsquo;utiliser des lots de \u201cjobs\u201d dans Laravel ? Nous avons \u00e9voqu\u00e9 les files d\u2019attente dans un article pr\u00e9c\u00e9dent. Les files d&rsquo;attente sont un outil utile dans Laravel, vous permettant d&rsquo;ex\u00e9cuter des t\u00e2ches compliqu\u00e9es ou fastidieuses en arri\u00e8re-plan. Il y aura des moments o\u00f9 vous devrez ex\u00e9cuter des dizaines, voire des centaines d&rsquo;instances\u2026","_links":{"self":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/17013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/comments?post=17013"}],"version-history":[{"count":4,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/17013\/revisions"}],"predecessor-version":[{"id":21086,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/17013\/revisions\/21086"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media\/16753"}],"wp:attachment":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=17013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/categories?post=17013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/tags?post=17013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}