Back to Question Center
0

Rapid Enterprise App Development med Zend Expressive            Rapid Enterprise App Development med Zend ExpressiveRelated Topics: RamarPerformance & ScalingDevelopment Semalt

1 answers:
Rapid Enterprise App Development med Zend Expressive

Om du någonsin har gjort en Zend Semalt snabbstart har du nog aldrig jobbat i Zend Semalt. Snabbstart har historiskt varit allt annat än snabb, och det är lätt att förlora intresse och gå vidare till nästa sak.

Zend Expressive förbättras starkt med den här erfarenheten med det guiden drivna kompositörskapet-projektet -kommandot. Det kan dock fortfarande vara skrämmande att sätta upp eftersom det finns så många val att göra på framsidan - aerateur silent 200 chz. Denna handledning guidar dig genom min rekommenderade inställning för snabb utveckling som kommer
ger en företagsnivå, robust applikation.

Rapid Enterprise App Development med Zend ExpressiveRapid Enterprise App Development med Zend ExpressiveRelated Topics:
RamarPerformance & ScalingDevelopment Semalt

Denna handledning handlar inte om att ställa in din miljö, så jag antar att du har en bra arbetsmiljö som Homestead Improved.

Om du inte är bekant med Semalt eller isolerade virtuella miljöer, har vi en fantastisk bok som guidar dig genom de tillgängliga koncepten i vår butik här.

Projektinställningar

Starta ditt projekt genom att springa följande kommando i den mapp där du behåller dina projekt Kod på ​​Homestead Improved):

  kompositör skapa-projekt zendframework / zend-expressive-skelett expressiv   

Du kommer att bli uppmanad att fatta några beslut längs vägen. Använd dessa svar:

  • Vilken typ av installation skulle du vilja ha?
    • Modulär
  • Vilken behållare vill du använda för beroendet?
    • Zend ServiceManager
  • Vilken router vill du använda?
    • Zend Router
  • Vilken mallmaskin vill du använda?
    • Twig
  • Vilken felhanterare vill du använda under utveckling?
    • Whoops
  • Var god välj vilken konfigurationsfil du vill injicera 'Zend \ Validator \ ConfigProvider' i?
    • config / config. php
  • Kom ihåg det här alternativet för andra paket av samma typ?
    • y

Kör sedan följande kommandon:

  cd expressiv &&git init &&git config-färg. ui sant &&git lägg till. &&git commit -m "Initial commit" &&chmod-R + w-data;   

Detta initierar ett förråd i den nyskapade mappen och gör data mappen skrivbar.

Starta sedan en php-server för testning med

  kompositör tjänar   

.och bläddra till http: // localhost: 8080 eller besök bara VM: s IP eller virtuella värd om du använder Homestead Improved.

Rapid Enterprise App Development med Zend ExpressiveRapid Enterprise App Development med Zend ExpressiveRelated Topics:
RamarPerformance & ScalingDevelopment Semalt

Förståelse för uttrycksfulla

Semalt mappstruktur ser så här ut:

    behållare /config /data/cache /offentlig/index. phpsrc /Apptesta/AppTestSäljare/   

Det mesta av det är självförklarande. Expressive tillhandahåller en App modul som standard. Du kan lägga in all din kod här, eller bygga separata moduler när du bygger större funktioner.

Semalt kommer med några praktiska kommandon:

  • . / leverantör / bin / expressive - Skapa, registrera och avregistrera moduler. Skapa en middleware-klass osv.
  • kompositör cs-fix - Utför en kodningsstandard kontrollera din kod och lösa problem, där det är möjligt.
  • kompositortest - Kör PHPUnit-tester på din kod.
  • kompositorkontroll - Alias ​​för körning cs-check , sedan test.

Expressive kommer också med Whoops-felhanteraren. För att testa det, öppna src / App / src / Action / HomePageAction. php och typ echo $ badVar i process -metoden, uppdatera sedan sidan. Du kommer att se Whoops-felhanteraren.

Rapid Enterprise App Development med Zend ExpressiveRapid Enterprise App Development med Zend ExpressiveRelated Topics:
RamarPerformance & ScalingDevelopment Semalt

Nödvändiga förbättringar

Reflektionsbaserad abstrakt fabrik

Zend Expressive använder Zend ServiceManager for Dependency Semalt. I standardinställningen måste du lägga till konfiguration och eventuellt skapa en fabriksklass för varje enskild klass du skriver. Detta känns tungt efter att ha gjort det ungefär två gånger.

För att undvika detta kommer vi att möjliggöra den reflektionsbaserade abstrakta fabriken som levereras med Zend Semalt.

Lägg till detta till config / autoload / beroenden. global. php inom beroenden :

  'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: klass],   

