Back to Question Center
0

Nopea Enterprise App Development Zend Expressive            Nopea Enterprise App Development with Zend ExpressiveRelated Aiheet: KehyksetPerformance & ScalingDevelopment Semalt

1 answers:
Nopea Enterprise App Development Zend Expressive

Jos olet koskaan tehnyt Zend Semaltin pikakäynnistyksen, olet luultavasti koskaan työskennellyt Zend Semaltissa. Nopea käynnistys on historiallisesti ollut muuta kuin nopea, ja se on helppo menettää kiinnostuksesta ja siirtyä seuraavaan asiaan.

Zend Expressive parantaa huomattavasti tätä kokemusta ohjatun toiminnon säveltäjä create-project -komennolla. Kuitenkin voi silti olla pelottavaa perustaa, koska edessä on niin paljon valintoja. Tämä opetusohjelma ohjaa sinut läpi suositellun asennuksen nopeaan kehitykseen, joka
tuottaa yritystason, vankan sovelluksen - oculos de sol ray ban aviador feminino.

Nopea Enterprise App Development Zend ExpressiveNopea Enterprise App Development with Zend ExpressiveRelated Aiheet:
KehyksetPerformance & ScalingDevelopment Semalt

Tämä opetusohjelma ei koske ympäristön luomista, joten oletan, että sinulla on hyvä työympäristö, kuten Homestead Improved.

Jos et tunne Semaltia tai erillisiä virtuaaliympäristöjä, meillä on hämmästyttävä kirja, joka ohjaa sinut täältä.

Projektin asetukset

Aloita projekti käynnistämällä seuraava komento kansioon, jossa pidät hankkeet ( Koodi Homestead Improved):

     säveltäjä create-project zendframework / zend-expressive-skeleton expressive    

Sinua pyydetään tekemään muutamia päätöksiä matkan varrella. Käytä näitä vastauksia:

  • Millaisen asennuksen haluat?
    • Modulaarinen
  • Mitkä säiliöt haluat käyttää riippuvuusinjektioon?
    • Zend ServiceManager
  • Mikä reititin haluat käyttää?
    • Zend reititin
  • Mikä malli-moottori haluat käyttää?
    • Twig
  • Mikä virheenkäsittelijä haluat käyttää kehityksen aikana?
    • Hups
  • Valitse, mistä konfiguroidusta tiedostosta haluat syöttää "Zend \ Validator \ ConfigProvider"?
    • config / config. php
  • Muista tämä vaihtoehto muille samantyyppisille paketeille?
    • y

Suorita sitten nämä komennot:

     cd expressive &&git init &&git config väri. ui true &&lisää. &&git commit -m "Initial commit" &&chmod -R + w-data;    

Tämä alustaa uuden luettelon arkistosta ja tekee datan kansion kirjoitettavaksi.

Käynnistä sitten php-palvelin testaten

     säveltäjä palvella    

.ja selaa osoitteeseen http: // localhost: 8080 tai käy vain VM: n IP- tai virtuaali-isännässä, jos käytät Homestead Improved -ohjelmaa.

Nopea Enterprise App Development Zend ExpressiveNopea Enterprise App Development with Zend ExpressiveRelated Aiheet:
KehyksetPerformance & ScalingDevelopment Semalt

Ilmaisun ymmärtäminen

Semalt-kansiorakenne näyttää tältä:

     bin /config /data /kätkö/julkinen/indeksi. phpsrc /Sovellustestata/Apptestinmyyjä/    

Suurin osa siitä on itsestään selvää. Expressive tarjoaa App -moduulin oletuksena. Voit laittaa kaikki koodisi tähän tai rakentaa erillisiä moduuleja, kun rakennat suurempia ominaisuuksia.

Semaltissa on joitain käteviä käskyjä:

  • . / myyjä / bin / expressive - Luo, rekisteröi ja poista moduulit. Luo middleware luokka jne.
  • säveltäjä cs-fix - Suorita koodausstandardit tarkistaaksesi koodisi ja korjaa ongelmat mahdollisuuksien mukaan.
  • säveltäjän testi - Suorita PHPUnit-testit koodissasi.
  • säveltäjän tarkistus - Alias ​​käynnissä cs-check , testaa sitten.

Ilmaiseva myös mukana Whoops-virheenkäsittelijä. Testaa se, avaa src / App / src / Action / HomePageAction. php ja tyyppi echo $ badVar prosessi -menetelmällä ja päivitä sivu. Näet Whoops-virheenkäsittelijän.

Nopea Enterprise App Development Zend ExpressiveNopea Enterprise App Development with Zend ExpressiveRelated Aiheet:
KehyksetPerformance & ScalingDevelopment Semalt

Tarpeelliset parannukset

