Opetusohjelma: Kuinka kirjoittaa malleja Fluent-ohjelmalla

Tämä opetusohjelma näyttää sinulle kuinka toteuttaa yksinkertainen käyttäjämalli, tallentaa hänet tietokantaan, saada hänet takaisin tietokannasta ja siirtää hänet näkymään.

Löydät tämän opetusohjelman tuloksen githubista täältä

Tämä opetusohjelma on luonnollinen jatko Ohjeiden käyttämiselle. Voit joko mennä opetusohjelmaan ensin ja tulla takaisin myöhemmin tai olla kapinallisena, ohittaa se ja lukea read

Indeksi

1. Luo uusi projekti
2. Luo Xcode-projekti
3. Määritä projekti käyttämään SQLite-tietokantaa
4. Luo ensimmäinen mallisi
5. Asenna GET-reitti kaikkien käyttäjien luetteloimiseksi
6. Asyncin selittäminen
7. Mikä on F ..
8. Luo näkymä
9. Asenna POST-reitti käyttäjän tallentamiseksi
10. Minne mennä täältä

1. Luo uusi projekti

Käytämme edellä mainitun opetusohjelman tuloksia mallina uuden projektimme luomiseen:

höyry new projectName --template = höyryberliini / ensini-lehti-malli

2. Luo Xcode-projekti

Ennen kuin luot Xcode-projektin, meidän on lisättävä tietokantatoimittaja. Niitä on jokaisella tietokannalla. Mutta lämpimän lämpenemisen vuoksi käytämme muistitietokantaa. Siksi lisäämme Fluent-SQLiten riippuvuudeksi paketti.swift:

// swift-tools-version: 4.0
tuo pakettikuvaus
anna paketti = paketti (
  nimi: "projectName", // muutettu
  riippuvuudet: [
    .pakkaus (URL: "https://github.com/vapor/vapor.git", alk.: "3.0.0"),
    .pakkaus (URL: "https://github.com/vapor/leaf.git", alk.: "3.0.0-rc"),
   .pakkaus (URL: "https://github.com/vapor/fluent-sqlite.git", alk.: "3.0.0-rc") // lisätty
  ],
  kohteet: [
    .target (nimi: "App", riippuvuudet: ["Vapor", "Leaf", "FluentSQLite"]), // lisätty
    .target (nimi: "Suorita", riippuvuudet: ["App"]),
    .testTarget (nimi: "AppTests", riippuvuudet: ["App"]),
  ]
)

Nyt päätteessä juurihakemistossa projektiNimi / suorita:

höyrypäivitys -y

Riippuvuuden hakeminen voi viedä hiukan, Xcode-projektin luominen ja avaaminen sinulle. Kun olet valmis, sinulla pitäisi olla tällainen projektirakenne:

projektin nimi/
├── Paketti
├── Lähteet /
│ ├── Sovellus /
├── │ ├── sovellus
├── │ ├── boot.swift
│ │ ├── configure.swift
└── │ └── reitit
│ └── Suorita /
│ └── main.swift
├── Testit /
├── Resurssit /
├── Julkinen /
├── Riippuvuudet /
└── Tuotteet /
Jos näet virheen, joka sisältää CNIOOpenSSL: n, kun cmd + r puuttuu riippuvuus. Suorita vain hautua päivityshöyry ja luoda projekti uudelleen

3. Määritä projekti käyttämään SQLite-tietokantaa

Ensimmäinen askel on lisätä FluentSQLiteProvider configure.swift-sovellukseen:

tuo höyry
tuo lehti
Tuo FluentSQLite // lisätty
julkisen funcin määrittäminen (
  _ config: inout Config,
  _ env: inout ympäristö,
  _ palvelut: inout-palvelut
) heittää {
  // Rekisteröi reitit reitittimeen
  anna reititin = EngineRouter.default ()
  kokeile reittejä (reititin)
  palvelut.rekisteri (reititin, kuten: reititin. itse)
  anna leafProvider = LeafProvider ()
  kokeile palvelut.rekisteri (leafProvider)
  kokeile services.register (FluentSQLiteProvider ()) // lisätty
  config.prefer (LeafRenderer.self, puolesta: ViewRenderer.self)
}

Seuraavaksi aloitamme tietokantapalvelun, lisäämme siihen SQLiteDatabase-tietokannan ja rekisteröimme kyseisen tietokantapalvelun:

