Symfony 4: Best Practices

Enhver større versjon av et prosjekt er en mulighet til å gå gjennom beste praksis. Modernisere dem. Tilpasse dem til prosjektets nye funksjoner. Symfony 4 er intet unntak.

Standardisering først

Symfony 4 vil være en evolusjon av dagens praksis, og prøver å omfavne mer standardverktøy.

Symfony tilstreber å omfatte PHP- og nettstandarder. Det er vanskelig å tro at Symfony 2 startet på et tidspunkt da Composer ikke eksisterte. Siden den gang startet PHP-samfunnet Fig-gruppen, som vedtok flere anbefalinger. Symfony var et av de første store rammene som tok i bruk de fleste PSR-er, uten å bryte bakoverkompatibiliteten. PSR-3 for logging for mange år siden. PSR-4 for autoloading. Mer nylig PSR-6 for hurtigbufring. Den neste versjonen av Symfony, versjon 3.3, implementerer PSR-16 for hurtigbufring og den splitter nye PSR-11 for interoperabilitet av containere. Vi kan til og med ha en brukssak for PSR-13.

Å bruke standarder hjelper til med interoperabilitet, men også med å koble fra koden fra rammen.

Pakkeløse applikasjoner

Overgangen til pakkeløse applikasjoner ble forklart i forrige blogginnlegg. Jeg nevner det her igjen, da dette er en viktig endring i dagens sett med beste praksis.

Miljøvariabler

Den gjeldende Symfony-boken for beste praksis forklarer i detalj hvordan du oppretter konfigurasjonsinnstillinger i et Symfony-program. Når skal jeg bruke app / config / parameters.yml for infrastrukturrelatert konfigurasjon eller app / config / config.yml for applikasjonsrelatert konfigurasjon.

Jeg vil gå så langt som å anbefale å unngå å bruke app / config / config.yml så mye som mulig. Det er gyldige brukssaker, men jeg kan telle dem på en hånd.

Symfony 4 har ikke tilsvarende app / config / parameters.yml. Bruk miljøvariabler i stedet. Dette er hva de fleste rammer gjør på andre språk. Dette er også en av anbefalingene fra 12-faktorers applikasjonsmanifest. En som blir oppmuntret av mange moderne hostingplattformer.

Å bruke miljøvariabler, selv om det langt fra er perfekt, har mange fordeler i forhold til det vi gjør for tiden. Miljøvariabler er en mer "standard" måte å administrere innstillinger som er avhengig av miljøet (ikke nødvendig å administrere en parameters.yml.dist for eksempel). Miljøvariabler kan leses av flere applikasjoner ettersom de er uavhengige av koden, rammeverket og språket ditt. Miljøvariabler hjelper med skrivebeskyttet filsystem distribusjon når de er koblet fra koden din. Verdier for miljøvariabler kan endres "dynamisk" uten å distribuere applikasjonen din (tømme hurtigbufferen for Symfony). Sist, men ikke minst, miljøvariabler kan administreres av eksisterende verktøy.

Merk at lagring av hemmeligheter i miljøvariabler ikke er mer "sikker" enn å lagre dem i en konfigurasjonsfil.

Ettersom bruk av miljøvariabler kan være tungvint i utviklingen, er det enklere å anbefale å bruke en "standard" .env-fil. Symfony 3.3 kommer med en ny Dotenv-komponent som som standard skal brukes i Symfony 4-applikasjoner. Å bytte mellom en .env-fil og "ekte" miljøvariabler gjøres automatisk og transparent.

Merk at du også kan definere miljøvariabler i en parameter.yaml-fil hvis det føles bedre for deg. Det er ikke den anbefalte måten. Legg merke til at parameters.yaml ikke er en skrivefeil av parameters.yml! Dette er nok en endring i Symfony 4 som vil bli diskutert i en senere artikkel.

Som en fin bivirkning hjelper det å forenkle hvordan Symfony-miljøet og feilsøkingsflagget håndteres av både konsoll- og nettapplikasjoner.

For øyeblikket kan Symfony-konsollverktøyet ta miljøet og avlusingsflagget via flaggene --env og --no-debug. Eller alternativt via SYMFONY_ENV- og SYMFONY_DEBUG-miljøvariablene.

Med Symfony 4 er dette ikke lenger nødvendig. APP_ENV og APP_DEBUG kan brukes til både frontkontrollen og konsollverktøyet.