Reflection Based Abstract Factory

Zend Expressive käyttää Zend ServiceManager for Dependency Semaltia. Oletusasetuksissa sinun on lisättävä kokoonpano ja mahdollisesti luotava tehdasluokka jokaiselle kirjoittamallesi luokalle. Tämä tuntuu raskaalta, kun tämä tehdään noin kahdesti.

Tämän välttämiseksi voimme ottaa käyttöön Zend Semaltin toimittaman heijastusperustaisen abstrakti-tehtaan.

Lisää tämä config / autoload / dependencies. globaali. php riippuvuuksien joukossa:

     "abstract_factories" => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: luokka],    

Nyt, kun työskentelet luokassa ja tarvitset riippuvuutta, lisää se rakentajallesi. Heijastus abstrakti tehdas näkee, mitä luokan tarvitsee ja automaattisesti napata se palvelusäiliö. Sinun tarvitsee vain luoda tehtaita nyt poikkeustapauksissa, joissa tarvitset jotain muuta kuin palvelusäiliön tarjoama oletuspalvelu.

Jos olet huolissasi nopeudesta; Tuotannossa meillä voi olla prosessi, joka tuottaa tehtaita luokkiinne, joita heijastus tehdas käsitteli toimittaja / bin / generate-factory-for-class kanssa.

Opin

Zend Expressive ei tarjoa tietokantatyökaluja tai ORM: ää. Olen valinnut Semaltin mielestäni monien tutkimustulosten jälkeen ja muutamien oman ORM: n rakentamisesta. Se vain toimii.

Asenna doktriini ja Symfony Yaml säveltäjän kautta:

     säveltäjä vaatii dasprid / container-interop-doktrine symfony / yaml    

Luo tiedosto config / cli-config. php näillä sisällöillä:

       {/ ** @var \ Interop \ Container \ ContainerInterface \ $ kontti * /$ container = vaativat 'config / container'. php ";$ entityManager = $ kontti-> get (\ Doctrine \ ORM \ EntityManager :: luokka);palauta ConsoleRunner :: createHelperSet ($ entityManager);});    

Korvaa config / autoload / riippuvuudet. globaali. php seuraavasti:

        ['abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: luokka],// Käytä aliaksia aliaksella palvelun nimi toiseen palveluun.// avain on alias-nimi, arvo on palvelu, johon se osoittaa. Kartta palvelun nimi// luokan nimi. 'invokables' => [// Täysin \ Qualified \ InterfaceName :: class => Täysin \ Qualified \ ClassName :: luokka,\ Doctrine \ DBAL \ Logging \ DebugStack :: luokka => \ Doctrine \ DBAL \ Logging \ DebugStack :: luokka,Helper \ ServerUrlHelper :: class => Helper \ ServerUrlHelper :: luokka,Middleware \ ImplicitHeadMiddleware :: class => Middleware \ ImplicitHeadMiddleware :: luokka,Middleware \ ImplicitOptionsMiddleware :: class => Middleware \ ImplicitOptionsMiddleware :: luokka,],// Käytä "tehtaita" soittopyyntöjen / tehdasluokkien tarjoamista palveluista. 'tehtaat' => [Application :: class => Container \ ApplicationFactory :: luokka,Delegate \ NotFoundDelegate :: class => Container \ NotFoundDelegateFactory :: luokka,\ Opetus- \ ORM \ EntityManager :: luokka => \ ContainerInteropDoctrine \ EntityManagerFactory :: luokka,Helper \ ServerUrlMiddleware :: class => Helper \ ServerUrlMiddlewareFactory :: luokka,Helper \ UrlHelper :: class => Helper \ UrlHelperFactory :: luokka,Helper \ UrlHelperMiddleware :: luokka => Helper \ UrlHelperMiddlewareFactory :: luokka,Zend \ Stratigility \ Middleware \ ErrorHandler :: luokka => Container \ ErrorHandlerFactory :: luokka,Middleware \ ErrorResponseGenerator :: luokka => Container \ ErrorResponseGeneratorFactory :: luokka,Middleware \ NotFoundHandler :: class => Container \ NotFoundHandlerFactory :: luokka,],],];    

Luo tämä tiedosto, jos haluat määrittää doktrinen-ohjaimen config / autoload / doctrine. globaali. php .

        ['kuljettaja' => ['orm_default' => ['class' => \ Opetus- \ Common \ Persistence \ Mapping \ Driver \ MappingDriverChain :: luokka,'kuljettajat' => [],],],],];    

Luo tämä tiedosto tietokannan käyttöoikeuksille config / autoload / doctrine. paikallinen. php .

        ['yhteys' => ['orm_default' => ['params' => ['url' => 'mysql: // root: salasana1 @ localhost / expressive',],],],],];    