tuo höyry
tuo lehti
tuo FluentSQLite
julkisen funcin määrittäminen (
  _ config: inout Config,
  _ env: inout ympäristö,
  _ palvelut: inout-palvelut
) heittää {
  // Rekisteröi reitit reitittimeen
  anna reititin = EngineRouter.default ()
  kokeile reittejä (reititin)
  palvelut.rekisteri (reititin, kuten: reititin. itse)
  anna leafProvider = LeafProvider ()
  kokeile palvelut.rekisteri (leafProvider)
  kokeile services.register (FluentSQLiteProvider ())
  config.prefer (LeafRenderer.self, puolesta: ViewRenderer.self)
  var tietokannat = DatabasesConfig ()
  kokeile tietokannat.add (tietokanta: SQLiteDatabase (tallennustila: .muisti), muodossa: .sqlite)
  services.register (tietokannat)
}

Viimeinkin aloitamme ja rekisteröimme muutospalvelun, jota käytämme myöhemmin esitelläksesi mallimme tietokantaan. Lisää toistaiseksi seuraava:

tuo höyry
tuo lehti
tuo FluentSQLite
julkisen funcin määrittäminen (
  _ config: inout Config,
  _ env: inout ympäristö,
  _ palvelut: inout-palvelut
) heittää {
  // Rekisteröi reitit reitittimeen
  anna reititin = EngineRouter.default ()
  kokeile reittejä (reititin)
  palvelut.rekisteri (reititin, kuten: reititin. itse)
  anna leafProvider = LeafProvider ()
  kokeile palvelut.rekisteri (leafProvider)
  kokeile services.register (FluentSQLiteProvider ())
  config.prefer (LeafRenderer.self, puolesta: ViewRenderer.self)
  var tietokannat = DatabaseConfig ()
  kokeile tietokannat.add (tietokanta: SQLiteDatabase (tallennustila: .muisti), muodossa: .sqlite)
  services.register (tietokannat)
  var migrations = MigrationConfig ()
  services.register (migraatiot)
}

4. Luo ensimmäinen mallisi

Luo hakemisto Lähteet / Sovellus / ja nimeä se Mallit / ja luo uudessa hakemistossa uusi Swift-tiedosto nimeltä User.swift

HUOMAUTUS: Käytin päätelaitetta, joka suoritti mkdir Lähteet / Sovellus / Mallit / ja kosketa Lähteet / Sovellus / Mallit / Käyttäjä.swift

Saatat joutua luomaan Xcode-projektisi uudelleen höyry xcode -yllä, jotta Xcode näkee uuden hakemistosi.

Sisällytä malleihin / User.swift seuraava koodi:

tuo FluentSQLite
tuo höyry
viimeisen luokan käyttäjä: SQLiteModel {
  var id: Int?
  var käyttäjänimi: String
  init (id: Int? = nolla, käyttäjänimi: String) {
    oma.id = tunnus
    oma.käyttäjänimi = käyttäjänimi
  }
}
laajennus Käyttäjä: Sisältö {}
laajennus Käyttäjä: Siirto {}

Pidin sitä erittäin yksinkertaisena, jotta ymmärrämme mitä täällä tapahtuu. SQLiteModel-standardia noudattaen meidän on määritettävä valinnainen muuttuja nimeltä id, joka on tyyppi int. Se on valinnainen yksinkertaisesti siksi, että jos aloitamme uuden käyttäjän tallentaaksemme hänet tietokantaan, meidän ei tarvitse antaa hänelle tunnus siinä vaiheessa. Hän saa tunnuksen, jonka hän on tallettanut tietokantaan.

Sisällönmukaisuus mahdollistaa sen, että Käyttäjämme voi muuntaa esimerkiksi JSON: ksi Codable-sovelluksella, jos palauttaisimme hänet reitille. Tai niin, että hän voi muuntaa TemplateDataksi, jota käytetään Leaf-näkymässä. Ja johtuen Codableista, se tapahtuu automaattisesti. Siirtymisen vaatimustenmukaisuus on välttämätöntä, jotta Fluent voi käyttää Codable-ohjelmaa parhaan mahdollisen tietokantataulukkokaavion luomiseen ja jotta voimme lisätä sen siirtopalveluomme configure.swift -sovelluksessa:

tuo höyry
tuo lehti
tuo FluentSQLite
julkisen funcin määrittäminen (
  _ config: inout Config,
  _ env: inout ympäristö,
  _ palvelut: inout-palvelut
) heittää {
  // Rekisteröi reitit reitittimeen
  anna reititin = EngineRouter.default ()
  kokeile reittejä (reititin)
  palvelut.rekisteri (reititin, kuten: reititin. itse)
  anna leafProvider = LeafProvider ()
  kokeile palvelut.rekisteri (leafProvider)
  kokeile services.register (FluentSQLiteProvider ())
  config.prefer (LeafRenderer.self, puolesta: ViewRenderer.self)
  var tietokannat = DatabaseConfig ()
  kokeile tietokannat.add (tietokanta: SQLiteDatabase (tallennustila: .muisti), muodossa: .sqlite)
  services.register (tietokannat)
  var migrations = MigrationConfig ()
  migrations.add (malli: User.self, tietokanta: .sqlite)
  services.register (migraatiot)
}

