Symfony 4: Best Practices

Elke belangrijke versie van een project is een kans om de best practices opnieuw te bekijken. Moderniseren. Aanpassing aan de nieuwe functies van het project. Symfony 4 is geen uitzondering.

Standaardisatie eerst

Symfony 4 zal een evolutie zijn van de huidige werkwijzen en proberen meer standaardtools te omarmen.

Symfony streeft ernaar PHP en webstandaarden te omarmen. Het is moeilijk te geloven dat Symfony 2 begon op een moment dat Composer niet bestond. Sindsdien is de PHP-community gestart met de Fig-groep, die verschillende aanbevelingen heeft overgenomen. Symfony was een van de eerste grote frameworks die de meeste PSR's overnam, zonder achterwaartse compatibiliteit te verbreken. PSR-3 voor het loggen van vele jaren geleden. PSR-4 voor autoloading. Meer recent, PSR-6 voor caching. De volgende versie van Symfony, versie 3.3, implementeert PSR-16 voor caching en de gloednieuwe PSR-11 voor interoperabiliteit van containers. We hebben misschien zelfs een use case voor PSR-13.

Het gebruik van standaarden helpt bij interoperabiliteit, maar ook bij het ontkoppelen van uw code van het framework.

Toepassingen zonder bundel

De overstap naar bundelloze applicaties werd in de vorige blogpost uitgelegd. Ik noem het hier opnieuw, omdat dit een belangrijke verandering is in de huidige reeks best practices.

Omgevingsvariabelen

In het huidige best practices-boek van Symfony wordt uitgebreid uitgelegd hoe u configuratie-instellingen kunt maken in een Symfony-toepassing. Wanneer app / config / parameters.yml te gebruiken voor infrastructuurgerelateerde configuratie of app / config / config.yml voor applicatiegerelateerde configuratie.

Ik zou zo ver gaan als aanbevelen om app / config / config.yml zoveel mogelijk te vermijden. Er zijn geldige gebruiksscenario's, maar ik kan ze op één hand tellen.

Symfony 4 heeft niet het equivalent van app / config / parameters.yml. Gebruik in plaats daarvan omgevingsvariabelen. Dit doen de meeste frameworks in andere talen. Dit is ook een van de aanbevelingen van het 12-Factor Application Manifesto. Een die wordt aangemoedigd door veel moderne hostingplatforms.

Het gebruik van omgevingsvariabelen, hoewel verre van perfect, heeft veel voordelen ten opzichte van wat we momenteel doen. Omgevingsvariabelen zijn een meer "standaard" manier om instellingen te beheren die afhankelijk zijn van de omgeving (het is bijvoorbeeld niet nodig om parameters.yml.dist te beheren). Omgevingsvariabelen kunnen door verschillende toepassingen worden gelezen, omdat ze onafhankelijk zijn van uw code, framework en taal. Omgevingsvariabelen helpen bij de inzet van alleen-lezen bestandssysteem als ze worden losgekoppeld van uw code. Waarden voor omgevingsvariabelen kunnen "dynamisch" worden gewijzigd zonder uw toepassing opnieuw te hoeven gebruiken (de cache leegmaken voor Symfony). Last but not least kunnen omgevingsvariabelen worden beheerd door bestaande tools.

Houd er rekening mee dat het opslaan van geheimen in omgevingsvariabelen niet 'veiliger' is dan ze in een configuratiebestand op te slaan.

Omdat het gebruik van omgevingsvariabelen omslachtig kan zijn in de ontwikkeling, is het gebruik van een "standaard" .env-bestand eenvoudiger en aanbevolen. Symfony 3.3 wordt geleverd met een nieuwe Dotenv-component die standaard wordt gebruikt in Symfony 4-toepassingen. Schakelen tussen een .env-bestand en "echte" omgevingsvariabelen gebeurt automatisch en transparant.

Merk op dat u ook omgevingsvariabelen kunt definiëren in een parameter.yaml-bestand als dat voor u beter aanvoelt. Dat zal echter niet de aanbevolen manier zijn. Merk op dat parameters.yaml geen typfout is van parameters.yml! Dit is een andere wijziging in Symfony 4 die in een later artikel wordt besproken.

Als een leuk neveneffect helpt het vereenvoudigen hoe de Symfony-omgeving en de foutopsporingsvlag worden verwerkt door zowel console- als webtoepassingen.

Momenteel kan het Symfony-consoletool de omgeving en de foutopsporingsvlag gebruiken via de vlaggen --env en --no-debug. Of alternatief via de omgevingsvariabelen SYMFONY_ENV en SYMFONY_DEBUG.

Met Symfony 4 is dit niet langer nodig. APP_ENV en APP_DEBUG kunnen worden gebruikt voor zowel de webfront-controller als de console-tool.