Ikke mer ./bin/console foo: bar --env = prod --no-debug eller SYMFONY_ENV = prod SYMFONY_DEBUG = 0 ./bin/console foo: bar. Bare bruk ./bin/console foo: bar.

Det fungerer bare. I utvikling og på produksjonsservere.

Symfony 4 er full av slike forenklinger.

Unified Web Front Controller

Symfony 3 har to nettkontroller på nettet. En optimalisert for produksjon. En optimalisert for utvikling. Symfony 4 bruker bare en. Du trenger ikke å fjerne utviklingen på nettkontrollen lenger. Ikke mer sikkerhetsproblemer hvis du glemmer.

Du skulle tro at koden er mer sammensatt enn før. Dette er ikke en gang tilfelle, fordi vi klarte å fjerne mye "arv" -kode. Takk til miljøvariabler. Takk til PHP 7 og fjerning av bootstrap og class cacher. Takket være Symfony 3.3 som fjerner behovet for en spesifikk autoloader.

Makefile

Mange prosjekter har noen egendefinerte skript: en innpakning for å kjøre enhets- eller integrasjonstester, et skript som kjører den innebygde PHP-serveren og mer. Skript som det er ikke fornuftig å skrive en Symfony-konsollkommando for.

For enkelhets skyld har du kanskje definert dem i applikasjonskomponisten.json-filen. Silex gjør det med en skriptoppføring som kjører den innebygde PHP-serveren. Men det kommer med mange problemer som timeouts eller ikke-støtte for ANSI-fluktkoder.

Sentralisering av kommandoer hjelper deg imidlertid med å oppdage. Hva med å bruke en Makefile i stedet? Dette er kanskje den mest kontroversielle egenskapen til Symfony 4. Jeg gikk frem og tilbake. Men jeg er overbevist om at det gir mye verdi og hjelp til å løse noen problemer.

make er et kjent "standard" verktøy. Det er kraftigere enn skript som drives av Composer. Det er ikke avhengig av PHP. Bruk den for å lette distribusjonen, til å koble til eksterne servere via SSH, for å kjøre Blackfire-testscenarier. Bruk den til å kjøre npm, gulp, webpack, du har navngitt den. Oppgaver der bruk av Symfony-kommandoer er ikke praktisk eller ønskelig.

Profitt på å utføre oppskrifter parallelt. Ikke kjør oppgaver hvis ingenting endret seg. Make er kraftig.

La oss ta ett eksempel, cache-tømming. Symfony har en kommando for å tømme og varme opp hurtigbufferen. Å gjøre begge deler i samme prosess fungerer ikke bra, da PHP ikke kan laste inn en klasse på nytt hvis den endret seg. Men dette er enkelt å oppnå med merke:

cache-klar:
  @ test -f bin / console && bin / console cache: clear --no-warmup || rm -rf var / cache / *
.FONI: cache-clear
cache-warmup: cache-clear
  @ test -f bin / konsoll && bin / console cache: warmup || ekko "kan ikke varme opp hurtigbufferen (trenger symfoni / konsoll)"
.FONI: cache-warmup

Som et annet eksempel har de fleste av PHP-prosjektene mine to oppgaver som hjelper med å kjøre Blackfire-tester:

bf-dev:
   blackfire-player --endpoint = http: // `bin / console server: status - filter = address` run tests / bkf / all.bkf
.FONI: bf-dev
bf-prod:
  blackfire-player --endpoint = https: //twig.sensiolabs.org kjøre tester / bkf / all.bkf --variable = "env = prod"
.FONI: bf-prod

Vil du bytte til et program til "vedlikehold" -modus? Bruk make, ikke en Symfony-kommando.

Eiendomsforvaltning

Assetic ble fjernet i Symfony Standard Edition 3.0. Vi anbefaler for øyeblikket ingen erstatninger siden JavaScript-verdenen fremdeles jobber med et "standard" -verktøy. Men Symfony 4 vil gi en anbefaling og gi noe dyp integrasjon. Mer om det om noen uker. Likevel ønsket jeg å nevne det, da vi også støtter at eiendeler symlinker / kopieres fra pakker til web / pakker / via eiendeler: installer, men det er sannsynligvis noe som ikke vil overleve Symfony 5. Spesielt siden vi har en pakkeløs applikasjonsstruktur nå.

Å støtte de nye beste praksisene har en viss innvirkning på katalogstrukturen, som er neste innleggets emne. Følg med!

Opprinnelig publisert på fabien.potencier.org.