Jos nyt cmd + r tai suoritetaan, kaiken pitäisi olla hienosti.

Huomaa: muista valita Suorita skeemana painikkeesi vieressä ennen sovelluksen ajamista

5. Asenna GET-reitti kaikkien käyttäjien luetteloimiseksi

Jolla meillä ei ole vielä käyttäjiä tietokannassamme, mutta luomme ja tallennamme käyttäjiä omalla lomakkeella. Joten siirry nyt osoitteeseen route.swift ja poista kaikki tiedostosta kaikki, jotta se lopulta näyttää tältä:

tuo höyry
tuo lehti
julkiset funktioreitit (_ reititin: reititin) heittää {
  // mitään täällä
}

Määritä noutoreitti URL-käyttäjiltä, ​​jotka noutavat kaikki käyttäjät tietokannasta, ja välitä ne näkymään:

tuo höyry
tuo lehti
julkiset funktioreitit (_ reititin: reititin) heittää {
  
  router.get ("käyttäjät") {req -> Future  in
    palauta User.query (päällä: req) .all (). flatMap {käyttäjät
      anna data = ["käyttäjäluettelo": käyttäjät]
      return yritä req.view (). render ("userview", data)
    }
  }
}

Vau. Täällä tapahtuu paljon. Mutta ei hätää, se on paljon yksinkertaisempi kuin miltä se näyttää, ja tunnet olosi hyväksi kun luet eteenpäin ja ymmärrät tämän mustan taian

VAPOR 3 on kaikki futuureista. Ja se johtuu luonteestaan ​​olla Async nyt.

6. Asyncin selittäminen

Otetaan esimerkki elämästä. Jos Vapor 2: ssa tyttöystävä käski poikaa ostaa hänelle pehmeän jään ja munkin. Hän meni jäävaunulle, tilasi jään ja odottaa, kunnes se on valmis. Sitten hän jatkaisi ja menisi donitsikauppaan, ostaisi yhden ja palaa takaisin tyttöystävänsä luokse molempien kanssa.

Vapor 3: lla se poika menisi jäävaunuun, tilata jään ja jään valmistumisen aikana hän menisi donitsikauppaan ja ostaisi donitsin. Hän palaa jäävaunuun, kun jää on valmis, saa sen ja menee takaisin tyttöystävänsä luokse molempien kanssa.

Höyry 2: Jäämääräys estää pojan estämästä, kunnes hän voi jatkaa.
Vapor 3: Poika toimii estämättä ja käyttää odotusaikaaan muihin tehtäviin.

7. Mikä on F ..

Ymmärretään mitä tapahtuu ja miksi. Käytämme käyttäjäluokkamme kyselyä tietokantaan. Ja voit lukea sen kuin suorittamalla kyselyn pyynnön takana. Ajattele pyyntöä poikana. Se, joka tekee työn meidän puolestamme. Työntekijä.

Okei, joten meillä ei ole joukkoa käyttäjiä, mutta tulevaisuus joukolle käyttäjiä: Future <[Users]>. Ja rehellisesti. Se siitä. Ja mitä tarkoitan tällä: siinä ei ole mitään hienoa tai erityistä. Se on yksinkertaisesti se. Se on vain Tulevan kääritty. Ainoa asia, josta välitämme, on se, kuinka äitien nimissä saamme tietomme tulevaisuudesta, jos haluamme työskennellä sen kanssa kuten olemme tottuneet

Siellä kartta tai flatMap tulee peliin.

Valitsemme kartan, jos puhelun runko antaa arvon, joka ei ole tulevaisuuden arvo.

someFuture.map {tiedot
  palautusarvo
}

Ja kutsumme flatMapiksi, jos ruumis palauttaa arvon tulevaisuudessa.

someFuture.flatMap {tiedot
  palauta tulevaisuuden 
}

On vain tämä yksinkertainen sääntö. Koska joudut palauttamaan jotain jokaisesta karttatoiminnosta, juuri se kertoo sinulle, käytetäänkö flatMapia tai karttaa. Sääntö on: Jos jokin on tulevaisuus, käytät flatMapia ja jos se on ”normaalia” tietoa, siis et ole tulevaisuuden käyttämä kartta.

