<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://bowphp.com/blog</id>
    <title>Bow Framework Blog</title>
    <updated>2025-12-07T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://bowphp.com/blog"/>
    <subtitle>Bow Framework Blog</subtitle>
    <icon>https://bowphp.com/img/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Téléversement de fichiers avec BowPHP]]></title>
        <id>https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp</id>
        <link href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp"/>
        <updated>2025-12-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Guide d'intégration sécurisée du téléversement de fichiers dans une application BowPHP]]></summary>
        <content type="html"><![CDATA[<p>Ce billet explique comment intégrer de manière sécurisée le téléversement de fichiers dans une application BowPHP : routes, contrôleurs, emplacement de stockage et diffusion des fichiers téléversés.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="vue-densemble">Vue d'ensemble<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#vue-densemble" class="hash-link" aria-label="Lien direct vers Vue d'ensemble" title="Lien direct vers Vue d'ensemble" translate="no">​</a></h2>
<p>Le téléversement de fichiers est courant mais risqué. Avec BowPHP vous devez :</p>
<ul>
<li class="">Enregistrer une route qui reçoit le fichier.</li>
<li class="">Valider et déplacer le fichier dans un contrôleur.</li>
<li class="">Stocker les fichiers en dehors du répertoire public (par ex. racine/var/storage).</li>
<li class="">Servir les fichiers via un contrôleur ou des URL signées pour éviter l'accès direct.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="formulaire-html-client">Formulaire HTML (client)<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#formulaire-html-client" class="hash-link" aria-label="Lien direct vers Formulaire HTML (client)" title="Lien direct vers Formulaire HTML (client)" translate="no">​</a></h2>
<p>Utilisez multipart/form-data et pointez vers la route BowPHP :</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">form</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">action</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">/upload</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">method</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">post</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">enctype</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">multipart/form-data</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">file</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Choisir un fichier</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">input</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">file</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">file</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">file</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">required</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">submit</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Téléverser</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">form</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="enregistrer-la-route-bowphp">Enregistrer la route (BowPHP)<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#enregistrer-la-route-bowphp" class="hash-link" aria-label="Lien direct vers Enregistrer la route (BowPHP)" title="Lien direct vers Enregistrer la route (BowPHP)" translate="no">​</a></h2>
<p>Ajoutez une route POST qui délègue au contrôleur :</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// filepath: /routes/web.php</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...existing code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Controllers</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">UploadController</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token variable" style="color:rgb(156, 220, 254)">$app</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">post</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/upload'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">UploadController</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...existing code...</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="uploadcontroller-bowphp">UploadController (BowPHP)<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#uploadcontroller-bowphp" class="hash-link" aria-label="Lien direct vers UploadController (BowPHP)" title="Lien direct vers UploadController (BowPHP)" translate="no">​</a></h2>
<p>Gestionnaire minimal et sécurisé adapté à BowPHP. Ajustez l'API Request selon votre version ; un fallback vers $_FILES peut être ajouté si nécessaire.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// filepath: /app/controllers/UploadController.php</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">namespace</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Controllers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Http</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Http</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Http</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">UploadedFile</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name-definition class-name" style="color:rgb(78, 201, 176)">UploadController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">store</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token class-name type-declaration" style="color:rgb(78, 201, 176)">Request</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token class-name return-type" style="color:rgb(78, 201, 176)">Response</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">hasFile</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'file'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Aucun fichier fourni'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">400</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">/** @var UploadedFile $file */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'file'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">isUploaded</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Erreur lors du téléversement'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">400</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Limites</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$maxBytes</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1024</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1024</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">// 5 MB</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">getFilesize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$maxBytes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Fichier trop volumineux'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">400</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Validation du MIME (utiliser finfo sur le fichier temporaire si disponible)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$allowed</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'image/png'</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'png'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'image/jpeg'</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'jpg'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'application/pdf'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'pdf'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$mime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">getTypeMime</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token keyword" style="color:rgb(86, 156, 214)">isset</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$allowed</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token variable" style="color:rgb(156, 220, 254)">$mime</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Type de fichier invalide'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">400</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$extension</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">getExtension</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Stocker en dehors du dossier public - utiliser le répertoire var/storage du projet</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">storage_path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'uploads'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">// projet_root/var/storage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token function" style="color:rgb(220, 220, 170)">is_dir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token function" style="color:rgb(220, 220, 170)">mkdir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0750</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(100, 102, 149)">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$filename</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">bin2hex</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token function" style="color:rgb(220, 220, 170)">random_bytes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'.'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$extension</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Déplacer le fichier via l'API UploadedFile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$result</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">moveTo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$filename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Vérifier la réussite du déplacement (moveTo peut renvoyer void/true/chemin/objet selon implémentation)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$dest</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">rtrim</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token constant" style="color:rgb(100, 102, 149)">DIRECTORY_SEPARATOR</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token constant" style="color:rgb(100, 102, 149)">DIRECTORY_SEPARATOR</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$filename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token function" style="color:rgb(220, 220, 170)">is_string</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$result</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">is_file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$result</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token variable" style="color:rgb(156, 220, 254)">$dest</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$result</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token function" style="color:rgb(220, 220, 170)">is_file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$dest</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Échec du déplacement du fichier'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">500</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">chmod</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$dest</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0640</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Retourner une référence sûre (ne pas exposer le chemin complet). Envisagez une URL signée ou un ID.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">json</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'status'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'ok'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'file'</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$filename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="diffusion-des-fichiers-téléversés-via-contrôleur-sécurisé">Diffusion des fichiers téléversés (via contrôleur, sécurisé)<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#diffusion-des-fichiers-t%C3%A9l%C3%A9vers%C3%A9s-via-contr%C3%B4leur-s%C3%A9curis%C3%A9" class="hash-link" aria-label="Lien direct vers Diffusion des fichiers téléversés (via contrôleur, sécurisé)" title="Lien direct vers Diffusion des fichiers téléversés (via contrôleur, sécurisé)" translate="no">​</a></h2>
<p>Servez les fichiers via BowPHP pour pouvoir appliquer authentification et en-têtes au lieu d'exposer le dossier de stockage.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// filepath: /app/controllers/FileServeController.php</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">namespace</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Controllers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Http</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Http</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name-definition class-name" style="color:rgb(78, 201, 176)">FileServeController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">show</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token class-name type-declaration" style="color:rgb(78, 201, 176)">Request</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$filename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token class-name return-type" style="color:rgb(78, 201, 176)">Response</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">storage_path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'uploads'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">// projet_root/var/storage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$uploadsDirectory</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token constant" style="color:rgb(100, 102, 149)">DIRECTORY_SEPARATOR</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">basename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$filename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token function" style="color:rgb(220, 220, 170)">is_file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Introuvable'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">404</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Optionnel : vérifier permissions, propriété ou authentification ici.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Envoyer le fichier avec les en-têtes appropriés</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">download</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token constant" style="color:rgb(100, 102, 149)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Content-Type'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">mime_content_type</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Content-Length'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">filesize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Content-Disposition'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'attachment; filename="'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">basename</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$file</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'"'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<p>Enregistrez la route GET pour la diffusion (appliquez le middleware d'authentification et de limitation de débit si nécessaire) :</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// filepath: /routes/web.php</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...existing code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token variable" style="color:rgb(156, 220, 254)">$app</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/uploads/{filename}'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token class-name class-name-fully-qualified static-context punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token class-name class-name-fully-qualified static-context" style="color:rgb(78, 201, 176)">App</span><span class="token class-name class-name-fully-qualified static-context punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token class-name class-name-fully-qualified static-context" style="color:rgb(78, 201, 176)">Controllers</span><span class="token class-name class-name-fully-qualified static-context punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token class-name class-name-fully-qualified static-context" style="color:rgb(78, 201, 176)">FileServeController</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'show'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">middleware</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'auth'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">// appliquez le middleware d'authentification/limitation si nécessaire</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...existing code...</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="configuration-bowphp--notes-sur-le-stockage">Configuration BowPHP &amp; notes sur le stockage<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#configuration-bowphp--notes-sur-le-stockage" class="hash-link" aria-label="Lien direct vers Configuration BowPHP &amp; notes sur le stockage" title="Lien direct vers Configuration BowPHP &amp; notes sur le stockage" translate="no">​</a></h2>
<ul>
<li class="">Conservez les uploads sous project_root/var/storage (hors dossier public).</li>
<li class="">Si vous utilisez config/storage.php ou config/filesystems.php, déclarez un disque local pointant vers var/storage.</li>
<li class="">Pour les gros fichiers, envisagez les uploads en morceaux (chunked) et le streaming pour éviter des pics mémoire.</li>
<li class="">Utilisez des URL signées ou un contrôleur pour accorder un accès temporaire au lieu de liens directs.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="notes-de-déploiement">Notes de déploiement<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#notes-de-d%C3%A9ploiement" class="hash-link" aria-label="Lien direct vers Notes de déploiement" title="Lien direct vers Notes de déploiement" translate="no">​</a></h2>
<ul>
<li class="">Assurez-vous que project_root/var/storage existe dans chaque environnement avec le bon propriétaire et permissions.</li>
<li class="">Synchronisez les limites php.ini avec celles définies dans l'application.</li>
<li class="">Envisagez de migrer les uploads vers un stockage objet (S3) pour la scalabilité ; servez via URL signées.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="lectures-complémentaires">Lectures complémentaires<a href="https://bowphp.com/blog/televersement-de-fichiers-avec-bowphp#lectures-compl%C3%A9mentaires" class="hash-link" aria-label="Lien direct vers Lectures complémentaires" title="Lien direct vers Lectures complémentaires" translate="no">​</a></h2>
<ul>
<li class="">PHP manual: Handling file uploads</li>
<li class="">OWASP: File Upload Cheat Sheet</li>
<li class="">BowPHP docs: routing, controllers, and response helpers</li>
</ul>
<div style="margin:2rem 0;padding:1.5rem;border-radius:8px;background:var(--ifm-card-background-color);box-shadow:0 1px 2px 0 rgba(0, 0, 0, 0.05)"><h2>Il manque quelque chose ?</h2><p>Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter<!-- --> <a href="https://twitter.com/@bowframework">@bowframework</a> ou sur directement sur le<!-- --> <a href="https://github.com/bowphp/docs/issues">github</a>.</p></div>]]></content>
        <author>
            <name>Franck DAKIA</name>
            <email>dakiafranck@gmail.com</email>
            <uri>https://github.com/papac</uri>
        </author>
        <category label="bowphp" term="bowphp"/>
        <category label="php" term="php"/>
        <category label="upload" term="upload"/>
        <category label="security" term="security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Créer une application de To Do List avec BowPHP]]></title>
        <id>https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp</id>
        <link href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp"/>
        <updated>2025-01-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Créer une application de To Do List avec BowPHP]]></summary>
        <content type="html"><![CDATA[<p>Créer une application de To Do List avec BowPHP, un framework PHP léger, est une excellente idée. Voici un plan détaillé pour y parvenir :</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-1--installation-de-bowphp"><strong>Étape 1 : Installation de BowPHP</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-1--installation-de-bowphp" class="hash-link" aria-label="Lien direct vers étape-1--installation-de-bowphp" title="Lien direct vers étape-1--installation-de-bowphp" translate="no">​</a></h3>
<ol>
<li class=""><strong>Installer BowPHP</strong> :</li>
</ol>
<p>Assurez-vous que Composer est installé sur votre machine, puis utilisez la commande suivante pour installer BowPHP :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">composer</span><span class="token plain"> create-project bowphp/app todolist</span><br></span></code></pre></div></div>
<p>Cela créera une nouvelle application BowPHP nommée <code>todolist</code>.</p>
<ol start="2">
<li class=""><strong>Configurer votre application</strong> :</li>
</ol>
<ul>
<li class="">Modifiez le fichier <code>.env.json</code> pour configurer la connexion à la base de données (par exemple MySQL).</li>
</ul>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">.env.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"DB_DEFAULT"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"mysql"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"DB_HOSTNAME"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"127.0.0.1"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"DB_USERNAME"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"username"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"DB_PASSWORD"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"password"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"DB_DBNAME"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"todolist_db"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token property">"DB_PORT"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3306</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-2--configurer-la-base-de-données"><strong>Étape 2 : Configurer la base de données</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-2--configurer-la-base-de-donn%C3%A9es" class="hash-link" aria-label="Lien direct vers étape-2--configurer-la-base-de-données" title="Lien direct vers étape-2--configurer-la-base-de-données" translate="no">​</a></h3>
<ol>
<li class=""><strong>Créer la base de données</strong> :</li>
</ol>
<p>Exécutez cette commande MySQL pour créer une base de données :</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">DATABASE</span><span class="token plain"> todolist_db</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></span></code></pre></div></div>
<ol start="2">
<li class=""><strong>Créer une table pour les tâches</strong> :</li>
</ol>
<p>Pour ajouter une nous table, vous pouvez le faire avec la commande suivante:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">php bow add:migration create-tasks-table</span><br></span></code></pre></div></div>
<p>Vous allez avoir un nouveau fichier dans le dossier <code>database/migrations</code>.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">database/migrations/Version1000000000CreateTasksTable.php</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Database</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Migration</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Migration</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Database</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Migration</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">SQLGenerator</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> Table</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name-definition class-name" style="color:rgb(78, 201, 176)">Version1000000000CreateTasksTable</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Migration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">/**</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   * Run the migrations.</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   *</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   * @return void</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">  */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">up</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$this</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">create</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'tasks'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token class-name type-declaration" style="color:rgb(78, 201, 176)">Table</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$table</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token variable" style="color:rgb(156, 220, 254)">$table</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">addPrimary</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token variable" style="color:rgb(156, 220, 254)">$table</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">addString</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'title'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token variable" style="color:rgb(156, 220, 254)">$table</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">addBoolean</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'completed'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'default'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(100, 102, 149)">false</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token variable" style="color:rgb(156, 220, 254)">$table</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">addTimestamps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">/**</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   * Reverse the migrations.</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   *</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   * @return void</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">   */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">rollback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$this</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">dropIfExists</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'tasks'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<p>Ensuite, exécutez la migration :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">php bow migrate</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-3--créer-le-modèle-et-le-contrôleur"><strong>Étape 3 : Créer le modèle et le contrôleur</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-3--cr%C3%A9er-le-mod%C3%A8le-et-le-contr%C3%B4leur" class="hash-link" aria-label="Lien direct vers étape-3--créer-le-modèle-et-le-contrôleur" title="Lien direct vers étape-3--créer-le-modèle-et-le-contrôleur" translate="no">​</a></h3>
<ol>
<li class=""><strong>Créer un modèle <code>Task</code></strong> :</li>
</ol>
<p>Ajouter un modèle de base de donnée</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">php bow add:model Task</span><br></span></code></pre></div></div>
<p>Vous verrez le fichier <code>app/Models/Task.php</code> dans votre projet.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">app/Models/Task.php</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">namespace</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Models</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Database</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Barry</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Model</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name-definition class-name" style="color:rgb(78, 201, 176)">Task</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Model</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<ol start="2">
<li class=""><strong>Créer un contrôleur <code>TaskController</code></strong> :</li>
</ol>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">app/Controllers/TaskController.php</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">namespace</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Controllers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Models</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">Bow</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Http</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name-definition class-name" style="color:rgb(78, 201, 176)">TaskController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">index</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$tasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">Task</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token function" style="color:rgb(220, 220, 170)">all</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">view</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'tasks.index'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">compact</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'tasks'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">store</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token class-name type-declaration" style="color:rgb(78, 201, 176)">Request</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Validation des données</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">validate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'title'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'required|min:3|max:255'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">Task</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token function" style="color:rgb(220, 220, 170)">create</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'title'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'title'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'completed'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(100, 102, 149)">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">redirect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">withFlash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'success'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Tâche ajoutée avec succès !'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">update</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword type-hint" style="color:rgb(86, 156, 214)">int</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">Task</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token function" style="color:rgb(220, 220, 170)">find</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">redirect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">withFlash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'error'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Tâche introuvable.'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">update</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'completed'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token property">completed</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">redirect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">withFlash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'success'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Tâche mise à jour !'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(220, 220, 170)">destroy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token class-name type-declaration" style="color:rgb(78, 201, 176)">Request</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword type-hint" style="color:rgb(86, 156, 214)">int</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">Task</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token function" style="color:rgb(220, 220, 170)">find</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token variable" style="color:rgb(156, 220, 254)">$id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">redirect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">withFlash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'error'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Tâche introuvable.'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">delete</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">redirect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">withFlash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'success'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Tâche supprimée !'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-4--configurer-les-routes"><strong>Étape 4 : Configurer les routes</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-4--configurer-les-routes" class="hash-link" aria-label="Lien direct vers étape-4--configurer-les-routes" title="Lien direct vers étape-4--configurer-les-routes" translate="no">​</a></h3>
<p>Dans le fichier <code>routes/app.php</code>, ajoutez les routes suivantes :</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">Controllers</span><span class="token package punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token package">TaskController</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token variable" style="color:rgb(156, 220, 254)">$app</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">TaskController</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'index'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token variable" style="color:rgb(156, 220, 254)">$app</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">post</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/tasks'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">TaskController</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token variable" style="color:rgb(156, 220, 254)">$app</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">put</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/tasks/{id}'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">TaskController</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'update'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token variable" style="color:rgb(156, 220, 254)">$app</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">delete</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'/tasks/{id}'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token class-name static-context" style="color:rgb(78, 201, 176)">TaskController</span><span class="token operator" style="color:rgb(212, 212, 212)">::</span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'destroy'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Note sur les méthodes HTTP</div><div class="admonitionContent_BuS1"><p>Bow Framework gère automatiquement la méthode spoofing via le champ <code>_method</code> dans les formulaires.
Cela permet d'utiliser PUT et DELETE même si HTML ne supporte nativement que GET et POST.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-5--créer-les-vues"><strong>Étape 5 : Créer les vues</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-5--cr%C3%A9er-les-vues" class="hash-link" aria-label="Lien direct vers étape-5--créer-les-vues" title="Lien direct vers étape-5--créer-les-vues" translate="no">​</a></h3>
<p>Créer le fichier de template <code>templates/tasks.tintin.php</code> et ajoutez-y le contenu suivant.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">templates/tasks.tintin.php</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token constant" style="color:rgb(100, 102, 149)">DOCTYPE</span><span class="token plain"> html</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">html lang</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"fr"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">head</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">meta charset</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"UTF-8"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">meta name</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"viewport"</span><span class="token plain"> content</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"width=device-width, initial-scale=1.0"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">title</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Todo </span><span class="token keyword" style="color:rgb(86, 156, 214)">List</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> BowPHP</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">title</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">style</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> margin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> box</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">sizing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">box</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    body </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      font</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">family</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">apple</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">system</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> BlinkMacSystemFont</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'Segoe UI'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sans</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">serif</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> linear</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token function" style="color:rgb(220, 220, 170)">gradient</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">135</span><span class="token plain">deg</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#667eea 0%, #764ba2 100%);</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      min</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">height</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain">vh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">container </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      max</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">width</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">600</span><span class="token plain">px</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      margin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> auto</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> white</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">radius</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token plain">px</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      box</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">shadow</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token plain">px </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">px </span><span class="token function" style="color:rgb(220, 220, 170)">rgba</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token number" style="color:rgb(181, 206, 168)">0.3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    h1 </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      color</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#333; </span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      margin</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">bottom</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      text</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">align</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> center</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">add</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">form </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      display</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> flex</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      gap</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      margin</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">bottom</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"text"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      flex</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.75</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain">px solid </span><span class="token comment" style="color:rgb(106, 153, 85)">#e0e0e0;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">radius</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token plain">px</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      font</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"text"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">focus </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      outline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> none</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">color</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#667eea;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    button </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.75</span><span class="token plain">rem </span><span class="token number" style="color:rgb(181, 206, 168)">1.5</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#667eea;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      color</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> white</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> none</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">radius</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token plain">px</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      cursor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pointer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      font</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      transition</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> background </span><span class="token number" style="color:rgb(181, 206, 168)">0.3</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    button</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">hover </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#5568d3; }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">task</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token keyword" style="color:rgb(86, 156, 214)">list</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">list</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">style</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> none</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">task</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">item </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      display</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> flex</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      align</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> center</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      margin</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">bottom</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#f8f9fa;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">radius</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token plain">px</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      gap</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.75</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">task</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">item</span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">completed </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      opacity</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.6</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      text</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">decoration</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> line</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">through</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">task</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">title </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> flex</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">btn</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">icon </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> transparent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> none</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      cursor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pointer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      font</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1.25</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">flash</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">message </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      padding</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      margin</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">bottom</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">rem</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">radius</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token plain">px</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      font</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">weight</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">500</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">flash</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">success </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#d4edda;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      color</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#155724;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">px solid </span><span class="token comment" style="color:rgb(106, 153, 85)">#c3e6cb;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain">flash</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">error </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      background</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#f8d7da;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      color</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">#721c24;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      border</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">px solid </span><span class="token comment" style="color:rgb(106, 153, 85)">#f5c6cb;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">style</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">head</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">body</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">div </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"container"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">📝 Ma Todo </span><span class="token keyword" style="color:rgb(86, 156, 214)">List</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">h1</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">#if(flash()-&gt;has('success'))</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">div </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"flash-message flash-success"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">flash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'success'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">#endif</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">#if(flash()-&gt;has('error'))</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">div </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"flash-message flash-error"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">flash</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token function" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'error'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">#endif</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">form method</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"POST"</span><span class="token plain"> action</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"/tasks"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"add-form"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">csrf_field</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"text"</span><span class="token plain"> name</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"title"</span><span class="token plain"> placeholder</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"Ajouter une nouvelle tâche..."</span><span class="token plain"> required</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">button type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"submit"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Ajouter</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">button</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">form</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">ul </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"task-list"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)">#foreach ($tasks as $task)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">li </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"task-item {{ </span><span class="token string double-quoted-string interpolation variable" style="color:rgb(156, 220, 254)">$task</span><span class="token string double-quoted-string interpolation operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token string double-quoted-string interpolation property" style="color:rgb(206, 145, 120)">completed</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)"> ? 'completed' : '' }}"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">form method</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"POST"</span><span class="token plain"> action</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"/tasks/{{ </span><span class="token string double-quoted-string interpolation variable" style="color:rgb(156, 220, 254)">$task</span><span class="token string double-quoted-string interpolation operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token string double-quoted-string interpolation property" style="color:rgb(206, 145, 120)">id</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)"> }}"</span><span class="token plain"> style</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"display: inline;"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">csrf_field</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"hidden"</span><span class="token plain"> name</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"_method"</span><span class="token plain"> value</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"PUT"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">button type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"submit"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"btn-icon"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token property">completed</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">?</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'✅'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(206, 145, 120)">'⬜'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">button</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">form</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">span </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"task-title"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(156, 220, 254)">$task</span><span class="token operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token property">title</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">span</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">form method</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"POST"</span><span class="token plain"> action</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"/tasks/{{ </span><span class="token string double-quoted-string interpolation variable" style="color:rgb(156, 220, 254)">$task</span><span class="token string double-quoted-string interpolation operator" style="color:rgb(212, 212, 212)">-&gt;</span><span class="token string double-quoted-string interpolation property" style="color:rgb(206, 145, 120)">id</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)"> }}"</span><span class="token plain"> style</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"display: inline;"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">csrf_field</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"hidden"</span><span class="token plain"> name</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"_method"</span><span class="token plain"> value</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"DELETE"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">button type</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"submit"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"btn-icon"</span><span class="token plain"> onclick</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"return confirm('Supprimer cette tâche ?')"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">❌</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">button</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">form</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">li</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)">#endforeach</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">ul</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">#if(count($tasks) === 0)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain">p style</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string double-quoted-string" style="color:rgb(206, 145, 120)">"text-align: center; color: #999; padding: 2rem;"</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Aucune tâche</span><span class="token operator" style="color:rgb(212, 212, 212)">.</span><span class="token plain"> Ajoutez</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">en une ci</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">dessus </span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">p</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">#endif</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">div</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">body</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">html</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Sécurité CSRF</div><div class="admonitionContent_BuS1"><p>Notez l'utilisation de <code>{{ csrf_field() }}</code> dans tous les formulaires. C'est une protection CSRF intégrée dans Bow Framework qui empêche les attaques de type Cross-Site Request Forgery.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-6--lancer-lapplication"><strong>Étape 6 : Lancer l'application</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-6--lancer-lapplication" class="hash-link" aria-label="Lien direct vers étape-6--lancer-lapplication" title="Lien direct vers étape-6--lancer-lapplication" translate="no">​</a></h3>
<p>Démarrez le serveur BowPHP :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">php bow run:server</span><br></span></code></pre></div></div>
<p>Accédez à votre application sur <code>http://localhost:5000</code>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="étape-7--améliorations-possibles"><strong>Étape 7 : Améliorations possibles</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#%C3%A9tape-7--am%C3%A9liorations-possibles" class="hash-link" aria-label="Lien direct vers étape-7--améliorations-possibles" title="Lien direct vers étape-7--améliorations-possibles" translate="no">​</a></h3>
<p>Voici quelques idées pour améliorer votre application :</p>
<ol>
<li class=""><strong>Filtrage des tâches</strong> : Ajouter des filtres pour voir les tâches complétées/incomplètes</li>
<li class=""><strong>Date d'échéance</strong> : Ajouter une colonne <code>due_date</code> pour gérer les dates limites</li>
<li class=""><strong>Catégories</strong> : Créer un système de catégories ou tags pour organiser les tâches</li>
<li class=""><strong>Authentification</strong> : Implémenter un système de connexion pour que chaque utilisateur ait ses propres tâches</li>
<li class=""><strong>API REST</strong> : Transformer l'application en API pour une utilisation avec un frontend JavaScript (React, Vue.js)</li>
<li class=""><strong>Recherche</strong> : Ajouter une barre de recherche pour filtrer les tâches</li>
<li class=""><strong>Priorités</strong> : Ajouter des niveaux de priorité (haute, moyenne, basse)</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="déploiement"><strong>Déploiement</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#d%C3%A9ploiement" class="hash-link" aria-label="Lien direct vers déploiement" title="Lien direct vers déploiement" translate="no">​</a></h3>
<p>Pour déployer votre application en production :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># 1. Optimiser l'autoloader</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">composer</span><span class="token plain"> dump-autoload </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">--optimize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># 2. Configurer l'environnement de production dans .env.json</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"APP_ENV"</span><span class="token builtin class-name" style="color:rgb(78, 201, 176)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"production"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"APP_DEBUG"</span><span class="token builtin class-name" style="color:rgb(78, 201, 176)">:</span><span class="token plain"> false,</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    // </span><span class="token punctuation" style="color:rgb(212, 212, 212)">..</span><span class="token plain">. autres configs</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># 3. Configurer votre serveur web (Apache/Nginx)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Le point d'entrée doit pointer vers public/index.php</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Sécurité en Production</div><div class="admonitionContent_BuS1"><ul>
<li class="">Désactivez le mode debug (<code>APP_DEBUG=false</code>)</li>
<li class="">Utilisez des mots de passe forts pour la base de données</li>
<li class="">Configurez HTTPS sur votre serveur</li>
<li class="">Gardez Bow Framework et ses dépendances à jour</li>
<li class="">Validez toujours les entrées utilisateur</li>
</ul></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ressources-utiles"><strong>Ressources utiles</strong><a href="https://bowphp.com/blog/creer-une-application-de-to-do-list-avec-bowphp#ressources-utiles" class="hash-link" aria-label="Lien direct vers ressources-utiles" title="Lien direct vers ressources-utiles" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://bowphp.com/docs" target="_blank" rel="noopener noreferrer" class="">Documentation officielle de Bow Framework</a></li>
<li class=""><a href="https://bowphp.com/docs/migration" target="_blank" rel="noopener noreferrer" class="">Guide de migration</a></li>
<li class=""><a href="https://bowphp.com/docs/orm" target="_blank" rel="noopener noreferrer" class="">Guide ORM Barry</a></li>
<li class=""><a href="https://bowphp.com/docs/validation" target="_blank" rel="noopener noreferrer" class="">Validation des données</a></li>
</ul>
<div style="margin:2rem 0;padding:1.5rem;border-radius:8px;background:var(--ifm-card-background-color);box-shadow:0 1px 2px 0 rgba(0, 0, 0, 0.05)"><h2>Il manque quelque chose ?</h2><p>Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter<!-- --> <a href="https://twitter.com/@bowframework">@bowframework</a> ou sur directement sur le<!-- --> <a href="https://github.com/bowphp/docs/issues">github</a>.</p></div>]]></content>
        <author>
            <name>Franck DAKIA</name>
            <email>dakiafranck@gmail.com</email>
            <uri>https://github.com/papac</uri>
        </author>
        <category label="bowphp" term="bowphp"/>
        <category label="php" term="php"/>
        <category label="framework" term="framework"/>
    </entry>
</feed>