<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Estéban</title>
    <description>The latest articles on DEV Community by Estéban (@barbapapazes).</description>
    <link>https://dev.to/barbapapazes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F689645%2Fd496b1b8-4cdc-4602-86f4-ae2d6e409c8b.jpeg</url>
      <title>DEV Community: Estéban</title>
      <link>https://dev.to/barbapapazes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/barbapapazes"/>
    <language>en</language>
    <item>
      <title>Objectifs et plan d'action - Real World To-Do App - AdonisJS</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sun, 03 Jul 2022 08:30:52 +0000</pubDate>
      <link>https://dev.to/barbapapazes/objectifs-et-plan-dactions-real-world-to-do-app-adonisjs-bjc</link>
      <guid>https://dev.to/barbapapazes/objectifs-et-plan-dactions-real-world-to-do-app-adonisjs-bjc</guid>
      <description>&lt;p&gt;Créer une &lt;code&gt;Todo list&lt;/code&gt; (liste de tâches), c'est la &lt;a href="https://todomvc.com/"&gt;base des projets&lt;/a&gt; pour apprendre à programmer ou à manier un nouveau framework !&lt;/p&gt;

&lt;p&gt;Mais bien souvent, &lt;strong&gt;ces tutoriels ne vont pas assez loin&lt;/strong&gt; dans les concepts et ne permettent pas de se confronter à la réalité du terrain et à des concepts pourtant si importants !&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais du coup, encore un tutoriel pour créer une liste de tâches ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Oui et non ! En effet, on va construire ensemble une liste de tâches. Mais on va la construire avec &lt;a href="https://adonisjs.com"&gt;AdonisJS&lt;/a&gt;, un système complet pour développer des applications Node.js !&lt;/p&gt;

&lt;h2&gt;
  
  
  Objectifs
&lt;/h2&gt;

&lt;p&gt;Dans les grandes lignes, on va réimplémenter ensemble ce projet : &lt;a href="https://github.com/florinpop17/app-ideas/blob/master/Projects/2-Intermediate/To-Do-App.md"&gt;To-Do App&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Cependant, on va aussi y ajouter l'authentification de l'utilisation et le lien entre lui et ses tâches. Aussi, on utilisera une base de données pour permettre à l'utilisateur d'avoir accès à ses tâches via différents périphériques.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que tu vas apprendre
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Implémentation de l'authentification d'un utilisateur&lt;/li&gt;
&lt;li&gt;Ajouter et suppression de tâches&lt;/li&gt;
&lt;li&gt;Gestion des tâches en fonction de l'utilisateur connecté&lt;/li&gt;
&lt;li&gt;Tests fonctionnels associés&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Autant te dire qu'avec tout ça, on va pouvoir passer sur différents concepts du framework et que tu vas apprendre plein de choses même si l'application ne semble pas bien complexe.&lt;/p&gt;

&lt;p&gt;Avant d'aller plus loin, il est important d'avoir quelques bases sur l'outil qu'on va utiliser ! Pour cela, je te recommande &lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg"&gt;ma série sur la création d'un petit blog&lt;/a&gt; avec AdonisJS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan d'action
&lt;/h2&gt;

&lt;p&gt;Cette série n'a pas pour vocation de te faire créer le design. Par conséquent, je te mets à &lt;a href="https://github.com/Barbapapazes/learn_web-real_world_todo_app/tree/0-initial-design"&gt;disposition sur GitHub&lt;/a&gt; un template d'un projet AdonisJS avec les vues déjà prêtes ! Il ne te reste qu'à installer les dépendances avec &lt;code&gt;npm ci&lt;/code&gt; puis de démarrer le serveur avec &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ensuite, tu peux simplement ouvrir ton navigateur sur &lt;a href="http://localhost:3333"&gt;localhost:3333&lt;/a&gt; pour visualiser l'application web !&lt;/p&gt;

&lt;p&gt;Important et pour se concentrer sur l'essentiel, il n'a été développé qu'une version mobile de l'application web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dans la suite
&lt;/h2&gt;

&lt;p&gt;Dans le prochain épisode de la série, on va implémenter ensemble le système authentification avec les tests qui vont avec !&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>adonisjs</category>
    </item>
    <item>
      <title>Publiposter avec des pièces jointes identiques</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sun, 05 Jun 2022 11:41:30 +0000</pubDate>
      <link>https://dev.to/barbapapazes/publiposter-avec-des-pieces-jointes-identiques-2g26</link>
      <guid>https://dev.to/barbapapazes/publiposter-avec-des-pieces-jointes-identiques-2g26</guid>
      <description>&lt;p&gt;Publiposter ses courriers électroniques, c'est-à-dire les envoyer à une liste de destinataires d'un seul clic, c'est très pratique. Mais il arrive souvent que l'on veuille ajouter un document à ce courrier électronique.&lt;/p&gt;

&lt;p&gt;Par exemple, vous organisez un évènement et vous devez envoyer le menu sous forme de PDF à l'ensemble des invités. Avec du publipostage simple, il est très simple d'envoyer le courrier à l'ensemble des convives. Mais ajouter le PDF automatiquement pour ne pas envoyer chaque courrier individuellement, c'est une tout autre histoire et c'est ce que nous allons voir maintenant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objectif
&lt;/h2&gt;

&lt;p&gt;L'idée de ce tutoriel est de t'apprendre à envoyer des courriers électroniques contenant une ou plusieurs pièces jointes via le système de publipostage de Word.&lt;/p&gt;

&lt;p&gt;Pour cela, voici le workflow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajout des pièces jointes dans le courrier électronique via Outlook&lt;/li&gt;
&lt;li&gt;Écriture du courrier via Word et Excel&lt;/li&gt;
&lt;li&gt;Envoie du courrier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est aussi simple que cela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prérequis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maitriser le publipostage simple&lt;/li&gt;
&lt;li&gt;Outlook, version bureau pour envoyer les courriers&lt;/li&gt;
&lt;li&gt;Word, version bureau pour réaliser le publipostage&lt;/li&gt;
&lt;li&gt;Excel, version bureau pour gérer la liste des destinataires&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mise en place
&lt;/h2&gt;

&lt;p&gt;Pour mener à bien notre objectif, nous allons utiliser une macro nous permettant d'ajouter nos pièces jointes à chacun de nos courriers juste avant que chacun d'eux parte.&lt;/p&gt;

&lt;p&gt;Pour cela, il faut commencer par activer le mode développeur dans Outlook. Pour faire cela &lt;code&gt;Fichier &amp;gt; Options &amp;gt; Personnaliser le ruban&lt;/code&gt; et activer le mode développeur, petite case dans la section de droite de la fenêtre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Activer les macros
&lt;/h2&gt;

&lt;p&gt;Pour qu'Outlook prenne en compte les macros, il est important de les activer.&lt;/p&gt;

&lt;p&gt;Pour cela, il te suffit de te rendre dans les options d'Outlook puis dans le &lt;code&gt;Centre de gestion de la confidentialité&lt;/code&gt; et enfin dans les &lt;code&gt;Paramètres du Centre de gestion de la confidentialité...&lt;/code&gt;. Une fois arrivé dans ce menu, tu trouveras les &lt;code&gt;Paramètres des macros&lt;/code&gt; sur la gauche de la fenêtre. Une fois dedans, tu devras activer l'option &lt;code&gt;Activer toutes les macros&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Il t'est possible de changer cette option à tout instant si tu ne souhaites pas laisser activer les macros en permanence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Création des scripts
&lt;/h2&gt;

&lt;p&gt;Une fois le mode développeur activé, nous allons pouvoir ajouter deux scripts à Outlook pour que tout fonctionne.&lt;/p&gt;

&lt;p&gt;Le premier script permet d'ajouter à Outlook le chemin vers les pièces jointes que l'on souhaite ajouter.&lt;/p&gt;

&lt;p&gt;Le second script permet de charger les pièces jointes précédemment ajoutée à chacun de nos courriers contenant &lt;code&gt;PUBLIIDEM&lt;/code&gt; en début d'objet.&lt;/p&gt;

&lt;p&gt;Pour ajouter le premier script, tu dois te rendre dans l'onglet &lt;code&gt;Développeur&lt;/code&gt; du ruban puis cliquer sur &lt;code&gt;Visual Basic&lt;/code&gt;. Dès lors, une nouvelle fenêtre va apparaitre.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ajouter les fichiers à joindre
&lt;/h3&gt;

&lt;p&gt;Dans un premier temps, nous allons ajouter le script permettant de charger les pièces jointes.&lt;/p&gt;

&lt;p&gt;Pour cela, il faut créer un nouveau module comme le montre l'image ci-dessous :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7i7a5nritrgs5km2io2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7i7a5nritrgs5km2io2u.png" alt="Image montrant la création d'un module"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puis, en double cliquant sur le module, nommé &lt;code&gt;Module 1&lt;/code&gt;, une fenêtre s'ouvre à gauche. Il faut y ajouter le script suivant :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Public publipostagePJ As Variant

Sub setPublipostage()
  On Error Resume Next

  If publipostagePJ(0) = "" Then publipostagePJ = Array("fin", "fin", "fin", "fin", "fin", "fin", "fin", "fin", "fin", "fin")

  While publipostagePJ(i) &amp;lt;&amp;gt; "fin"
    contenu = contenu &amp;amp; vbCr &amp;amp; publipostagePJ(i)
    i = i + 1
  Wend

  If contenu = "" Then contenu = "vide"

  modifier = MsgBox(contenu &amp;amp; vbCr &amp;amp; "Voulez vous modifier les fichiers ?", vbYesNo, "Fichiers paramétrés")

  If modifier = vbYes Then
    For i = 0 To 9
      If i &amp;gt; 0 Then encore = MsgBox("un autre ?", vbYesNo)
        quest:
      If encore &amp;lt;&amp;gt; vbNo Then
        PJ = InputBox("Emplacement du fichier joint au PUBLIPOSTAGE?", _
          "Paramétrage du PUBLIPOSTAGE pour la session", publipostagePJ(i))
      If "" = Dir(PJ, vbNormal) Then GoTo quest
        publipostagePJ(i) = PJ
      Else: Exit For
      End If
      Next i
  End If
  MsgBox "Votre publipostage doit comporter le terme :" &amp;amp; vbCr &amp;amp; "PUBLIIDEM" &amp;amp; vbCr &amp;amp; "dans le sujet." &amp;amp; vbCr &amp;amp; "Celui-ci sera retiré lors de l'envoi"

End Sub


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Charger les fichiers dans les courriers
&lt;/h3&gt;

&lt;p&gt;Ensuite, il nous faut insérer le second script qui récupèrera le courrier juste avant qu'il ne parte pour lui ajouter les pièces jointes précédemment définies.&lt;/p&gt;

&lt;p&gt;Pour cela, il faut se rendre dans le script &lt;code&gt;ThisOutlookSession&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0salpru9mf052ksjbw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0salpru9mf052ksjbw1.png" alt="Image montrant la position du script ThisOutlookSession"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puis ajouter le script suivant :&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

' Permet d'attacher une ou plusieurs pièces jointes à un courrier (même fichiers pour l'ensemble des destinataires)
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)


    Dim objFolder As Object
    Dim objFile As Object
    Dim DEST As Recipient
    Dim SMTPTO As String

    If Item.Class = olMail Then
        Dim objCurrentMessage As MailItem
        Set objCurrentMessage = Item
        ' Permet de vérifier que le sujet du courrier contient le terme "PUBLIIDEM"
        If UCase(objCurrentMessage.Subject) Like "*PUBLIIDEM*" Then
            On Error Resume Next
            Dim i As Long
            i = 0
            If publipostagePJ &amp;lt;&amp;gt; "" Then
                ' Permet d'ajouter la même pièce jointe à chacun de ses correspondants
                While publipostagePJ(i) &amp;lt;&amp;gt; "fin"
                    objCurrentMessage.Attachments.Add Source:=publipostagePJ(i)
                    i = i + 1
                Wend
            End If

            'On supprime le terme PUBLIIDEM du sujet et le courrier s'envoie avec l'ensemble des pièces jointes
            objCurrentMessage.Subject = Replace(objCurrentMessage.Subject, "PUBLIIDEM ", "")
        End If
        Set objCurrentMessage = Nothing
    End If