Joten haluamme reitillämme käyttää joukkoa käyttäjiä siirtääksemme sen näkemyksemme mukaan. Tarvitsemme siis yhtä molemmista karttatoiminnoista. Ja koska palautamme renderöintitoiminto () palauttaa kaiken. Ja jos klikkaamme sitä + napsautamme sitä, niin näemme sen olevan Future , olemme oppineet: jos palautamme Future, käytä flatMap.

Ja se on kaikki mitä teemme täällä. Ei hätää, jos se tuntuu oudolta ja uudelta eikä ole niin intuitiivinen. Ja et tunne kuin tiedät milloin käyttää mitä ja miten. Sitä varten olen täällä (toivottavasti) . Seuraa oppaita ja kysy minulta tai Discord-yhteisöltä kaikenlaisia ​​kysymyksiä ja usko minua, että se napsauttaa! Rehellisesti, en ollut varma, että se napsauttaa minua, kunnes se tapahtui. Anna sille aikaa !

8. Luo näkymä

Resurssien / näkymien sisällä / poista kaikki sieltä löytyvät tiedostot (welcome.leaf ja whoami.leaf) ja luo uusi tiedosto nimeltä userview.leaf ja lisää:



  
     Malli </ title>
    <link href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel = "tyylitaulukko">
  </ Head>
  <body class = "container">
    <h1 class = "mt-3"> Käyttäjäluettelo </h1></pre><pre>    <form method = "POST" action = "/ users">
      <div class = "input-group">
        <input type = "text" name = "käyttäjänimi" class = "form-control">
          <div class = "input-group-append">
            <painike class = "btn btn-outline-Secondary" type = "lähetä">
              Luoda
            </ -Painike>
          </ Div>
      </ Div>
    </ Form></pre><pre>    #for (käyttäjäluettelossa oleva käyttäjä) {
      <p class = "mb-0">
        # (User.username)
      </ P>
    }
  </ Body>