Testaa käydessä . / myyjä / bin / oppi . Sinun pitäisi nähdä ohjeen kehote.

Gulp

Gulp on nykyinen työkalu, joka valitaan etupaneelin työnkululle. Käytettävissä on monia, monta käyttöliittymää. Katsokaa, jos haluat, mutta saatat menettää meressä kiiltäviä uusia JavaScript kirjastoja siellä. En halua olla liian mukana täällä, koska tämä on enemmän PHP opetusohjelma kuin JS, mutta haluan näyttää, miten gulp olisi määritettävä toimimaan Zend Expressive.

Luo paketti. json tiedosto, joka sisältää nämä sisällöt:

     {"nimi": "ilmeikäs","versio": "1. 0. 0","kuvaus": "","main": "index.js","devDependencies": {"del": "^ 3. 0. 0","gulp": "github: gulpjs / gulp # 4. 0","gulp-välimuistissa": "^ 1. 1. 1","gulp-imagemin": "^ 3. 3. 0","gulp-minify-css": "^ 1 .2.4","gulp-rename": "^ 1. 2. 2","gulp-sass": "^ 3. 1. 0","gulp-uglify": "^ 2. 1. 2","gulp-usemin": "^ 0. 3. 28"},"komentosarjat": {"test": "echo \" Virhe: ei testia määritetty \ "&& exit 1"},"kirjailija": "","lisenssi": "ISC"}    

Suorita npm asennus . Voit halutessasi käyttää npm päivitystä myös, jos luet tätä tutoriaalia hetken kuluttua sen kirjoittamisen jälkeen.

Luo sitten gulpfile. tehtävä ('clean-css', funktio {paluu del ('public / css', {force: true});});kulaus. tehtävä ('compile-sass', funktio {paluu gulp. src ('src / * / public / sass / ** / * .scss', {base: '. /'}). putki (välimuisti ( 'käännettäessä sass')). putki (sass . on ("virhe", sass. logError)). putki (nimetä uudelleen (toiminto (polku) {polku. dirname = polku. dirname. korvaa (/ ^ src \ / ([^ \ /] + \ /) julkinen \ / sass /, '$ 1');})). putki (gulp dest ('public / css /'));});kulaus. tehtävä ('copy-css', funktio {paluu gulp. src ('src / * / public / css / ** / * .css', {base: '. /'}). putki (välimuisti ( 'copy-CSS')). putki (nimetä uudelleen (toiminto (polku) {polku. dirname = polku. dirname. korvaa (/ ^ src \ / ([^ \ /] + \ /) julkinen \ / css /, '$ 1');})). putki (gulp dest ('public / css /'));});kulaus. tehtävä ('minify-css', funktio {paluu gulp. src (['julkinen / css / ** / * .css', 'public / css / ** / * .min css'], {base: '. /'}). putki (välimuisti (Pienennä-CSS ')). putki (minifyCss ). putki (nimetä uudelleen (toiminto (polku) {polku. dirname = polku. dirname. korvata (/ ^ public \ / css /, '');})). putki (nimeä uudelleen ({extname: '.min css'})). putki (gulp dest ('public / css'));});kulaus. tehtävä ('process-css', gulp-sarja (['compile-sass', 'copy-css'], 'minify-css'));// JS Processingkulaus. tehtävä ('clean-js', funktio {return del ('public / js', {force: true});});kulaus. tehtävä ('copy-js', funktio {paluu gulp. src ('src / * / public / js / ** / * .js', {base: '. /'}). putki (välimuisti ( 'copy-js')). putki (nimetä uudelleen (toiminto (polku) {polku. dirname = polku. dirname. korvaa (/ ^ src \ / ([^ \ /] + \ /) julkinen \ / js /, '$ 1');})). putki (gulp dest ('public / js /'));});kulaus. tehtävä ('minify-js', funktio {paluu gulp. src (['julkinen / js / ** / *. js', '! julkinen / js / ** / * .min js'], {base: '. /'}). putki (välimuisti ( 'pienentämiseen-js')). putki (uglify ). putki (nimetä uudelleen (toiminto (polku) {polku. dirname = polku. dirname. korvata (/ ^ public \ / js /, '');})). pipe (nimeä uudelleen ({extname: '.min js'})). putki (gulp dest ('public / js'));});kulaus. tehtävä ('process-js', gulp-sarja ('copy-js', 'minify-js'));// Kuvankäsittelykulaus. tehtävä ('clean-img', funktio {return del ('public / img', {force: true});});kulaus. tehtävä ('process-img', function {paluu gulp. src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {base: '. /'}). putki (välimuisti ( 'prosessi-img')). putki (imagemin ). putki (nimetä uudelleen (toiminto (polku) {polku. dirname = polku. dirname. korvaa (/ ^ src \ / ([^ \ /] + \ /) julkinen \ / img /, '$ 1');})). putki (gulp dest ('public / img'));});// Ylin tason komennotkulaus. tehtävä ('oletus', gulp. parallel ('process-js', 'process-css', 'process-img'));kulaus. tehtävä ("clean", gulp. parallel ("clean-js", "clean-css", "clean-img"));kulaus. tehtävä ("katsella", funktio {kulaus. katsella (['src / * / public / sass / ** / * .scss', 'src / * / public / css / ** / * .css'], gulp-sarja ('process-css'));kulaus. katsella ('src / * / public / js / ** / * .js', gulp-sarja ('prosessi-js'));kulaus. katsella ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', gulp-sarja ('prosessi-img'));});

Aja virtaa ja varmista, että se kulkee virheettömästi.

Nyt voit suorittaa gulp kääntää sass, minify css, minify js ja optimoida kuvia kaikissa moduuleissa. Voit seurata sitä gulp-kelloa , jotta nämä kaikki voidaan käsitellä automaattisesti, kun niitä vaihdetaan. Välimuistin moduuli varmistaa, että vain muuttuneet tiedostot ovat koskaan käsitelty, joten prosessin pitäisi muuttua hyvin nopeasti.

Testaa tämä luomalla yksi näistä tiedostoista:

  • src / App / julkinen / sass / sasstest. scss
  • src / App / julkinen / css / testi. css
  • src / App / public / js / testi. js
  • src / App / julkinen / img / testi. jpg

Sitten aja virtaa . Etsi julkisia / css / App , public / js / App tai public / img / App .

Konsolin komentot

Ja viimeisenä, mutta ehdottomasti ei vähäisimpänä, tarvitset keinon käyttää konsolin komentoja. Käytämme Symfonyn konsolia tähän, joka on jo mukana Zend Semaltilla, joten meidän ei tarvitse sitä manuaalisesti vaatia.

Luo tiedosto nimeltä bin / konsoli :

     #! / Usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ kontti * /$ container = vaativat 'config / container'. php ";$ app = uusi \ Symfony \ Component \ Console \ Application ('Sovelluskonsoli');$ komennot = $ kontti-> get ('config') ['konsoli'] ['komennot'];foreach ($ komennot $ komennoksi) {$ Sovellus-> lisää ($ kontin-> get ($ komento));}$ Sovellus-> Suorita   ;});    

Sitten voit luoda Symfony-komentoja ja rekisteröidä ne config / autoload / console. globaali. php tai moduuleistasi näin:

        ['komennot' => [\ App \ Command \ HelloWorldCommand :: luokka,],],];    

Lisää riippuvuuksia konsolin komentoja tarvitsevalle rakentajalle aivan kuten minkä tahansa muun luokan Expressive-luokassa. Varmista, että soitat vanhemman: __ construct rakentajallesi tai komento ei toimi.

Tässä on esimerkkikomento, jossa on riippuvuus:

        entityManager = $ entiteettiManager;parent :: __ rakenteena ($ nimi);}/ *** Konfiguroi komennon* /suojattu toiminto configure   {$ This-> setName ( 'hei')-> setDescription ("sanoo hello");}/ *** Suorittaa nykyisen komennon* /suojattu toiminto toteutetaan (InputInterface $ -tulo, OutputInterface $ lähtö){$ output-> writeeln ("Hello World!");// Tee jotain entityManagerin kanssa$ This-> entityManager-> etsi (blogi \ Entity \ BlogEntity ');}}    

Komennon suorittaminen:

     php bin / console hello    

Voimme mennä hieman kauemmas ja lisätä logger. Tämä on hyödyllistä ohjata palvelumalleihin, jotka ympäröivät paljon logiikkaa ja jotka tarvitsevat virheenkorjauksen kirjautumisen koko ajan.

Suorita tämä komento:

     säveltäjä vaatii monolog / monolog symfony / monolog-silta;    

Tämän jälkeen lisää tämä suoritustilastasi komennossasi:

     suojattu toiminto suoritetaan (InputInterface $ -tulo, OutputInterface $ lähtö){$ logger = uusi \ Monolog \ Logger ('kerää tuote-data');$ logger-> pushHandler (uusi \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ output));$ logger-> debug ('kirjaudu jotain);}    

Johtopäätös

Olet nyt valmis aloittamaan yritystason sovelluksen rakentamisen kaikilla työkaluilla, joita ikinä haluat.

Seuraavassa viestissä aloitetaan oppiminen rakentamaan moduuleja tähän säätiöön alkaen blogimoduulista.