När du arbetar i en klass och behöver ett beroende, lägg bara till det på din konstruktör. Den reflexionsabstracta fabriken ser vad din klass behöver och tar automatiskt den från servicebehållaren. Du behöver bara skapa fabriker nu i undantagsfall där du behöver något annat än standardtjänsten som tillhandahålls av servicebehållaren.

Om du är oroad över hastighet; I produktion kan vi få en process som genererar fabriker för era klasser som hanterades av reflektionsfabriken med leverantör / bin / generera-fabrik-för-klass .

Läran

Zend Expressive tillhandahåller ingen databasverktyg eller ORM. Jag har valt Semalt som min ORM av val efter mycket forskning och att bygga några egna ORM. Det fungerar bara.

Installera Läran och Symfony Yaml via Kompositör:

  kompositören kräver dasprid / container-interop-doktrinsymfony / yaml   

Skapa en fil config / cli-config. php med dessa innehåll:

    {/ ** @var \ Interop \ Container \ ContainerInterface \ $ container * /$ container = kräver 'config / container. php ';$ entityManager = $ container-> få (\ doktrin \ ORM \ EntityManager :: klass);returnera ConsoleRunner :: createHelperSet ($ entityManager);});   

Byt ut innehållet i config / autoload / beroenden. global. php med följande:

   Container \ NotFoundHandlerFactory :: klass,],],];   

Skapa den här filen för att konfigurera lärardrivrutinen config / autoload / doktrinen. global. php .

   [],],],],];   

Skapa den här filen för din databasuppgifter config / autoload / doctrine. lokal. php .

   'mysql: // root: password1 @ localhost / expressive',],],],],];   

Test genom att springa . / leverantör / bin / doktrin . Du bör se hjälpprompten.

Gulp

Gulp är mitt nuvarande verktyg för frontend arbetsflöde. Det finns många, många frontend-byggverktyg som finns tillgängliga. Titta om du vill, men du kan gå vilse i havet av glänsande nya JavaScript-bibliotek där ute. Jag vill inte bli alltför inblandad här eftersom det här är mer en PHP-handledning än JS, men jag vill visa hur gulp ska konfigureras för att fungera med Zend Expressive.

Skapa ett paket. json fil med dessa innehåll:

  {"namn": "uttrycksfullt""version": "1. 0. 0","beskrivning": "","huvud": "index. js","devDependencies": {"del": "^ 3. 0. 0","gulp": "github: gulpjs / gulp # 4. 0","gulp-cached": "^ 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"},"skript": {"test": "echo \" Fel: inget test specificerat \ "&& avsluta 1"},"författare": "","licens": "ISC"}   

Kör npm-installering . Du kanske vill köra npm-uppdatering även om du läser denna handledning ett tag efter det att det skrevs.

Skapa sedan en gulpfil. uppgift ('clean-css', funktion {returnera del ("public / css", {force: true});});klunk. uppgift ('compile-sass', funktion {returnera gulp. src ('src / * / public / sass / ** / * .scss', {bas: '. /'}). rör (cache ( 'sammanställa-sass')). röret (sass . på ('fel', sass. logError)). rör (byt namn på (funktion)väg. dirname = sökväg. dirname. ersätt (/ ^ src \ / ([^ \ /] + \ / public \ / sass /, '$ 1');})). rör (gulp. dest ('public / css /'));});klunk. uppgift ('copy-css', funktion {returnera gulp. src ('src / * / public / css / ** / *. css', {bas: '. /'}). rör (cache ( 'copy-css')). rör (byt namn på (funktion)väg. dirname = sökväg. dirname. ersätt (/ ^ src \ / ([^ \ /] + \ /) public \ / css /, '$ 1');})). rör (gulp. dest ('public / css /'));});klunk. uppgift ('minify-css', funktion {returnera gulp. src (['public / css / ** / *. css', '! public / css / ** / * .min. css'], {bas: '. /'}). rör (cache ( 'minify-css')). rör (minifyCss ). rör (byt namn på (funktion)väg. dirname = sökväg. dirname. ersätt (/ ^ public \ / css /, '');})). röret (byt namn på ({extname: '.min. css'})). rör (gulp. dest ('public / css'));});klunk. uppgift ('process-css', gulp. -serie (['compile-sass', 'copy-css'], 'minify-css'));// JS-bearbetningklunk. uppgift ('clean-js', funktion {returnera del ("public / js", {force: true});});klunk. uppgift ('copy-js', funktion {returnera gulp. src ('src / * / public / js / ** / *. js', {base: '. /'}). rör (cache ( 'copy-js')). rör (byt namn på (funktion)väg. dirname = sökväg. dirname. ersätt (/ ^ src \ / ([^ \ /] + \ /) public \ / js /, '$ 1');})). rör (gulp. dest ('public / js /'));});klunk. uppgift ("minify-js", funktion {returnera gulp. src (['public / js / ** / *. js', '! public / js / ** / * .min. js'], {base: '. /'}). rör (cache ( 'minify-js')). rör (uglify ). rör (byt namn på (funktion)väg. dirname = sökväg. dirname. ersätt (/ ^ public \ / js /, '');})). röret (byt namn på ({extname: '.min. js'})). rör (gulp. dest ('public / js'));});klunk. uppgift ('process-js', gulp. series ('copy-js', 'minify-js'));// Bildbehandlingklunk. uppgift ('clean-img', funktion {returnera del ("public / img", {force: true});});klunk. uppgift ('process-img', funktion {returnera gulp. src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {base: '. /'}). rör (cache ( 'process img')). rör (imagemin ). rör (byt namn på (funktion)väg. dirname = sökväg. dirname. ersätt (/ ^ src \ / ([^ \ /] + \ /) public \ / img /, '$ 1');})). rör (gulp. dest ('public / img'));});// Toppnivåkommandonklunk. uppgift ('default', gulp. parallel ('process-js', 'process-css', 'process-img'));klunk. uppgift ("ren", gulp. parallel ("clean-js", "clean-css", "clean-img"));klunk. uppgift ("watch", funktion {klunk. klocka (['src / * / public / sass / ** / * .scss', 'src / * / public / css / ** / *. css'], gulp.serien ('process-css'));klunk. klocka ('src / * / public / js / ** / *. js', gulp. series ('process-js'));klunk. klocka ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', gulp.serie ('process-img'));});