End Sub


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ce script est appelé juste avant l'envoi du courrier, regarde si l'objet contient le mot &lt;code&gt;PUBLIIDEM&lt;/code&gt; et ajoute les pièces jointes si c'est le cas puis retire le mot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilisation
&lt;/h2&gt;

&lt;p&gt;Maintenant qu'on a l'ensemble de nos scripts en place, il s'agit de bien les utiliser ! Pour cela, tu dois ouvrir Outlook (pense à le redémarrer après avoir ajouté un script) puis te rendre dans la section &lt;code&gt;Développeur&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Tu trouveras un bouton &lt;code&gt;Macros&lt;/code&gt;. En cliquant dessus, tu verras le script permettant d'ajouter les pièces jointes apparaitre.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc00fc2vosdnm2tl4z9vw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc00fc2vosdnm2tl4z9vw.png" alt="Image montrant le bouton pour ajouter les pièces jointes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En cliquant sur le script, tu auras une boîte de dialogue te demandant les documents à ajouter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yia4t1esesh1zwz99i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yia4t1esesh1zwz99i9.png" alt="Image montrant la boite de dialogue pour ajouter les chemins vers les fichiers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans cette boîte de dialogue, tu ne dois pas jouter le document directement mais le chemin vers ce dernier. Pour trouver ce dernier, il te suffit de te rendre à ton fichier via l'explorateur de fichier et de copier le chemin vers document à l'aider d'un clic droit. &lt;strong&gt;N'oublie pas d'enlever les guillemets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7qpe5xzywgzxfovxfj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7qpe5xzywgzxfovxfj3.png" alt="Image montrant comment copier le chemin d'accès d'un fichier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si le chemin ressemble à cela, il te faut lui retirer les guillemets !&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="gd"&gt;- "C:\Users\****\Downloads\Book1.xlsx"
&lt;/span&gt;&lt;span class="gi"&gt;+ C:\Users\****\Downloads\Book1.xlsx
&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ensuite, tu peux effectuer le publipostage normalement en pensant à inclure &lt;strong&gt;PUBLIIDEM&lt;/strong&gt; au début de l'objet de ton message ! Dès lors, l'ensemble des documents ajoutés seront insérés dans le courrier !&lt;/p&gt;

&lt;p&gt;Bon publipostage !&lt;/p&gt;

&lt;h3&gt;
  
  
  Tips
&lt;/h3&gt;

&lt;p&gt;Afin de vérifier que tout fonctionne bien et pour éviter d'envoyer des courriers, tu peux passer en mode hors-ligne depuis Outlook. Tu trouveras alors l'ensemble de tes courriers dans l'&lt;code&gt;Outbox&lt;/code&gt; où tu pourras vérifier la présence de la pièce jointe. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xq95y7nezt1b462gbbo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xq95y7nezt1b462gbbo.png" alt="Image montrant l'emplacement de l'icône pour travailler en hors-ligne"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;À droite de l'image, on a la présence de l'icône permettant de travailler en hors-ligne.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Barbapapazes/office-automation" rel="noopener noreferrer"&gt;Office Automation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Crédit
&lt;/h2&gt;

&lt;p&gt;Merci à &lt;a href="https://www.youtube.com/user/PatriciaAngellights" rel="noopener noreferrer"&gt;Patricia D&lt;/a&gt; pour ses vidéos et ses scripts qui ont permis la création de ce tutoriel&lt;/p&gt;

</description>
      <category>publipostage</category>
      <category>outlook</category>
      <category>office</category>
      <category>email</category>
    </item>
    <item>
      <title>Gestion des articles - Créer un blog avec Adonis</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sat, 21 Aug 2021 10:14:43 +0000</pubDate>
      <link>https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0</link>
      <guid>https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0</guid>
      <description>&lt;p&gt;Bonjour,&lt;/p&gt;

&lt;p&gt;Bienvenue dans ce tutoriel pour apprendre à utiliser le &lt;a href="https://adonisjs.com/"&gt;framework web Adonis&lt;/a&gt; ! Si tu souhaites en savoir plus sur Adonis en 1 coup œil, je t'invite à &lt;a href="https://adonisjs.com/adonisjs-at-a-glance"&gt;lire cette page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dans cette partie, on va voir ensemble comment créer un article, le lier à un utilisateur et afficher sur une page !&lt;/p&gt;

&lt;h2&gt;
  
  
  Rappel
&lt;/h2&gt;

&lt;p&gt;Ce tutoriel est la cinquième et dernière partie d'une série de tutoriels qui ont pour objectif de te faire découvrir Adonis au travers la création d'un blog.&lt;/p&gt;

&lt;p&gt;Pour lire la partie précédente, c'est par là &lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Tu trouveras aussi sur GiHub l'ensemble du &lt;a href="https://github.com/Barbapapazes/create-a-blog-using-adonis"&gt;code source du projet&lt;/a&gt; !&lt;/p&gt;

&lt;h3&gt;
  
  
  Sommaire
&lt;/h3&gt;

&lt;p&gt;Ce tutoriel est découpé en différente partie pour t'aider et pour éviter d'avoir des articles trop longs où l'on pourrait se perdre !&lt;/p&gt;

&lt;p&gt;Nous allons donc voir ensemble :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg"&gt;Objectifs et mise en route - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0"&gt;Gestion des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalement, tu auras un blog fonctionnel !&lt;/p&gt;

&lt;h2&gt;
  
  
  Gestion des articles
&lt;/h2&gt;

&lt;p&gt;Comme le chapitre précédent, nous allons faire ce chapitre sous la forme d'un exercice. Je vais t'indiquer les étapes à suivre, te donner des indications et des ressources qui peuvent t'aider pour aller au bout puis nous ferons la correction ensemble !&lt;/p&gt;

&lt;p&gt;Pour rappel, nous souhaitons réaliser une route &lt;code&gt;articles/create&lt;/code&gt; qui permet de créer un article. Une fois l'article enregistré, nous devons être redirigé sur la page de l'article. Aussi, nous souhaitons avoir un bouton sur les pages des articles qui permet d'éditer l'article. Une fois l'édition terminée, nous devons être redirigé vers l'article.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ce qu'il faut faire
&lt;/h3&gt;

&lt;p&gt;La liste suivante est l'ensemble des tâches ordonnées t'indiquant ce qu'il y a à faire pour arriver au bout de cette dernière partie :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mettre en place le middleware d'authentification

&lt;ul&gt;
&lt;li&gt;Il ne faut le placer que sur les routes qui ont besoin d'être protégées&lt;/li&gt;
&lt;li&gt;Un peu d'aide &lt;a href="https://docs.adonisjs.com/guides/controllers#applying-middleware"&gt;ici&lt;/a&gt; et &lt;a href="https://docs.adonisjs.com/guides/auth/middleware"&gt;là&lt;/a&gt; !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Créer les différentes méthodes de gestions des articles pour le &lt;code&gt;controller&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Il ne faut pas oublier de valider les données entrantes sur le serveur&lt;/li&gt;
&lt;li&gt;Il ne faut pas non plus oublier de gérer les erreurs&lt;/li&gt;
&lt;li&gt;Un indice &lt;a href="https://docs.adonisjs.com/guides/controllers#resourceful-routes-and-controllers"&gt;ici&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Créer les différentes vues pour la création et l'édition d'un article&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Gestion des articles
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Mise en place du middleware d'authentification
&lt;/h4&gt;

&lt;p&gt;Le middleware pour la gestion de l'authentification est fourni par Adonis. Ainsi, il nous suffit de l'ajouter sur les routes que l'on souhaite protéger par l'authentification.&lt;/p&gt;

&lt;p&gt;Pour cela, on se rend dans le fichier &lt;code&gt;routes.ts&lt;/code&gt; du dossier &lt;code&gt;start&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ArticlesController&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La route &lt;code&gt;create&lt;/code&gt; permet d'afficher le formulaire de création d'un article.&lt;/p&gt;

&lt;p&gt;La route &lt;code&gt;store&lt;/code&gt; permet de recevoir les informations de la route create pour stocker l'article dans la base de données.&lt;/p&gt;

&lt;p&gt;La route &lt;code&gt;edit&lt;/code&gt; permet d'afficher le formulaire de l'édition d'un article.&lt;/p&gt;

&lt;p&gt;La route &lt;code&gt;update&lt;/code&gt; permet de recevoir les informations de la route edit pour mettre à jour un article de la base de données.&lt;/p&gt;

&lt;p&gt;Ainsi, il est impossible d'accéder à l'une de ses quatres routes si l'utilisateur n'est pas authentifié.&lt;/p&gt;

&lt;h4&gt;
  
  
  Création du &lt;code&gt;validator&lt;/code&gt; pour les articles
&lt;/h4&gt;