</ Html></pre><p>Olen merkinnyt mielenkiintoiset asiat täällä. Lisään <link> -tunnisteeseen vain käynnistyksen, joka on css-kehys, joka tekee näkymästämme hieman mukavamman.</p><p><form> -tagin avulla määrittelemme, mitä tapahtuu, kun lähetämme lomakkeen, joka ampuu / käyttäjiä menetelmäviestiin. Toteutamme postitusreitin toisessa.</p><p><Input type = ”text” name = ”käyttäjänimi”> on syöttökenttämme uuden käyttäjänimen kirjoittamiseen ja tässä nimi = ”käyttäjänimi” on erittäin tärkeä, koska “käyttäjänimi” on avain mihin tekstiämme yhdistetään. Ymmärrät mitä tarkoitan, kun kirjoitamme postireittini.</p><p>#For () -silmukka on lehtikohtainen tunniste, jossa iteroimme aikaisemmin siirretyn käyttäjäluettelon kohdalla nimellä [”userlist”:…] ja #: llä (user.username) pääsemme esineisiimme aivan kuten nopeasti.</p><p>Jos nyt cmd + r tai suoritat projektin ja käynnistät sivustosi osoitteessa / käyttäjät, näet otsikon, syöttökentän ja painikkeen. Ja se on ihan hyvin. Käyttäjäluettelo tulee näkyviin heti, kun olemme luoneet joitain. Tehdään se !</p><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568900870836.png" /><h4>9. Asenna POST-reitti käyttäjän tallentamiseksi</h4><p>Lisää reitteihimme.swift seuraava koodi:</p><pre>tuo höyry
tuo lehti</pre><pre>julkiset funktioreitit (_ reititin: reititin) heittää {</pre><pre>  router.get ("käyttäjät") {req -> Future <View> in
    ...
  }</pre><pre>  router.post ("käyttäjät") {req -> Future <Response> in
    palauta kokeile req.content.decode (User.self) .flatMap {user in
      palauta user.save (päällä: req) .map {_ sisään
        palauta req.redirect (käyttäjälle: "käyttäjät")
      }
    }
  }
}</pre><p>Kun lähetämme lomakkeen näkymässä napsauttamalla lähetä-painiketta, se lähettää syöttökentän tiedot -lomake-url-koodattuna / käyttäjien reitille viestinä, kuten:</p><pre>käyttäjänimi = MartinLasek</pre><p>Koska käyttäjämallimme koostuu vain yhdestä ominaisuuden käyttäjänimesta ja on protokollan sisällön mukainen, pystymme purkamaan lomakkeen lähettämän sisällön käyttäjän ilmentymään. Voit kokeilla mitä tapahtuu, jos lisäät käyttäjäluokkaan toisen ominaisuuden, kuten ikätyypin Int, suorita projekti uudelleen ja yritä lähettää lomake uudelleen. Se kertoo, että se ei löytänyt polkua ikäisenä int. Koska lomakkeemme ei lähetä ikää = 23 käyttäjänimen mukana.</p><p>Koska dekoodaus palauttaa käyttäjän esiintymän tulevaisuuden, joudumme kuitenkin käyttämään yhtä kartta / flatMap-toimintoista pääsyä siihen. Nyt pieni sivuhuomautus. Molemmat toiminnot kokonaisuutena johtavat tulevaisuuteen. En puhu näiden toimintojen joukosta. Puhun koko puhelusta. Se on tärkeä, koska se selittää miksi kutsumme flatMap-koodia dekoodaukseen.</p><p>FlatMapia käytetään jälleen, kun vartalo antaa meille tulevaisuuden. Ja olemme juuri oppineet, että flatMap ja kartta kokonaisuutena johtavat aina tulevaisuuteen. Voit nähdä, että palautamme user.save (on: req) .map {…} nyt, koska tämä kokonaisuutena johtaa tulevaisuuteen, jonka tiedämme, että meidän on käytettävä flatMapia etukäteen.</p><p>Seuraava on helppo, koska uudelleenohjaus ei palauta tulevaisuutta, joten käytämme karttaa täällä front</p><blockquote>Tulevaisuuden arvon käyttämiseksi tarvitset joko karttaa tai flatMapia. Jos palautusarvo karttatoiminnon sisällä ei ole tulevaisuus, käytät karttaa muuten flatMap.</blockquote><p>Jos nyt cmd + r tai suoritat projektisi ja käynnistää sivustosi selaimessa, voit luoda uusia käyttäjiä ja nähdä kasvavan luettelon tekeessäsi </p><blockquote>HUOMAUTUS: Koska käytämme muistitietokantaa, kaikki tiedot katoavat uudelleen suorittamisen jälkeen </blockquote><h4>10. Minne mennä täältä</h4><p>Löydät luettelon kaikista Githubin esimerkkihankkeita koskevista oppaista täältä:<br /> https://github.com/vaporberlin/vaporschool</p><h4>Olen todella onnellinen, että luit artikkelini! Jos sinulla on ehdotuksia tai parannuksia, ota meihin yhteyttä! Haluaisin kuulla sinusta! </h4><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568900871725.png" /><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568900872652.png" /><img alt="Twitter / Github / Instagram" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568900873384.png" /></div><div class="neighbor-articles"><h4 class="ui header">Katso myös</h4><a href="/article/step-by-step-how-to-realize-your-dream-3b8c51/" title="Vaihe vaiheelta kuinka toteuttaa unelma">Vaihe vaiheelta kuinka toteuttaa unelma</a><a href="/article/how-to-submit-for-the-heart-of-quran-publication-5c3400/" title="Kuinka lähettää Koraanin sydämelle -julkaisu">Kuinka lähettää Koraanin sydämelle -julkaisu</a><a href="/article/seo-for-franchises-how-to-triumph-in-the-world-wide-web-efdab9/" title="SEO franchising-palveluille. Kuinka voitto Internetissä.">SEO franchising-palveluille. Kuinka voitto Internetissä.</a><a href="/article/how-to-properly-navigate-the-world-on-your-journey-to-self-actualization-e7bab3/" title="Kuinka liikkua maailmassa matkalla itseaktivointiin">Kuinka liikkua maailmassa matkalla itseaktivointiin</a><a href="/article/how-to-choose-a-contact-management-software-for-your-startup-ec0212/" title="Kuinka valita yhteystietojen hallintaohjelmisto käynnistykseesi">Kuinka valita yhteystietojen hallintaohjelmisto käynnistykseesi</a></div></main><div class="push"></div></div><footer style="height:50px">ceadesc.org<!-- --> © <!-- -->2019<!-- --> <a href="https://fr.ceadesc.org/article/tutorial-how-to-write-models-using-fluent-ae42fd" title="https://ceadesc.org">ceadesc.org</a></footer></div></div></div><script src="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js"></script><script>
                  window.cookieconsent.initialise({
                    "palette": {
                      "popup": {
                        "background": "#eaf7f7",
                        "text": "#5c7291"
                      },
                      "button": {
                        "background": "#56cbdb",
                        "text": "#ffffff"
                      }
                    },
                    "showLink": false
                  });
              </script><script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><script>
                (adsbygoogle = window.adsbygoogle || []).push({
                  google_ad_client: "ca-pub-3845662922897763",
                  enable_page_level_ads: true
                });
              </script></body></html>