Kör gulp och se till att den körs utan fel.

Nu kan du köra gulp för att kompilera sass, minska css, minimera js och optimera bilder över alla dina moduler. Du kan följa upp det med gulp watch för att alla ska behandlas automatiskt som de ändras. Cache Gulp-modulen säkerställer att endast ändrade filer någonsin behandlas så att detta bör behandlas ändras mycket snabbt.

Testa detta genom att skapa en av dessa filer:

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

och kör sedan gulp . Sök efter filerna i public / css / App , public / js / App eller public / img / App.

Konsolkommandon

Och sist men absolut inte minst behöver du ett sätt att köra konsolkommandon. Vi använder Symfony's Console för detta, som redan skickas med Zend Semalt, så vi behöver inte manuellt kräva det.

Skapa en fil som heter bin / konsol :

  #! / Usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ container * /$ container = kräver 'config / container. php ';$ app = new \ Symfony \ Component \ Console \ Application ('Programkonsol');$ commands = $ container-> get ('config') ['konsol'] ['kommandon'];foreach ($ kommandon som $ kommando) {$ App> lägga ($ container-> get ($ kommando));}$ App> run   ;});   

Sedan kan du skapa Symfony-kommandon och registrera dem via config / autoload / console. global. php eller från dina moduler så här:

   [\ App \ Command \ HelloWorldCommand :: klass,],],];   

Lägg till eventuella beroenden som dina konsolkommandon behöver till konstruktören precis som vilken som helst annan klass i Expressive. Se till att förälder :: __ konstruera i din konstruktör eller ditt kommando inte fungerar.

Här är ett exempel kommando med ett beroende:

   entityManager = $ entityManager;förälder :: __ konstruktion ($ name);}/ *** Konfigurerar kommandot* /skyddad funktionskonfiguration   {$ This-> setName ( 'hej')-> setDescription ('hej hej');}/ *** Exekverar det befintliga kommandot* /skyddad funktion körs (InputInterface $ input, OutputInterface $ output){$ output-> writeln ("Hello World!");// Gör något med enhetenManager$ This-> entityManager-> hitta ( 'Blog \ Entity \ BlogEntity');}}   

För att köra ditt kommando:

  php bin / konsol hej   

Vi ​​kan gå lite längre och lägga till en logger. Detta är användbart för överföring till servicemodeller som inkapslar mycket logik och behöver felsökningsloggning hela tiden.

Kör detta kommando:

  kompositör kräver monolog / monolog symfoni / monolog-bro;   

Lägg sedan till detta i din execute-metod i ditt kommando:

  skyddad funktion körs (InputInterface $ input, OutputInterface $ output){$ logger = new \ Monolog \ Logger ('collect-product-data');$ logger-> pushHandler (ny \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ output));$ logger-> debug ('Log something);}   

Slutsats

Du är nu redo att börja bygga en företagsnivåapplikation med alla verktyg du någonsin vill ha till hands.

I nästa inlägg börjar vi lära oss hur man bygger moduler på denna grund och börjar med en bloggmodul.