&lt;p&gt;Encore une fois, utilisons la commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:validator article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans le validator, on va vouloir l'unicité des titres de nos articles comme on l'a indiqué dans notre migration. On va aussi spécifier la taille maximale du titre et du contenu. Ainsi, le &lt;code&gt;validator&lt;/code&gt; ressemble à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;public schema &lt;span class="o"&gt;=&lt;/span&gt; schema.create&lt;span class="o"&gt;({&lt;/span&gt;
  title: schema.string&lt;span class="o"&gt;({&lt;/span&gt; trim: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;
    rules.maxLength&lt;span class="o"&gt;(&lt;/span&gt;256&lt;span class="o"&gt;)&lt;/span&gt;,
    rules.unique&lt;span class="o"&gt;({&lt;/span&gt; table: &lt;span class="s1"&gt;'articles'&lt;/span&gt;, column: &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;,
  &lt;span class="o"&gt;])&lt;/span&gt;,
  content: schema.string&lt;span class="o"&gt;({&lt;/span&gt; trim: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;rules.maxLength&lt;span class="o"&gt;(&lt;/span&gt;1024&lt;span class="o"&gt;)])&lt;/span&gt;,
&lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on personnalise les messages erreurs et le tour est joué !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;public messages &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;'title.required'&lt;/span&gt;: &lt;span class="s1"&gt;'Le titre est requis'&lt;/span&gt;,
  &lt;span class="s1"&gt;'title.string'&lt;/span&gt;: &lt;span class="s1"&gt;'Le titre doit être une chaîne de caractères'&lt;/span&gt;,
  &lt;span class="s1"&gt;'title.maxLength'&lt;/span&gt;: &lt;span class="s1"&gt;'Le titre doit être moins de 256 caractères'&lt;/span&gt;,
  &lt;span class="s1"&gt;'title.unique'&lt;/span&gt;: &lt;span class="s1"&gt;'Le titre existe déjà'&lt;/span&gt;,
  &lt;span class="s1"&gt;'content.required'&lt;/span&gt;: &lt;span class="s1"&gt;'Le contenu est requis'&lt;/span&gt;,
  &lt;span class="s1"&gt;'content.string'&lt;/span&gt;: &lt;span class="s1"&gt;'Le contenu doit être une chaîne de caractères'&lt;/span&gt;,
  &lt;span class="s1"&gt;'content.maxLength'&lt;/span&gt;: &lt;span class="s1"&gt;'Le contenu doit être moins de 1024 caractères'&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/reference/validator/rules/unique"&gt;unique&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/validator/introduction"&gt;validator&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/validator/custom-messages"&gt;messages&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Création des méthodes du controller des articles
&lt;/h4&gt;

&lt;p&gt;On va donc devoir créer une méthode pour chacune de ses routes. Il est simple de s'y repérer puisque le nom de la méthode est le nom de la route.&lt;/p&gt;

&lt;p&gt;Pour &lt;code&gt;create&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles/create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rien de sorcier ici, on crée la page contenant le formulaire de création. Nous allons créer la vue dans la suite.&lt;/p&gt;

&lt;p&gt;Pour &lt;code&gt;store&lt;/code&gt;, on commence par récupérer les informations dont on a besoin pour créer l'article :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ArticleValidator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il est possible de récupérer l'utilisateur grâce au middleware précédemment ajouté. En effet, le middleware vérifie l'identité de la personne et l'ajoute dans nos &lt;code&gt;controllers&lt;/code&gt;. On récupère aussi les informations dont on a besoin, validées par le &lt;code&gt;validator&lt;/code&gt; ! &lt;/p&gt;

&lt;p&gt;Ensuite, on crée un article :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis on charge le owner avant de rendre la page d'un unique article à l'utilisateur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;owner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles/show&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour finir, la méthode ressemble à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ArticleValidator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;owner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles/show&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour &lt;code&gt;edit&lt;/code&gt;, nous allons aussi rendre une page d'édition de l'article. Cependant, avant cela, nous devons utiliser le paramètre présent dans l'url pour récupérer l'article et ajouter son contenu au formulaire afin que ce dernier soit prérempli ! Si le formulaire est vide, comment savoir ce qu'il faut mettre à jour ?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;errors/not-found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles/edit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En cas d'erreur pour trouver l'article, et comme on a pu faire sur &lt;code&gt;show&lt;/code&gt;, on renvoie l'utilisateur sur une page d'erreur ! Cela permet de gérer le cas où l'utilisateur rendre une mauvaise valeur directement dans l'url !&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Update&lt;/code&gt; est la méthode la plus complexe mais qui ne contient que  des éléments que l'on a pu déjà aborder. Dans un premier temps, on récupère l'article que l'on veut mettre à jour :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;errors/not-found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on extrait des données du formulaire en les passant dans le validator :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ArticleValidator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis on met à jour l'article et on le sauvegarde :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;
&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on charge l'utilisateur dans l'article et on le redirige vers la page de visualisation de son article :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;owner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles/show&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalement, la méthode complète ressemble à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;errors/not-found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ArticleValidator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;
  &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;owner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles/show&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant que tous nos &lt;code&gt;controllers&lt;/code&gt; sont faits, passons à nos 2 vues !&lt;/p&gt;

&lt;h4&gt;
  
  
  Création des vues pour la gestion des articles
&lt;/h4&gt;

&lt;p&gt;Les pages &lt;code&gt;create&lt;/code&gt; et &lt;code&gt;edit&lt;/code&gt; vont être très similaires. Elles vont toutes les 2 contenir un formulaire, vide pour la première et avec un article pour la seconde.&lt;/p&gt;

&lt;p&gt;Pour &lt;code&gt;create&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Créer un article&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"{{ route('ArticlesController.store') }}"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Titre de l'article&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"{{ flashMessages.get('title', '') }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      @if(flashMessages.has('errors.title'))
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;{{ flashMessages.get('errors.title') }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      @endif
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contenu de l'article&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"{{ flashMessages.get('content', '') }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
      @if(flashMessages.has('errors.content'))
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;{{ flashMessages.get('errors.content') }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      @endif
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Créer&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme pour le formulaire d'authentification, on remarque les &lt;code&gt;if&lt;/code&gt; qui permettent de conditionner l'affichage d'un message d'erreur par le serveur.&lt;/p&gt;

&lt;p&gt;Pour &lt;code&gt;edit&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Créer un article&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"{{ route('ArticlesController.update', {id: article.id}) }}?_method=put"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Titre de l'article&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"{{ flashMessages.get('title', article.title) }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      @if(flashMessages.has('errors.title'))
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;{{ flashMessages.get('errors.title') }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      @endif
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contenu de l'article&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ flashMessages.get('content', article.content) }}&lt;span class="nt"&gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
      @if(flashMessages.has('errors.content'))
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;{{ flashMessages.get('errors.content') }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      @endif
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Modifier&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il y a tout de même quelques subtilités dans ce formulaire. Tout d'avoir cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;flashMessages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cela permet d'afficher le contenu d'un message flash s'il existe, sinon, le contenu de l'article. Ainsi, lorsque la page est chargée, le message flash est vide donc le contenu de l'article va venir remplir le formulaire. Mais supposons que l'utilisateur modifie des informations mais que ces dernières soient rejetées par le &lt;code&gt;validator&lt;/code&gt;, alors il retrouvera dans son formulaire les données qu'il avait saisi et non les données initiales de l'article !&lt;/p&gt;

&lt;p&gt;Ensuite, pour mettre à jour un article, il est obligatoire d'utiliser les verbes &lt;code&gt;PUT&lt;/code&gt; ou &lt;code&gt;PATCH&lt;/code&gt;. Cependant, les navigateurs ne les prennent pas en compte. Ainsi, on utilise ce petit tricks pour que cela fonctionne :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"{{ route('ArticlesController.update', {id: article.id}) }}?_method=put"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.adonisjs.com/guides/request#form-method-spoofing"&gt;La documentation&lt;/a&gt; explique très bien cela ! Et pour que cela soit fonctionnel, il faut se rendre dans le fichier &lt;code&gt;app.ts&lt;/code&gt; présent dans &lt;code&gt;config&lt;/code&gt; et passer la clé &lt;code&gt;allowMethodSpoofing&lt;/code&gt; à &lt;code&gt;true&lt;/code&gt; !&lt;/p&gt;

&lt;p&gt;Et enfin, nous allons ajouter un lien de modification de l'article lorsque l'utilisateur est connecté dans la vue &lt;code&gt;show.edge&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@if(auth.isLoggedIn)
  &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{ route('ArticlesController.edit', {id: article.id}) }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Editer l'article&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
@endif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#static-create"&gt;create&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#save"&gt;save&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#load"&gt;load&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/request#form-method-spoofing"&gt;spoofing&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/auth/web-guard#isloggedin"&gt;isLoggedIn&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus
&lt;/h3&gt;

&lt;p&gt;La page &lt;code&gt;index.edge&lt;/code&gt; dans le dossier &lt;code&gt;resources/views&lt;/code&gt; ne nous sert pas. Alors on peut supprimer le fichier et dans nos routes, nous allons la rediriger vers nos articles comme cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si l'on se rend sur &lt;a href="http://localhost:3333/"&gt;http://localhost:3333/&lt;/a&gt;, on est alors redirigé vers &lt;a href="http://localhost/articles"&gt;http://localhost:3333/articles&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Sur notre page &lt;code&gt;index.edge&lt;/code&gt; dans le dossier &lt;code&gt;resources/views/articles&lt;/code&gt;, il est possible de mettre un bouton de création d'un article uniquement lorsque l'utilisateur est connecté ! En effet, même si la route est protégée, on ne souhaite pas que tous nos lecteurs voit un bouton de création d'articles alors que l'action n'est pas possible pour eux. Ajoutons cela à notre fichier :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{{ route('ArticlesController.create') }}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Créer&lt;/span&gt; &lt;span class="nx"&gt;un&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et voilà, le tour est joué. Le lien ne va apparait que lorsque l'utilisateur est connecté grâce à la condition !&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Et voilà pour cette cinquième et dernière partie. On a vu plus en détail la création et la gestion de pages protégées par un middleware.&lt;/p&gt;

&lt;p&gt;N'hésite pas à commenter si tu as des questions, si ça t'a plus ou même pour me faire des retours !&lt;/p&gt;

&lt;p&gt;Et tu peux aussi me retrouver sur &lt;a href="https://twitter.com/SOUBIRAN25"&gt;Twitter&lt;/a&gt; ou sur &lt;a href="https://www.linkedin.com/in/esteban25/"&gt;LinkedIn&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Notre blog est maintenant terminé ! J'espère que ça t'a plus. N'hésite pas à commenter pour me dire ce que tu as pensé de la série !&lt;/p&gt;

&lt;p&gt;À bientôt pour de nouveaux tutoriels !&lt;/p&gt;

&lt;h3&gt;
  
  
  Possibles évolutions
&lt;/h3&gt;

&lt;p&gt;Je n'allais quand même pas te laisser sans un peu de choses à faire. Voici une liste d'amélioration pour ce blog qui vont te permettre de progresser dans la maitrise du framework :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mettre en place un draft mode.

&lt;ul&gt;
&lt;li&gt;Pour cela, on peut ajouter une propriété à nos articles nommée &lt;code&gt;isPublished&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Si cette propriété est à false, alors l'article ne sera pas disponible pour les utilisateurs non authentifiés. On utilisera alors un filtre si l'utilisateur n'est pas login. Un peu d'aide &lt;a href="https://docs.adonisjs.com/guides/auth/web-guard#isloggedin"&gt;ici&lt;/a&gt; et &lt;a href="https://docs.adonisjs.com/reference/database/query-builder#where"&gt;là&lt;/a&gt; !&lt;/li&gt;
&lt;li&gt;Si la propriété est à true, alors l'article est visible.&lt;/li&gt;
&lt;li&gt;Lors de l'édition et de la création, on peut avoir la possibilité de changer cela via une checkbox.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Mettre des images aux articles

&lt;ul&gt;
&lt;li&gt;Pour cela, tu peux utiliser &lt;a href="https://docs.adonisjs.com/guides/file-uploads"&gt;cela&lt;/a&gt; !&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Ajouter du style à ton blog avec un peu de CSS

&lt;ul&gt;
&lt;li&gt;Je te conseille alors de te renseigner sur le &lt;a href="https://docs.adonisjs.com/guides/assets-manager"&gt;module de gestion des assets&lt;/a&gt; de Adonis&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;On peut créer une page de profil pour l'utilisateur connecté et lui permettre de voir l'ensemble des articles qu'il a écrit !

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.adonisjs.com/reference/orm/decorators#hasmany"&gt;Cela&lt;/a&gt; pourrait t'aider !&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Il est aussi possible de se dire que l'on peut créer une page où les utilisateurs peuvent se connecter et créer des articles, comme sur medium. Mais il ne faudrait alors pas&lt;/li&gt;
&lt;li&gt;Et pour les plus motivé, on peut même imaginer créer un blog

&lt;ul&gt;
&lt;li&gt;Les lecteurs entre un pseudo, un message et publie le commentaire&lt;/li&gt;
&lt;li&gt;On peut même imaginer que les lecteurs doivent se créer un compte !&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et voici un bon nombre d'idées pour améliorer le blog et pour te montrer que tu peux dorénavant faire beaucoup de choses sur le web ! Et je suis certains que ton imagination a encore pleins d'idées !&lt;/p&gt;

&lt;p&gt;Je peux aussi te conseil d'aller voir &lt;a href="https://github.com/adonisjs-community/polls-app"&gt;ce repo&lt;/a&gt; qui contient une application real-world et qui te montre comment faire et en plus, c'est par le créateur d'Adonis !&lt;/p&gt;

&lt;p&gt;Bye ! 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>adonisjs</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Création et visualisation des articles - Créer un blog avec Adonis</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sat, 21 Aug 2021 10:11:25 +0000</pubDate>
      <link>https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k</link>
      <guid>https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k</guid>
      <description>&lt;p&gt;Bonjour,&lt;/p&gt;

&lt;p&gt;Bienvenue dans ce tutoriel pour apprendre à utiliser le &lt;a href="https://adonisjs.com/"&gt;framework web Adonis&lt;/a&gt; ! Si tu souhaites en savoir plus sur Adonis en 1 coup œil, je t'invite à &lt;a href="https://adonisjs.com/adonisjs-at-a-glance"&gt;lire cette page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dans cette partie, on va voir ensemble comment créer un article, le lier à un utilisateur et l'afficher sur une page !&lt;/p&gt;

&lt;h2&gt;
  
  
  Rappel
&lt;/h2&gt;

&lt;p&gt;Ce tutoriel est la partie 4 d'une série de tutoriels qui ont pour objectif de te faire découvrir Adonis au travers la création d'un blog.&lt;/p&gt;

&lt;p&gt;Pour lire la partie précédente, c'est par là &lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Tu trouveras aussi sur GiHub l'ensemble du &lt;a href="https://github.com/Barbapapazes/create-a-blog-using-adonis"&gt;code source du projet&lt;/a&gt; !&lt;/p&gt;

&lt;h3&gt;
  
  
  Sommaire
&lt;/h3&gt;

&lt;p&gt;Ce tutoriel est découpé en différente partie pour t'aider et pour éviter d'avoir des articles trop longs où l'on pourrait se perdre !&lt;/p&gt;

&lt;p&gt;Nous allons donc voir ensemble :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg"&gt;Objectifs et mise en route - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0"&gt;Gestion des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalement, tu auras un blog fonctionnel !&lt;/p&gt;

&lt;h2&gt;
  
  
  Création et visualisation des articles
&lt;/h2&gt;

&lt;p&gt;On va faire ce chapitre sous la forme d'un petit exercice. En effet, on a, dans les parties précédentes notamment &lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1d67"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;, presque tout vu pour te permettre d'être autonome sur cette partie. Je vais t'expliquer ce qu'il faut faire, te donner quelques indices puis on corrigera pas à pas ensuite !&lt;/p&gt;

&lt;h3&gt;
  
  
  Ce qu'il faut faire
&lt;/h3&gt;

&lt;p&gt;La liste suivante est l'ensemble des tâches ordonnées t'indiquant ce qu'il y a à faire pour arriver au bout de cette partie :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Créer un modèle pour nos articles

&lt;ul&gt;
&lt;li&gt;Un article contient les propriétés suivantes :

&lt;ul&gt;
&lt;li&gt;un id&lt;/li&gt;
&lt;li&gt;un titre&lt;/li&gt;
&lt;li&gt;du contenu&lt;/li&gt;
&lt;li&gt;un propriétaire&lt;/li&gt;
&lt;li&gt;une date de création&lt;/li&gt;
&lt;li&gt;une date de mise à jour&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pour le propriétaire, on peut s'aider &lt;a href="https://docs.adonisjs.com/reference/orm/relations/belongs-to"&gt;de ce lien&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Créer une migration pour les articles

&lt;ul&gt;
&lt;li&gt;On fixera la limite du contenu à 1024 caractères&lt;/li&gt;
&lt;li&gt;On s'assurera du lien entre le propriétaire et la table des utilisateurs&lt;/li&gt;
&lt;li&gt;Aide &lt;a href="https://docs.adonisjs.com/reference/database/table-builder#string"&gt;ici&lt;/a&gt; et &lt;a href="https://docs.adonisjs.com/reference/database/table-builder#references"&gt;là&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Créer un seeder pour les articles et éviter de devoir les créer à la main lors de la phase de développement de l'application

&lt;ul&gt;
&lt;li&gt;Un peu d'explication à &lt;a href="https://docs.adonisjs.com/guides/database/seeders"&gt;cette adresse&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Créer la route permettant de visualiser un ensemble d'articles et la route permettant de visualiser 1 article

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /articles&lt;/code&gt;, pas d'authentification requise&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /articles/:id&lt;/code&gt;, pas d'authentification requise&lt;/li&gt;
&lt;li&gt;Aide &lt;a href="https://docs.adonisjs.com/guides/controllers#resourceful-routes-and-controllers"&gt;ici&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Créer le &lt;code&gt;controller&lt;/code&gt; et les vues en charge de la gestion de ses 2 routes

&lt;ul&gt;
&lt;li&gt;Dans le &lt;code&gt;controller&lt;/code&gt; de la première route, on ira chercher l'ensemble des articles présents en base de données en les paginant et on affichera le tout dans une vue. On s'assurera qu'ils soient ordonnés par date de création dans l'ordre décroissant !

&lt;ul&gt;
&lt;li&gt;Un peu de lecture &lt;a href="https://docs.adonisjs.com/reference/orm/query-builder"&gt;ici&lt;/a&gt; et &lt;a href="https://docs.adonisjs.com/reference/orm/query-builder#paginate"&gt;là&lt;/a&gt; !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dans le &lt;code&gt;controller&lt;/code&gt; de la seconde route, on ira chercher un article spécifique dépendant de l'id présent dans l'url, on y chargera l'utilisateur et on affichera le tout dans une vue

&lt;ul&gt;
&lt;li&gt;Un peu &lt;a href="https://docs.adonisjs.com/guides/routing#route-parameters"&gt;d'aide&lt;/a&gt; et d'autres lectures &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#load"&gt;ici&lt;/a&gt; et &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#static-findorfail"&gt;là&lt;/a&gt; !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Et voilà ! Si tu as réussi à faire tout ça, bravo ! Je t'invite à bien lire les différents liens, à chercher, à essayer et à te tromper ! &lt;/p&gt;

&lt;h3&gt;
  
  
  Création du modèle
&lt;/h3&gt;

&lt;p&gt;Pour le modèle, c'est assez simple. On commence par la commande pour créer un nouveau modèle :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:model article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on complète notre modèle avec les informations souhaitées :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DateTime&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;luxon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BelongsTo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;belongsTo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;column&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ioc:Adonis/Lucid/Orm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;BaseModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;isPrimary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;belongsTo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;localKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;foreignKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ownerId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BelongsTo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dateTime&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;autoCreate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DateTime&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dateTime&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;autoCreate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;autoUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DateTime&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La nouveauté concerne cette partie :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;belongsTo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;localKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;foreignKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ownerId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BelongsTo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On dit simplement ici qu'un article appartient à un utilisateur et que pour faire le lien, on utilise la clé &lt;code&gt;ownerId&lt;/code&gt; de l'article et la clé &lt;code&gt;id&lt;/code&gt; de l'utilisateur. Ensuite, cela ajoutera une propriété &lt;code&gt;owner&lt;/code&gt; à l'article du type &lt;code&gt;User&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/reference/orm/relations/belongs-to"&gt;belongsTo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création de la migration
&lt;/h3&gt;

&lt;p&gt;Pour la création de la migration, on va aussi utiliser une commande pour la générer :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:migration article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La migration ressemblera à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import BaseSchema from &lt;span class="s1"&gt;'@ioc:Adonis/Lucid/Schema'&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;default class Articles extends BaseSchema &lt;span class="o"&gt;{&lt;/span&gt;
  protected tableName &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'articles'&lt;/span&gt;

  public async up&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    this.schema.createTable&lt;span class="o"&gt;(&lt;/span&gt;this.tableName, &lt;span class="o"&gt;(&lt;/span&gt;table&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      table.increments&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      table.string&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.notNullable&lt;span class="o"&gt;()&lt;/span&gt;.unique&lt;span class="o"&gt;()&lt;/span&gt;
      table.string&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'content'&lt;/span&gt;, 1024&lt;span class="o"&gt;)&lt;/span&gt;.notNullable&lt;span class="o"&gt;()&lt;/span&gt;
      table.integer&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'owner_id'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.references&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.inTable&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

      table.timestamp&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'created_at'&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; useTz: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
      table.timestamp&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'updated_at'&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; useTz: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  public async down&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    this.schema.dropTable&lt;span class="o"&gt;(&lt;/span&gt;this.tableName&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On remarque la création d'une clé secondaire sur &lt;code&gt;owner_id&lt;/code&gt; en lien avec la table &lt;code&gt;users&lt;/code&gt;. Cela permet de mettre sous contrainte la base de données pour s'assurer que l'&lt;code&gt;id&lt;/code&gt; donné dans cette colonne soit effectivement existant dans la table des utilisateurs.&lt;/p&gt;

&lt;p&gt;Aussi, on met la colonne &lt;code&gt;title&lt;/code&gt; avec unique. Ainsi, on s'assure que tous les titres soient uniques directement dans les contraintes de la base de données.&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/reference/database/table-builder"&gt;Table&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création du seeder
&lt;/h3&gt;

&lt;p&gt;Afin d'avoir des données dans notre base de données et pour éviter de devoir les entrer à la main à chaque fois, nous allons les inscrire une fois dans un fichier puis faire tourner ce fichier afin qu'il rentre les données dans la base de données.&lt;/p&gt;

&lt;p&gt;Commençons par la commande suite :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:seeder article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans le dossier &lt;code&gt;database/seeders&lt;/code&gt;, tu trouveras notre seeder. Dans ce fichier, nous allons utiliser les méthodes de notre modèle pour insérer de la donnée dans la base de données. Nous allons aussi récupérer notre utilisateur pour le lier à nos articles.&lt;/p&gt;

&lt;p&gt;Dans un premier temps, on récupère notre utilisateur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstOrFail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on utilise la méthode &lt;code&gt;updateOrCreateMany&lt;/code&gt; qui permet de mettre à jour des articles dépendant d'une clé ou de les créer s'ils ne sont pas trouvés :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updateOrCreateMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uniqueKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans notre cas, le premier sera le titre puisqu'on a défini qu'il est unique selon la migration d'un article. Aussi, entre les crochets, on va y mettre l'ensemble des données que l'on va insérer ou mettre à jour. Finalement, notre fichier ressemble à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;BaseSeeder&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ioc:Adonis/Lucid/Seeder&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;App/Models/Article&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;App/Models/User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;ArticleSeeder&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;BaseSeeder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;developmentOnly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uniqueKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstOrFail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updateOrCreateMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uniqueKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Article 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nulla quis ipsum sed augue laoreet imperdiet. Fusce dapibus, lorem quis convallis fringilla, sem est maximus nulla, id egestas orci libero eget est. In maximus vestibulum nisi, dignissim aliquam orci dictum id.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Article 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Suspendisse est mi, ultrices sit amet ullamcorper sed, semper non ipsum. Vestibulum at nisl sed purus luctus sodales. Nunc lectus lorem, vehicula in dolor pharetra, pulvinar convallis libero. Maecenas iaculis porta nibh in hendrerit. Suspendisse gravida leo non orci facilisis placerat.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Article 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Curabitur vitae mi aliquam, pretium velit id, varius lacus. Duis id tellus nec eros semper elementum et et lectus. Phasellus eros justo, eleifend eget tellus quis, accumsan sollicitudin ex. &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Article 4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sed id eleifend lacus. Cras est diam, commodo et erat ac, elementum volutpat dolor. Donec auctor, lorem vitae luctus aliquet, mi mi rhoncus nunc, vel vestibulum felis justo sit amet felis. Donec eleifend rhoncus nisi id pretium. Morbi sit amet auctor enim, sit amet finibus velit. In hac habitasse platea dictumst.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Article 5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Morbi eget porttitor turpis. Fusce venenatis tortor lacus, eget interdum augue pellentesque id. Vestibulum elit lorem, gravida at elit vel, molestie suscipit mauris. &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Article 6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce congue nec tortor ut congue. Aenean a nunc nec felis sagittis auctor non a metus. Aenean euismod ligula eros, eu tempor turpis molestie sit amet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On remarque la clé &lt;code&gt;developmentOnly&lt;/code&gt; à &lt;code&gt;true&lt;/code&gt; qui permet de s'assurer que le seeder ne tourne qu'en développement. On ne souhaite pas de faux articles en production !&lt;/p&gt;

&lt;p&gt;Et pour insérer nos données, il nous faut utiliser la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace db:seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et voilà, nos données sont prêtes ! Pour les visualiser, tu peux te rendre dans pgAdmin sur la table des articles !&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/database/seeders"&gt;seeder&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#static-updateorcreatemany"&gt;updateOrCreateMany&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création des routes
&lt;/h3&gt;

&lt;p&gt;La création de la route tient en unique ligne :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ArticlesController&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La méthode &lt;code&gt;resource&lt;/code&gt; permet de générer l'ensemble des routes dont nous allons avoir besoin ! Ainsi, pas besoin de se casser la tête ! Ainsi, on s'assure de rester dans les conventions d'Adonis tout en restant concis mais efficace dans notre code. Je te conseille d'aller lire la documentation à ce sujet qui explique et illustre très bien l'objectif d'utiliser cette méthode.&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/controllers#resourceful-routes-and-controllers"&gt;resource&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création du &lt;code&gt;controller&lt;/code&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Récupération de l'ensemble des articles
&lt;/h4&gt;

&lt;p&gt;Pour cela, on va utiliser le query builder de Lucid. Ainsi, pour récupérer l'ensemble des articles de manière paginé et décroissant selon la date de création, la query ressemble à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bien sûr, il nous faudra pouvoir changer de page. Par conséquent, nous allons devoir récupérer une entrée utilisateur nommée &lt;code&gt;page&lt;/code&gt; comme cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalement, notre fonction &lt;code&gt;index&lt;/code&gt; ressemble à cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rendons-nous sur &lt;a href="http://localhost:3333/articles"&gt;cette adresse&lt;/a&gt;. On peut ainsi observer l'ensemble de nos articles. Mais je dois bien dire que ça n'est ni très beau, ni très pratique. Mais pas de panique, la création de la vue nous permettra d'exploiter l'ensemble de ses données pour tout bien afficher !&lt;/p&gt;

&lt;h4&gt;
  
  
  Récupération d'un unique article
&lt;/h4&gt;

&lt;p&gt;Pour faire cela, on commence par extraire notre &lt;code&gt;id&lt;/code&gt; des paramètres de l'url :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on effectue une simple recherche en demandant à la recherche d'échouer si l'article n'est pas trouvé. En effet, cela permet de s'assurer que l'article demandé existe et de contrôler la réponse à cet échec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sur la gestion de l'erreur, on va simplement afficher l'erreur dans la console pour le moment.&lt;/p&gt;

&lt;p&gt;Puis à la fin, on retourne l'article :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allons voir le résultat &lt;a href="http://localhost/articles/1"&gt;ici&lt;/a&gt; ! Ce n'est pas mal, mais on ne voie pas les informations de l'utilisateur alors qu'on avait indiqué un lien entre les 2 lors de la création de notre modèle.&lt;/p&gt;

&lt;p&gt;Pour lier les 2, il faut utiliser la méthode asynchrone &lt;code&gt;load&lt;/code&gt; après la récupération de l'article :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;owner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si l'on retourne observer le résultat, on voit bien apparaitre le propriétaire sous la clé &lt;code&gt;owner&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#load"&gt;load&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/reference/orm/base-model#static-findorfail"&gt;findOrFail&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création des vues
&lt;/h3&gt;

&lt;p&gt;Dans cette section, nous allons devoir créer la vue puis modifier nos &lt;code&gt;controllers&lt;/code&gt; pour qu'il génère la vue en fonction des données.&lt;/p&gt;

&lt;p&gt;Pour stocker l'ensemble de nos routes, nous allons commencer par créer un dossier nommé &lt;code&gt;articles&lt;/code&gt; dans &lt;code&gt;resources/views&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Visionnage de l'ensemble des articles
&lt;/h4&gt;

&lt;p&gt;Dans le dossier précédemment créer, ajoutons un fichier nommé &lt;code&gt;index.edge&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dedans, nous y trouverons cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Les articles&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Les articles&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
    @each(article in articles)
    &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{ route('ArticlesController.show', { id: article.id }) }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;
          {{ article.title }}
        &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
        {{ excerpt(article.content, 100) }}
      &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
    @endeach
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  @each(anchor in articles.getUrlsForRange(1, articles.lastPage))
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{ anchor.url }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ anchor.page }}
    &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  @endeach
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C'est un fichier le plus simple possible car nous ne nous concentrons pas sur le design du site mais sur ses fonctionnalités et la découverte d'Adonis.&lt;/p&gt;

&lt;p&gt;On trouve une boucle &lt;code&gt;@each&lt;/code&gt; qui permet d'itérer au travers l'ensemble des articles et de générer le code html correspondant. La fonction route permet de générer l'url de manière dynamique en fonction de son nom et d'un paramètre. Dans notre cas, la paramètre et l'&lt;code&gt;id&lt;/code&gt; de l'article. Il est possible de faire cela car l'&lt;code&gt;id&lt;/code&gt; d'un article est sa clé primaire qui est par définition unique.&lt;/p&gt;

&lt;p&gt;Dans le bas du fichier, on observe la fonction &lt;code&gt;getUrlsForRange&lt;/code&gt; qui permet d'obtenir ensemble des urls et son numéro entre 2 valeurs. Cela est très pratique pour générer la pagination de notre site.&lt;/p&gt;

&lt;p&gt;Il existe d'autres propriétés très utiles permettant de savoir si le lien est actif ou non, d'avoir le total des pages...&lt;/p&gt;

&lt;p&gt;Ensuite, dans notre &lt;code&gt;controller&lt;/code&gt;, nous devons indiquer que nous souhaitons rendre la page index des articles avec le paramètre &lt;code&gt;articles&lt;/code&gt;, qui représente l'ensemble des articles :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;public async index({ request, view }: HttpContextContract) {
&lt;/span&gt;    const page = request.input('page', 1)

    const articles = await Article.query().orderBy('created_at', 'desc').paginate(page, 3)

+    articles.baseUrl('/articles')
&lt;span class="gd"&gt;-    return articles
&lt;/span&gt;&lt;span class="gi"&gt;+    return view.render('articles/index', {
+      articles,
+    })
&lt;/span&gt;   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La fonction &lt;code&gt;baseUrl&lt;/code&gt; permet de s'assurer d'obtenir la bonne url sur la génération des urls dans le template lors de l'utilisation de &lt;code&gt;getUrlsForRange&lt;/code&gt; par exemple.&lt;/p&gt;

&lt;p&gt;Nous pouvons maintenant nous rendre &lt;a href="http://localhost:333/articles"&gt;ici&lt;/a&gt; pour admirer le résultat ! Il t'est possible de jouer avec la navigation en toute simplicité !&lt;/p&gt;

&lt;h4&gt;
  
  
  Visionnage d'un unique article
&lt;/h4&gt;

&lt;p&gt;Rien de sorcier ici. On commence par créer la vue, &lt;code&gt;show.edge&lt;/code&gt; dans le fichier &lt;code&gt;resources/views&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Document&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{ route('ArticlesController.index') }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Voir les articles&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;{{ article.title }}&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ article.content }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;par &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt; {{article.owner.pseudo}} &lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; le {{ article.createdAt.toLocaleString({ locale: 'fr-FR'}) }}, mis à jour le {{ article.updatedAt.toLocaleString({ locale: 'fr-FR'}) }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On retrouve en haut de la page, un lien permettant de retourner voir l'ensemble des articles. Dessous, on affiche l'article, son auteur et on adapte les dates à notre région !&lt;/p&gt;

&lt;p&gt;Dans le &lt;code&gt;controller&lt;/code&gt;, comme précédemment, on ajoute le fait de vouloir générer la route avec l'article que l'on a sorti de la base de données :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; public async show({ view, params }: HttpContextContract) {
   const { id } = params

   let article: Article
   try {
     article = await Article.findOrFail(id)
     await article.load('owner')
   } catch (error) {
     console.error(error)
&lt;span class="gi"&gt;+    return view.render('errors/not-found')
&lt;/span&gt;   }

-  return article
&lt;span class="gi"&gt;+  return view.render('articles/show', {
+     article,
+  })
&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aussi, on a ajouté la génération de la route &lt;code&gt;not-found&lt;/code&gt; si jamais on ne trouve pas l'article !&lt;/p&gt;

&lt;p&gt;En savoir plus : &lt;a href="https://docs.adonisjs.com/reference/views/tags/each#sidenav-open"&gt;each&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/reference/database/query-builder#geturlsforrange"&gt;getUrlsForRange&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/views/rendering#rendering-modes"&gt;render&lt;/a&gt;, ,&lt;a href="https://moment.github.io/luxon/api-docs/index.html#datetimetolocalestring"&gt;toLocalString&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Et voilà pour cette quatrième partie. On a vu plus en détail la création d'un modèle et de la manière dont on peut aller chercher des données dans la base de données. On a aussi vu comment lier nos données à nos pages.&lt;/p&gt;

&lt;p&gt;Dans la suite, on va créer les pages de création et d'édition de nos articles et les sécuriser grâce à un middleware !&lt;/p&gt;

&lt;p&gt;N'hésite pas à commenter si tu as des questions, si ça t'a plus ou même pour me faire des retours !&lt;/p&gt;

&lt;p&gt;Et tu peux aussi me retrouver sur &lt;a href="https://twitter.com/SOUBIRAN25"&gt;Twitter&lt;/a&gt; ou sur &lt;a href="https://www.linkedin.com/in/esteban25/"&gt;LinkedIn&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;On se donne rendez-vous ici, &lt;a href="https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-12jb"&gt;Gestion des articles - Créer un blog avec Adonis&lt;/a&gt; pour la suite du tutoriel et gérer nos articles !&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>adonisjs</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sat, 21 Aug 2021 10:11:15 +0000</pubDate>
      <link>https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8</link>
      <guid>https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8</guid>
      <description>&lt;p&gt;Bonjour,&lt;/p&gt;

&lt;p&gt;Bienvenue dans ce tutoriel pour apprendre à utiliser le &lt;a href="https://adonisjs.com/"&gt;framework web Adonis&lt;/a&gt; ! Si tu souhaites en savoir plus sur Adonis en 1 coup œil, je t'invite à &lt;a href="https://adonisjs.com/adonisjs-at-a-glance"&gt;lire cette page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dans cette partie, on va voir le système de routing, de &lt;code&gt;controller&lt;/code&gt; et un moyen pour authentifier l'utilisateur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rappel
&lt;/h2&gt;

&lt;p&gt;Ce tutoriel est la partie 3 d'une série de tutoriels qui ont pour objectif de te faire découvrir Adonis au travers la création d'un blog.&lt;/p&gt;

&lt;p&gt;Pour lire la partie précédente, c'est là &lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Tu trouveras aussi sur GiHub l'ensemble du &lt;a href="https://github.com/Barbapapazes/create-a-blog-using-adonis"&gt;code source du projet&lt;/a&gt; !&lt;/p&gt;

&lt;h3&gt;
  
  
  Sommaire
&lt;/h3&gt;

&lt;p&gt;Ce tutoriel est découpé en différente partie pour t'aider et pour éviter d'avoir des articles trop longs où l'on pourrait se perdre !&lt;/p&gt;

&lt;p&gt;Nous allons donc voir ensemble :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg"&gt;Objectifs et mise en route - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0"&gt;Gestion des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalement, tu auras un blog fonctionnel !&lt;/p&gt;

&lt;h2&gt;
  
  
  Création de l'authentification
&lt;/h2&gt;

&lt;p&gt;Nous allons voir ensemble comment créer une route avec Adonis puis l'ajout d'un &lt;code&gt;controller&lt;/code&gt; à cette dernière pour faciliter la gestion des fonctionnalités de notre application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Création d'une route
&lt;/h3&gt;

&lt;p&gt;Pour commencer à créer des routes, rendons-nous dans le fichier &lt;code&gt;start/routes.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dans un premier temps, on va créer la route permettant d'afficher à l'utilisateur le formulaire pour s'authentifier puis dans un second temps, on fera la route qui permet d'authentifier l'utilisateur.&lt;/p&gt;

&lt;p&gt;Dans notre fichier, on va commencer par créer la route &lt;code&gt;/login&lt;/code&gt; et s'assurer que tout fonctionne.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bienvenue sur la page de login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rends-toi à &lt;a href="http://localhost:3333/login"&gt;cette adresse&lt;/a&gt; et tu vas voir ce message dans ton navigateur ! N'oublie pas de démarrer le serveur !&lt;/p&gt;

&lt;p&gt;Super, mais comment on affiche de l'HTML à notre utilisateur ? Pour cela, on va utiliser le template engine edge. Nous allons donc créer une page puis demander au serveur de la générer puis de l'envoyer à l'utilisateur.&lt;/p&gt;

&lt;p&gt;Commençons par créer la vue :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;ace&lt;/span&gt; &lt;span class="nx"&gt;make&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un nouveau fichier vient alors de faire son apparition dans &lt;code&gt;ressources/views&lt;/code&gt;. Dans ce fichier, on va y créer un simple formulaire permettant à l'utilisateur de renseigner ses identifiants pour se connecter :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Login&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/login"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"pseudo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Votre pseudo&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"pseudo"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"pseudo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Votre password&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Se connecter&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L'action de ce formulaire nous indique que la requête sera sur &lt;code&gt;login&lt;/code&gt; et la méthode nous indique &lt;code&gt;POST&lt;/code&gt;. C'est donc comme cela que nous allons devoir définir nos routes !&lt;/p&gt;

&lt;p&gt;Ensuite, nous allons indiquer à notre route de rendre cette page puis de la renvoyer à l'utilisateur. Changeons un peu notre code dans le fichier &lt;code&gt;start/routes.ts&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rends-toi à &lt;a href="http://localhost:3333/login"&gt;cette adresse&lt;/a&gt; pour visualiser notre formulaire de connexion !&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/routing"&gt;Routing&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/controllers"&gt;Controllers&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/views/introduction"&gt;Edge&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentifier un utilisateur
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Installation du module
&lt;/h4&gt;

&lt;p&gt;Pour commencer à authentifier notre utilisateur, on va devoir installer et configurer un module :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @adonisjs/auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace configure @adonisjs/auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On indique que l'on souhaite utiliser Lucid pour trouver les utilisateurs. Ensuite, on va utiliser le web guard pour gérer l'authentification et enfin, on indique &lt;code&gt;User&lt;/code&gt; comme modèle pour l'authentification. Puis on indique ne pas vouloir créer une migration comme cela a déjà été fait dans la partie précédente.&lt;/p&gt;

&lt;p&gt;Dans le fichier &lt;code&gt;config/auth.ts&lt;/code&gt;, il faut changer l'uids qui est à &lt;code&gt;email&lt;/code&gt; par &lt;code&gt;pseudo&lt;/code&gt;. En effet, dans la migration de notre utilisateur, nous avons indiqué que le pseudo devait être unique. Cela va permettre de le récupérer en base de données lors de l'authentification.&lt;/p&gt;

&lt;h4&gt;
  
  
  Authentification
&lt;/h4&gt;

&lt;p&gt;Dans nos routes, nous allons créer une nouvelle route qui correspond à ce que l'on a mis dans le formulaire d'authentification.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Post sur login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans cette fonction, nous allons devoir récupérer de la requête le pseudo et le mot de passe provenant du formulaire. Puis, nous allons devoir authentifier l'utilisateur à l'aide de ses identifiants. Si les identifiants sont bons, alors on redirige l'utilisateur vers la page principale. Cependant, si les identifiants ne sont pas bons, alors on l'indique à l'utilisateur.&lt;/p&gt;

&lt;p&gt;On récupère les entrées de l'utilisateur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pseudo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pseudo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, nous essayons d'authentifier l'utilisateur. Dépendant du résultat, on redirige l'utilisateur sur &lt;code&gt;/&lt;/code&gt; ou il est renvoyé sur la page &lt;code&gt;login&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;back&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rends-toi à &lt;a href="http://localhost:3333/login"&gt;cette adresse&lt;/a&gt; pour tester ! Pour rappel, notre unique utilisateur a pour pseudo &lt;code&gt;demo&lt;/code&gt; et pour mot de passe &lt;code&gt;azerty&lt;/code&gt; ! Tout se passe bien et tu es redirigé sur la page d'accueil. Cependant, si tu commets une erreur délibérée sur le mot de passe, alors rien ne te signale ce qui ne vas pas. Pas pratique !&lt;/p&gt;

&lt;p&gt;Aussi, rien ne nous assure que les données entrées par l'utilisateur soient correctes. Ainsi, nous allons vérifier en amont ces données pour nous assurer de leur forme, type, format et intégrité.&lt;/p&gt;

&lt;p&gt;Aussi, nous aimerions prévenir l'utilisateur des raisons qui peuvent faire qu'il n'arrive pas à s'authentifier ! Et pour cela, on va utiliser les sessions.&lt;/p&gt;

&lt;p&gt;Et pour cela, nous allons utiliser un &lt;code&gt;Validator&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Validation des entrées
&lt;/h4&gt;

&lt;p&gt;Commençons par créer le validator :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:validator login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, nous allons définir dans ce dernier la structure et le format des données que l'on souhaite avoir :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pseudo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;]),&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On indique que l'on souhaite une chaine de caractères nommée &lt;code&gt;pseudo&lt;/code&gt; dont la valeur doit correspondre à une des entrées de la table &lt;code&gt;users&lt;/code&gt; de la colonne &lt;code&gt;pseudo&lt;/code&gt;. On indique que l'on souhaite une seconde chaine de caractères nommée &lt;code&gt;password&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Parfait, essayons à nouveau de nous connecter mais en omettant le pseudo ! On n'est pas authentifié mais rien n'a vraiment changé sur la page pour l'utilisateur ! Et c'est normal ! Il faut maintenant indiquer à notre &lt;code&gt;controller&lt;/code&gt; d'utiliser le &lt;code&gt;validator&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- const pseudo = request.input('pseudo')
- const password = request.input('password')
&lt;/span&gt;&lt;span class="p"&gt;---
&lt;/span&gt;&lt;span class="gi"&gt;+ import LoginValidator from 'App/Validators/LoginValidator'
&lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;
+ const { pseudo, password } = await request.validate(LoginValidator)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, nous allons devoir donner à l'utilisateur des indications en fonction des erreurs qu'il commet !&lt;/p&gt;

&lt;h4&gt;
  
  
  Flash messages
&lt;/h4&gt;

&lt;p&gt;Ce qui est pratique avec le &lt;code&gt;validator&lt;/code&gt;, c'est qu'il gère pour nous les messages d'erreurs. Cependant, nous allons devoir les afficher dans la vue. Pour cela, ouvrons le fichier &lt;code&gt;login.edge&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; &amp;lt;!DOCTYPE html&amp;gt;
 &amp;lt;html lang="en"&amp;gt;
 &amp;lt;head&amp;gt;
   &amp;lt;meta charset="UTF-8"&amp;gt;
   &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
   &amp;lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&amp;gt;
   &amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;
 &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
   &amp;lt;form action="/login" method="post"&amp;gt;
     &amp;lt;div&amp;gt;
       &amp;lt;label for="pseudo"&amp;gt;Votre pseudo&amp;lt;/label&amp;gt;
&lt;span class="gi"&gt;+      &amp;lt;input type="text" name="pseudo" id="pseudo" value="{{ flashMessages.get('pseudo') ?? '' }}"&amp;gt;
+      @if(flashMessages.has('errors.pseudo'))
+      &amp;lt;div&amp;gt;{{ flashMessages.get('errors.pseudo') }}&amp;lt;/div&amp;gt;
+      @endif
&lt;/span&gt;     &amp;lt;/div&amp;gt;
     &amp;lt;div&amp;gt;
       &amp;lt;label for="password"&amp;gt;Votre password&amp;lt;/label&amp;gt;
&lt;span class="gi"&gt;+      &amp;lt;input type="text" name="password" id="password" value="{{ flashMessages.get('password') ?? '' }}"&amp;gt;
+      @if(flashMessages.has('errors.password'))
+      &amp;lt;div&amp;gt;{{ flashMessages.get('errors.password') }}&amp;lt;/div&amp;gt;
+      @endif
&lt;/span&gt;     &amp;lt;/div&amp;gt;
     &amp;lt;button type="submit"&amp;gt;Se connecter&amp;lt;/button&amp;gt;
   &amp;lt;/form&amp;gt;
 &amp;lt;/body&amp;gt;
 &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, on ajoute à notre template une &lt;code&gt;div&lt;/code&gt; qui contient le message contenu dans la session via &lt;code&gt;flashMessages&lt;/code&gt;. Cependant, on ne souhaite faire cela que s'il y a un message à afficher, c'est pour cela qu'on entoure cette &lt;code&gt;div&lt;/code&gt; de la condition de présence d'une erreur.&lt;/p&gt;

&lt;p&gt;Aussi, on affecte à l'input sa précédente valeur. Cela permet de ne pas vider le formulaire en cas d'erreur de l'utilisateur lorsque nous le redirigeons via la méthode &lt;code&gt;back&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mais que faire en cas d'erreur dans l'authentification ? Pour cela, nous allons nous même enregistrer un message flash dans la fonction &lt;code&gt;store&lt;/code&gt; du &lt;code&gt;controller&lt;/code&gt; &lt;code&gt;login&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; try {
   await auth.attempt(pseudo, password)
   response.redirect('/')
 } catch (error) {
&lt;span class="gi"&gt;+  session.flash('auth', 'Authentication impossible')
&lt;/span&gt;   response.redirect().back()
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On crée un nouveau message nommé "auth" qui contient "Authentification impossible". &lt;/p&gt;

&lt;p&gt;Pour que l'utilisateur soit en mesure de le voir, il nous faut faire comme dans le fichier &lt;code&gt;login.edge&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; &amp;lt;button type="submit"&amp;gt;Se connecter&amp;lt;/button&amp;gt;
&lt;span class="gi"&gt;+@if(flashMessages.has('auth'))
+&amp;lt;div&amp;gt;{{ flashMessages.get('auth') }}&amp;lt;/div&amp;gt;
+@endif
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rends-toi à &lt;a href="http://localhost:3333"&gt;cette adresse&lt;/a&gt; pour essayer cela ! N'oublie pas de te tromper pour voir apparaitre les messages !&lt;/p&gt;

&lt;p&gt;On remarque cependant que les messages du &lt;code&gt;validator&lt;/code&gt; ne sont pas en français ! Pour les personnaliser, on peut se rendre dans le fichier &lt;code&gt;LoginValidator.ts&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pseudo.string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Le pseudo doit être une chaîne de caractères&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pseudo.required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Le pseudo est requis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pseudo.exists&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Le pseudo n'existe pas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password.string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Le mot de passe doit être une chaîne de caractères&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password.required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Le mot de passe est requis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les clés sont une correspondance avec la règle qui est appliquée et la vérification qui est effectuée. Retentons notre formulaire et voilà, les messages sont en français !&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/auth/introduction"&gt;Authentication&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/auth/web-guard"&gt;Web guard&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/validator/introduction"&gt;Validator&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/session#session-flash-messages"&gt;Flash&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/views/conditionals"&gt;Conditionals&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création des &lt;code&gt;controllers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Les fonctions qui se trouvent après le nom de nos routes dans le fichier &lt;code&gt;start/routes.ts&lt;/code&gt; est en réalité des &lt;code&gt;controllers&lt;/code&gt;. C'est à dire que ces fonctions vont gérer les requêtes des clients. Mais pour simplifier et faire que chaque fichier est son utilité, on préfère les extraire et les mettre dans un fichier à part.&lt;/p&gt;

&lt;p&gt;Commençons par créer un &lt;code&gt;controller&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;ace&lt;/span&gt; &lt;span class="nx"&gt;make&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, nous allons devoir migrer nos 2 fonctions dans ce &lt;code&gt;controller&lt;/code&gt; de la ressource &lt;code&gt;login&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour ce faire, commençons par éditer le fichier &lt;code&gt;LoginController.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dans une fonction nommée &lt;code&gt;create&lt;/code&gt;, nous allons y mettre la gestion de la vue et dans une fonction nommée &lt;code&gt;store&lt;/code&gt;, nous allons y mettre l'authentification de l'utilisateur. Le choix du nom de ces fonctions n'est pas au hasard et fait partie des conventions utilisées par Adonis, &lt;a href="https://docs.adonisjs.com/guides/controllers#resourceful-routes-and-controllers"&gt;plus de détails ici.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Gestion de la vue pour l'utilisateur&lt;/span&gt;
&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Gestion de l'authentification&lt;/span&gt;
&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HttpContextContract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LoginValidator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;web&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authentication impossible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;back&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, nous allons indiquer simplement dans notre fichier de gestion des routes, quel est le &lt;code&gt;controller&lt;/code&gt; qui gère la route. Pour cela, nous allons remplacer nos fonctions par une simple chaine de caractères.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LoginController.create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LoginController.store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette chaine de caractères indique le nom du &lt;code&gt;controller&lt;/code&gt; à utiliser &lt;code&gt;LoginController&lt;/code&gt; et la fonction à exécuter, &lt;code&gt;create&lt;/code&gt; dans le cas d'une requête de type &lt;code&gt;GET&lt;/code&gt; et &lt;code&gt;store&lt;/code&gt; dans le cas d'une requête &lt;code&gt;POST&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/controllers"&gt;Controllers&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Et voilà pour cette troisième partie. On a vu la création d'une route, de son &lt;code&gt;controller&lt;/code&gt; associé. On a aussi abordé les notions de vue et d'authentification de l'utilisateur.&lt;/p&gt;

&lt;p&gt;Dans la suite, on va commencer à modeler nos articles pour les visionner sur notre blog !&lt;/p&gt;

&lt;p&gt;N'hésite pas à commenter si tu as des questions, si ça t'a plus ou même pour me faire des retours !&lt;/p&gt;

&lt;p&gt;Et tu peux aussi me retrouver sur &lt;a href="https://twitter.com/SOUBIRAN25"&gt;Twitter&lt;/a&gt; ou sur &lt;a href="https://www.linkedin.com/in/esteban25/"&gt;LinkedIn&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;On se donne rendez-vous ici, &lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt; pour la suite du tutoriel et visualiser nos premier articles.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>adonisjs</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Création d'un utilisateur - Créer un blog avec Adonis</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sat, 21 Aug 2021 10:11:09 +0000</pubDate>
      <link>https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi</link>
      <guid>https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi</guid>
      <description>&lt;p&gt;Bonjour,&lt;/p&gt;

&lt;p&gt;Bienvenue dans ce tutoriel pour apprendre à utiliser le &lt;a href="https://adonisjs.com/"&gt;framework web Adonis&lt;/a&gt; ! Si tu souhaites en savoir plus sur Adonis en 1 coup œil, je t'invite à &lt;a href="https://adonisjs.com/adonisjs-at-a-glance"&gt;lire cette page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dans cette partie, on va voir ensemble comment créer un utilisateur dans la base de données !&lt;/p&gt;

&lt;h2&gt;
  
  
  Rappel
&lt;/h2&gt;

&lt;p&gt;Ce tutoriel est la partie 2 d'une série de tutoriels qui ont pour objectif de te faire découvrir Adonis au travers la création d'un blog.&lt;/p&gt;

&lt;p&gt;Pour lire la partie précédente, c'est là &lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-1b4m"&gt;Objectifs et mise en route - Créer un blog avec Adonis&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Tu trouveras aussi sur GiHub l'ensemble du &lt;a href="https://github.com/Barbapapazes/create-a-blog-using-adonis"&gt;code source du projet&lt;/a&gt; !&lt;/p&gt;

&lt;h3&gt;
  
  
  Sommaire
&lt;/h3&gt;

&lt;p&gt;Ce tutoriel est découpé en différentes parties pour t'aider et pour éviter d'avoir des articles trop longs où l'on pourrait se perdre !&lt;/p&gt;

&lt;p&gt;Nous allons donc voir ensemble :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg"&gt;Objectifs et mise en route - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0"&gt;Gestion des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalement, tu auras un blog fonctionnel !&lt;/p&gt;

&lt;h2&gt;
  
  
  Création d'un utilisateur
&lt;/h2&gt;

&lt;p&gt;Nous allons donc voir ensemble comment fonctionne les modèles et les migrations des différents éléments que nous allons devoir stocker. Pour cela, nous allons créer un utilisateur et le stocker manuellement dans la base de données. Par la suite, nous verrons comment interagir avec notre base de données.&lt;/p&gt;

&lt;p&gt;Un modèle est une structure de données, une empreinte, un moule pour savoir comment sont stockées les éléments en base de données. Une migration, dans notre cadre, est un fichier permettant de créer, modifier ou supprimer une table de la base de données.&lt;/p&gt;

&lt;p&gt;Avec le modèle, on indique dans le serveur à quoi ressemble notre donnée. Avec la migration, on dit à la base donnée comment sont les données qu'elle va recevoir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lucid pour la base de données
&lt;/h3&gt;

&lt;p&gt;Dans un premier temps, nous allons devoir installer notre système de gestion des modèles et des migrations :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @adonisjs/lucid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis le configurer :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace configure @adonisjs/lucid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lors de la configuration, tu dois choisir &lt;code&gt;PostgreSQL&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ensuite, tu dois valider les variables environnements, à placer à la suite des autres dans le fichier &lt;code&gt;Env.ts&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;PG_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;host&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="nx"&gt;PG_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="nx"&gt;PG_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="nx"&gt;PG_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="nx"&gt;PG_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis, il faut modifier le fichier &lt;code&gt;.env&lt;/code&gt; comme cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_CONNECTION=pg
PG_HOST=localhost
PG_PORT=5432
PG_USER=&amp;lt;votre utilisateur&amp;gt;
PG_PASSWORD=&amp;lt;votre mode de passe&amp;gt;
PG_DB_NAME=create-blog-using-adonis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et enfin, on termine cette initialisation de la base de données en se rendant dans pgAdmin pour créer une nouvelle base de données qui se nomme comme &lt;code&gt;create-blog-using-adonis&lt;/code&gt; et qui a pour utilisateur celui que tu as mis dans le précédent fichier.&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/database/introduction"&gt;Lucid&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/guides/environment-variables"&gt;Env&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notre premier modèle
&lt;/h3&gt;

&lt;p&gt;Rien de plus simple, commençons par exécuter cette commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:model user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un nouveau fichier nommé &lt;code&gt;User&lt;/code&gt; dans &lt;code&gt;app/Models/&lt;/code&gt; vient d'apparaitre. Ce fichier permet de savoir à quoi ressemble un utilisateur et de décrire ses propriétés. Pour le moment, il n'a qu'un id et une date de création et une date de mise à jour. Nous allons donc lui ajouter un pseudo et un mot de passe. Ces 2 éléments sont le minimum pour authentifier par la suite notre utilisateur. À la place d'un pseudo, il est possible d'utiliser une adresse électronique ou un numéro de téléphone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais le mot de passe ne peut pas rester comme cela ! On ne va pas le laisser en clair dans la base de données, il faut donc le hasher avant de le sauvegarder. Pour cela, on va commencer par installer un module pour hasher :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i phc-argon2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puis on l'importe :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Hash&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ioc:Adonis/Core/Hash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et enfin, on crée une fonction qui va s'exécuter avant chaque enregistrement d'un utilisateur si ce dernier contient un mot de passe qui a changé :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;beforeSave&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;hashPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$dirty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;N'oublie pas d'importer &lt;code&gt;beforeSave&lt;/code&gt; depuis &lt;code&gt;@ioc:Adonis/Lucid/Orm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;En savoir plus : &lt;a href="https://docs.adonisjs.com/guides/models/introduction"&gt;Models&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notre première migration
&lt;/h3&gt;

&lt;p&gt;Comme pour le modèle, il existe une commande pour créer les migrations :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node ace make:migration user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette dernière a créé un fichier dans &lt;code&gt;/database/migrations/&lt;/code&gt;. Dedans, on trouve les instructions pour construire la base de données. La migration est donc en lien avec le modèle qu'on a précédemment réalisé tout en ajoutant des contraintes pour s'assurer de l'intégrité de nos données.&lt;/p&gt;

&lt;p&gt;Ainsi nous allons ajouter cela :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pseudo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;notNullable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;notNullable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nous créons une colonne nommée &lt;code&gt;pseudo&lt;/code&gt; de type string qui ne peut être vide et dont l'ensemble des valeurs doivent être uniques. Ensuite, nous créons une seconde colonne nommée &lt;code&gt;password&lt;/code&gt; qui ne peut être vide. Pour chacune des colonnes, la limite est de 256 caractères. Il s'agit de la valeur par défaut que l'on peut facilement modifier.&lt;/p&gt;

&lt;p&gt;Et finalement, pour indiquer à la base de données de construire la table, il suffit d'une commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;ace&lt;/span&gt; &lt;span class="nx"&gt;migration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il est possible de voir le résultat en se rendant dans pgAdmin, notre base de données&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/database/migrations"&gt;Migrations&lt;/a&gt;, &lt;a href="https://docs.adonisjs.com/reference/database/schema-builder"&gt;Table&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Création manuelle d'un utilisateur
&lt;/h3&gt;

&lt;p&gt;Dans notre blog, l'utilisateur sera en mesure d'ajouter et de modifier les articles. C'est le propriétaire du blog. Pour éviter que n'importe qui s'inscrive, on ne fera pas de page d'enregistrement mais on va mettre à la main notre utilisateur dans la base de données. Dans le même temps, ça nous permettra de manipuler pgAdmin.&lt;/p&gt;

&lt;p&gt;Pour ce faire :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ouvir pgAdmin&lt;/li&gt;
&lt;li&gt;Dérouler les &lt;code&gt;databases&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dérouler les &lt;code&gt;schemas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dérouler les &lt;code&gt;tables&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tu vas y voir une table nommée &lt;code&gt;users&lt;/code&gt;. Pour voir ce qu'elle contient, il faut y faire un clic droit puis &lt;code&gt;View/Edit Data&lt;/code&gt;. En double cliquant sur les cases dans la section Data output, il est possible de les modifier, et c'est ce que nous allons faire !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dAsc56Ui--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tun2zyhj1jl3qdpjei4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dAsc56Ui--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tun2zyhj1jl3qdpjei4o.png" alt="Untitled"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour l'id, il n'y a rien à faire. Pour le pseudo, renseigner &lt;code&gt;demo&lt;/code&gt; et pour le mot de passe :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$argon2id$v=19$t=3,m=4096,p=1$jbuf9UBOe+tm7aSRmPJfDw$BlYS1AoDt+aCuPtMFu+e1gkVNX0Cyf09ByChjKFlzY8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il s'agit du mot &lt;em&gt;azerty&lt;/em&gt; haché avec le module vu précédemment. **En effet, comme on enregistre manuellement notre utilisateur, le mot de passe ne passera pas par la fonction que l'on a écrite dans notre modèle. Cependant, il faut tout de même mettre un hash car à la connexion, on vérifiera le hash présent en base de données contre le hash du mot donnés par la personne tentant de se connecter.&lt;/p&gt;

&lt;p&gt;Ensuite, il faut cliquer sur une autre cellule puis sur F6 pour enregistrer les données, ou le bouton à droite de la disquette dans le ruban.&lt;/p&gt;

&lt;p&gt;Et voilà, notre utilisateur est prêt à être utilisé.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Et voilà pour cette seconde partie. On a vu le principe de modèles et de migrations et comment accéder à notre base de données via pgAdmin.&lt;/p&gt;

&lt;p&gt;Dans la suite, on se servira de cet utilisateur pour l'authentifier et lui donner un accès à la création et la modification des articles.&lt;/p&gt;

&lt;p&gt;N'hésite pas à commenter si tu as des questions, si ça t'a plus ou même pour me faire des retours !&lt;/p&gt;

&lt;p&gt;Et tu peux aussi me retrouver sur &lt;a href="https://twitter.com/SOUBIRAN25"&gt;Twitter&lt;/a&gt; ou sur &lt;a href="https://www.linkedin.com/in/esteban25/"&gt;LinkedIn&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;On se donne rendez-vous ici, &lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-hh4"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt; pour la suite du tutoriel et authentifier notre utilisateur.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>adonisjs</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Objectifs et mise en route - Créer un blog avec Adonis</title>
      <dc:creator>Estéban</dc:creator>
      <pubDate>Sat, 21 Aug 2021 10:10:25 +0000</pubDate>
      <link>https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg</link>
      <guid>https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg</guid>
      <description>&lt;p&gt;Bonjour,&lt;/p&gt;

&lt;p&gt;Bienvenue dans ce tutoriel pour apprendre à utiliser le &lt;a href="https://adonisjs.com/" rel="noopener noreferrer"&gt;framework web Adonis&lt;/a&gt; ! Si tu souhaites en savoir plus sur Adonis en 1 coup œil, je t'invite à &lt;a href="https://adonisjs.com/adonisjs-at-a-glance" rel="noopener noreferrer"&gt;lire cette page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Présentation du projet
&lt;/h2&gt;

&lt;p&gt;Tu trouveras aussi sur GiHub l'ensemble du &lt;a href="https://github.com/Barbapapazes/create-a-blog-using-adonis" rel="noopener noreferrer"&gt;code source du projet&lt;/a&gt; si ça t'intéresse !&lt;/p&gt;

&lt;h3&gt;
  
  
  Objectifs
&lt;/h3&gt;

&lt;p&gt;Les objectifs de ce tutoriel sont multiples. Dans un premier temps, il va te permettre de &lt;strong&gt;mettre un premier pied dans l'utilisation d'Adonis&lt;/strong&gt;. Ensuite, on va créer ensemble, pas à pas, une &lt;strong&gt;application utile&lt;/strong&gt; avec des fonctionnalités similaires à ce que l'on peut retrouver sur d'autres web app sur internet ! Je vais aussi &lt;strong&gt;t'expliquer&lt;/strong&gt; les raisons qui nous poussent à utiliser telle ou telle fonctionnalité pour te rendre le plus &lt;strong&gt;autonome&lt;/strong&gt; sur le framework et te donner &lt;strong&gt;l'envie&lt;/strong&gt; de l'utiliser.&lt;/p&gt;

&lt;p&gt;Cependant, il ne sera pas utilisé de CSS durant l'ensemble du tutoriel. On se concentre sur l'apprentissage du framework ! On ne fera pas non plus de mise en production !&lt;/p&gt;

&lt;p&gt;Tout au long du tutoriel, tu trouveras différents liens t'amenant directement sur la ressource de la documentation Adonis ! Cette dernière est très bien faite et te donnera plus de détails ! Dans ce tutoriel, nous allons mettre en lien tous ces éléments pour construire notre blog et plus généralement pour construire un site !&lt;/p&gt;

&lt;p&gt;N'oublie pas que la doc est ta meilleure amie !&lt;/p&gt;

&lt;h3&gt;
  
  
  Prérequis
&lt;/h3&gt;

&lt;p&gt;Pour ce tutoriel, assez peu de prérequis sont nécessaires ! Tout de même, il faut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoir des bases en HTML et javascript et en SQL&lt;/li&gt;
&lt;li&gt;Avoir des bases dans le fonctionnement d'un serveur web&lt;/li&gt;
&lt;li&gt;Avoir Node, PostgreSQL, pgAdmin sur sa machine&lt;/li&gt;
&lt;li&gt;Avoir un éditeur de texte comme VSCode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En cas de doutes, je te partage ici un ensemble de ressources pour en savoir plus :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML" rel="noopener noreferrer"&gt;HTML: HyperText Markup Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/javascript" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/SQL" rel="noopener noreferrer"&gt;SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps/Client-Server_overview" rel="noopener noreferrer"&gt;Client-Server Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/" rel="noopener noreferrer"&gt;A wonderful way to learn, to understand and to create server-side website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Nodejs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sommaire
&lt;/h3&gt;

&lt;p&gt;Ce tutoriel est découpé en différente partie pour t'aider et pour éviter d'avoir des articles trop longs où l'on pourrait se perdre !&lt;/p&gt;

&lt;p&gt;Nous allons donc voir ensemble :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/objectifs-et-mise-en-route-creer-un-blog-avec-adonis-20lg"&gt;Objectifs et mise en route - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-de-l-authentification-pour-l-utilisateur-creer-un-blog-avec-adonis-4mm8"&gt;Création de l'authentification pour l'utilisateur - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/creation-et-visualisation-des-articles-creer-un-blog-avec-adonis-1d8k"&gt;Création et visualisation des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/barbapapazes/gestion-des-articles-creer-un-blog-avec-adonis-2fc0"&gt;Gestion des articles - Créer un blog avec Adonis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalement, tu auras un blog fonctionnel !&lt;/p&gt;

&lt;h3&gt;
  
  
  Cahier des charges
&lt;/h3&gt;

&lt;p&gt;Avant de commencer à programmer, on va créer ensemble le cahier des charges de cette superbe web application. Créer le cahier des charges en amont nous permettra, lorsqu'il faudra coder, d'avoir tout en tête, de savoir avec précision ce que nous sommes en train et de faire et pourquoi nous sommes en train de le faire ! Comme ça, quand on code, on code et on ne réfléchit plus à ce à quoi doit ressembler ou ce que doit faire notre web app !&lt;/p&gt;

&lt;p&gt;Nous allons créer un blog. C'est à dire une web application permettant à ses visiteurs de visualiser l'ensemble des articles du blog, d'y naviguer via une pagination et de les visualiser 1 à 1. Sur cette page de visualisation, on pourra lire l'article en entier et voir son auteur.&lt;/p&gt;

&lt;p&gt;L'auteur du blog sera un utilisateur présent en base de données. Il pourra s'authentifier auprès du site pour créer un article et éditer ses différents articles.&lt;/p&gt;

&lt;p&gt;D'un point de vue design, notre blog ne sera que de l'HTML. Aucun style ne sera appliqué.&lt;/p&gt;

&lt;p&gt;Ainsi, nous aurons les routes suivantes dans notre blog :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /&lt;/code&gt;, redirige vers &lt;code&gt;GET /articles&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /login&lt;/code&gt;, pour authentifier un utilisateur&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /login&lt;/code&gt;, pour avoir accès au formulaire d'authentification&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /articles&lt;/code&gt;, pour visualiser les articles&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /articles/:id&lt;/code&gt;, pour visualiser un article&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /articles&lt;/code&gt;, pour créer un article dans la base de données, accessible que pour les utilisateurs authentifiés&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /article/create&lt;/code&gt;, pour avoir accès à la page de création d'un article, accessible que pour les utilisateurs authentifiés&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PATCH /articles/:id&lt;/code&gt;, pour mettre à jour un article dans la base de données, accessible que pour les utilisateurs authentifiés&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /articles/edit&lt;/code&gt;, pour avoir accès à la page de modification d'un article, accessible que pour les utilisateurs authentifiés&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'ensemble des données envoyées au serveur seront vérifiées.&lt;/p&gt;

&lt;p&gt;D'un point de vue base de données, nous allons construire la chose suivante :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0eegqpmfi0ou1k77na9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0eegqpmfi0ou1k77na9.png" alt="drawSQL-export-2021-08-19_11_31"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il faut comprendre le trait, qui est en forme de fourche sur article comme : un utilisateur peut avoir plusieurs articles mais un article n'a qu'un utilisateur !&lt;/p&gt;

&lt;h2&gt;
  
  
  Mise en route du projet
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initialisation de l'application
&lt;/h3&gt;

&lt;p&gt;Pour commencer à coder, commençons par sortir un terminal, place-toi dans l'un de tes répertoires et exécute la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init adonis-ts-app@latest create-a-blog-using-adonis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette commande permet de créer rapidement un squelette d'une application Adonis ! Lorsque l'on te demande le choix du projet, il faut prendre &lt;code&gt;web&lt;/code&gt;. En ce qui concerne &lt;code&gt;eslint/prettier&lt;/code&gt;, je te conseille de répondre oui. Cela te permet de garder un style de code consistant. Pour &lt;code&gt;webpack encore&lt;/code&gt;, nous n'allons pas en avoir besoin donc tu peux répondre non.&lt;/p&gt;

&lt;p&gt;Cette configuration nous permettra de répondre à l'ensemble du cahier des charges en installant le template engine pour créer différentes vues. Nous installerons nous même d'autres modules par la suite !&lt;/p&gt;

&lt;p&gt;Une fois cela fait, tu peux te rendre dans le dossier et lancer la commande&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Qui lancera le serveur.&lt;/p&gt;

&lt;p&gt;Rendez-vous sur &lt;a href="http://localhost:3333" rel="noopener noreferrer"&gt;http://localhost:3333&lt;/a&gt; pour voir notre web app en action !&lt;/p&gt;

&lt;p&gt;Pour en savoir plus : &lt;a href="https://docs.adonisjs.com/guides/installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Et voilà pour cette première partie d'explication et de mise en route où l'on a vu ce qu'on allait faire. On a créé le cahier des charges et on a initialisé l'application !&lt;/p&gt;

&lt;p&gt;N'hésite pas à commenter si tu as des questions, si ça t'a plus ou même pour me faire des retours !&lt;/p&gt;

&lt;p&gt;Et tu peux aussi me retrouver sur &lt;a href="https://twitter.com/SOUBIRAN25" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; ou sur &lt;a href="https://www.linkedin.com/in/esteban25/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;On se donne rendez-vous ici, &lt;a href="https://dev.to/barbapapazes/creation-d-un-utilisateur-creer-un-blog-avec-adonis-1efi"&gt;Création d'un utilisateur - Créer un blog avec Adonis&lt;/a&gt;, pour la suite du tutoriel et créer notre premier utilisateur !&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>adonisjs</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