Niet meer ./bin/console foo: bar --env = prod --no-debug of SYMFONY_ENV = prod SYMFONY_DEBUG = 0 ./bin/console foo: bar. Gebruik gewoon ./bin/console foo: bar.

Het werkt gewoon. In ontwikkeling en op productieservers.

Symfony 4 zit vol met dergelijke vereenvoudigingen.

Unified Web Front Controller

Symfony 3 heeft twee webfront-controllers. Eén geoptimaliseerd voor productie. Eén geoptimaliseerd voor ontwikkeling. Symfony 4 gebruikt er slechts één. U hoeft de ontwikkelwebfront-controller niet meer te verwijderen. Geen beveiligingsprobleem meer als u het vergeet.

Je zou denken dat de code complexer is dan voorheen. Dit is zelfs niet het geval, omdat we veel oude code hebben kunnen verwijderen. Dankzij omgevingsvariabelen. Dankzij PHP 7 en het verwijderen van de bootstrap en class caches. Dankzij Symfony 3.3, waardoor een specifieke autoloader niet meer nodig is.

Makefile

Veel projecten hebben een aantal aangepaste scripts: een wrapper om unit- of integratietests uit te voeren, een script dat de ingebouwde PHP-server uitvoert en meer. Scripts waarvoor het schrijven van een Symfony-consoleopdracht niet logisch zou zijn.

Voor het gemak hebt u ze mogelijk gedefinieerd in uw applicatie componer.json-bestand. Silex doet dat met een scriptitem dat de ingebouwde PHP-server uitvoert. Maar dat brengt veel problemen met zich mee, zoals time-outs of niet-ondersteuning voor ANSI-ontsnappingscodes.

Centralisatie van opdrachten helpt echter met de vindbaarheid. Hoe zit het met het gebruik van een Makefile in plaats daarvan? Dit is misschien wel het meest controversiële kenmerk van Symfony 4. Ik ging heen en weer. Maar ik ben ervan overtuigd dat het veel waarde oplevert en sommige problemen helpt oplossen.

make is een bekende "standaard" tool. Het is krachtiger dan scripts uitgevoerd door Composer. Het vertrouwt niet op PHP. Gebruik het om de implementatie te vergemakkelijken, om verbinding te maken met externe servers via SSH, om Blackfire-testscenario's uit te voeren. Gebruik het om npm, gulp, webpack uit te voeren, je noemde het. Taken waarbij het gebruik van Symfony-opdrachten niet praktisch of wenselijk is.

Profiteer van het gelijktijdig uitvoeren van recepten. Voer geen taken uit als er niets is veranderd. Make is krachtig.

Laten we een voorbeeld nemen, cache wissen. Symfony heeft een opdracht om de cache te wissen en op te warmen. Beide doen in hetzelfde proces werkt niet goed omdat PHP een klasse niet opnieuw kan laden als deze is gewijzigd. Maar dit is gemakkelijk te bereiken met make:

cache-clear:
  @test -f bin / console && bin / console cache: clear --no-warmup || rm -rf var / cache / *
.PHONY: cachegeheugen wissen
cache-warming-up: cache-clear
  @test -f bin / console && bin / console cache: warmup || echo "kan de cache niet opwarmen (heeft symfony / console nodig)"
.PHONY: cache-warming-up

Als een ander voorbeeld hebben de meeste van mijn PHP-projecten twee taken die helpen bij het uitvoeren van Blackfire-tests:

bf-dev:
   blackfire-player --endpoint = http: // `bin / console server: status --filter = adres` test uitvoeren / bkf / all.bkf
.PHONY: bf-dev
bf-prod:
  blackfire-player --endpoint = https: //twig.sensiolabs.org tests uitvoeren / bkf / all.bkf --variable = "env = prod"
.PHONY: bf-prod

Wilt u overschakelen van een applicatie naar de “onderhoudsmodus”? Gebruik make, geen Symfony-opdracht.

Vermogensbeheer

Assetic is verwijderd in Symfony Standard Edition 3.0. We raden momenteel geen vervangingen aan, omdat de JavaScript-wereld nog steeds aan een 'standaard'-tool werkt. Maar Symfony 4 zal een aanbeveling doen en enige diepe integratie bieden. Daarover binnen enkele weken meer. Toch wilde ik het vermelden omdat we ook activa ondersteunen die symlinks zijn / van bundels naar web / bundels / via middelen worden gekopieerd: installeren, maar dat is waarschijnlijk iets dat Symfony 5 niet zal overleven. Vooral omdat we een bundelloze applicatiestructuur hebben nu.

Ondersteuning van de nieuwe best practices heeft enige invloed op de directorystructuur, het onderwerp van het volgende bericht. Blijf kijken!

Oorspronkelijk gepubliceerd op fabien.potencier.org.