Wat is PSR-4?
Tijdens het werken met Laravel en Composer kwam ik “psr-4” tegen. Ik was benieuwd wat dat nu precies is. Waarschijnlijk heeft het iets te maken met autoload versie ofzo…? Althans, in die context zie ik het langskomen.
In deze blog neem ik je mee in mijn zoektocht want ik wist voordat ik begon met schrijven ook nog niet wat PSR-4 is. Let op, het is wel een technisch verhaal geworden.
Autoload
Als je wel eens met Laravel en/of Composer werkt ken je de term autoload
wel. Dit komt namelijk voor in het composer.json
bestand:
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
},
"files": []
}
Hier kwam ik de definitie psr-4 tegen. Verder staat er in dit bestand niet veel spannends waarmee ik de betekenis van PSR-4 zou kunnen afleiden.
Wat is PSR?
PSR betekent PHP Standard Recommendation. Een advies om PHP te gebruiken dus… Interessant.
Na even zoeken kom ik tot de conclusie dat PSR’s lijken op ISO-normen. Waar ISO een internationale standaard is waarvoor je gecertificeerd kunt worden, is PSR meer een internationaal overtuigend advies. PSR is een bewaakte definitie waarin staat hoe je de structuur van bestanden en de structuur van de code moet opzetten. In de meeste gevallen zijn de adviezen gebaseerd op jarenlange ervaring en uitgebreide tests, vandaar dat het advies overtuigend is.
PHP-FIG
De adviezen worden gepubliceerd en bewaakt door PHP Framework Interop Group (PHP-FIG). Deze organisatie is verantwoordelijk voor de kwaliteit van de adviezen en geeft uiteindelijk ook de authenticiteit eraan.
Het doel van PSR-standaarden
Het doel van PSR is om een gemeenschappelijke standaard te creëren voor developers. De standaard zorgt ervoor dat code eenvoudiger te delen is met andere developers. Er wordt namelijk vanuit dezelfde basis gewerkt. Developers kunnen de source code hierdoor sneller lezen en begrijpen. Overigens geldt dit niet alleen voor developers. Er worden voor programma’s zoals Visual Studio Code handige extensies ontwikkeld zodat ze developers helpen tijdens het programmeren. Deze extensies begrijpen de code beter door zich te baseren op een standaard als PSR-4.
PSR-4 code is verder altijd compatibel met andere PSR-4 code. Eenvoudig hergebruiken van code (packages) in meerdere projecten is daardoor geen probleem.
PSR-4
PSR-4 beschrijft hoe bestanden worden ingeladen vanuit verschillende paden in het project. In de specificatie staat ook beschreven hoe bestanden automatisch kunnen worden ingeladen, zonder dat je paden hoeft te definiëren. De autoloader zoekt de map src/
en laadt vervolgens alle PHP-bestanden met de juiste namespace in.
Structuur
De mappenstructuur van een PSR-4-project ziet er minimaal zo uit:
.
+-- src
+-- tests
+-- vendor
PSR-4 is volledig compatibel met PSR-4- en oudere PSR-0-projecten.
PSR-4 in Laravel
In een Laravel-applicatie vind je het bestand composer.json
. Hierin staat aangegeven dat de namespace van de applicatie App
is: "App\\": "app/“,
. Alle code die in deze namespace zit wordt hierna automatisch ingeladen door de autoloader.
Class not found
Class … not found
moet je wel een keer tegen zijn gekomen. Het komt voor dat een bepaald nieuw of gewijzigd bestand niet ontdekt wordt door de autoloader. 9 van de 10 keer zit de cache van de autoloader dan in de weg.
In Laravel is er een handig Composer-commando beschikbaar om op zo’n moment te proberen:
composer dump-autoload
Lukt het hiermee niet? Laat het ons weten.
Zijn er nog meer PSR-standaarden?
PSR-4 is de opvolger van PSR-0. Huh? Waar zijn 1, 2 en 3 dan? PSR gaat dus niet per se over autoloading. Wist ik ook niet. PSR-3 gaat bijvoorbeeld over een standaard hoe je logs schrijft. PSR-1 en PSR-2 zijn inmiddels verlopen of verlaten.
Op PHP-FIG staat een lijst met alle PSR-standaarden. Let wel op, sommige standaarden zijn in concept, verouderd of verlaten.