Consistente opmaak van je PHP code met Laravel Pint

Als je denkt dat Pint een overheerlijk Laravel biertje is, moeten we je helaas teleurstellen. Met Laravel Pint kan je eenvoudig de code in je PHP-bestanden op een bepaalde manier opmaken. Het gebruik van Pint is volledig te automatiseren waardoor je nooit meer over de opmaak van je code hoeft na te denken.

De voordelen

Een consistente opmaak van je bestanden is niet alleen prettig voor het oog, maar heeft ook voordelen. Het zorgt voor een betere leesbaarheid doordat structuren zoals IF statements en loops er altijd hetzelfde uitzien. Dit maakt het reviewen van code een stuk prettiger en het verbetert de onderhoudbaarheid van je project.

Onder de motorkap

Hoewel Pint standaard mee komt in nieuwe Laravel installaties, heb je er misschien nog niet eerder van gehoord. Waar je misschien al wel van heb gehoord is PHP CS Fixer. Het is zo'n beetje de industriestandaard binnen PHP om je PHP code mee op te maken. Laravel Pint maakt achter de schermen gebruik van PHP CS Fixer, en bevat aanvullende functionaliteiten waardoor het eenvoudig te gebruiken is in je Laravel project.

Zo gebruik je het

Heb je recent een nieuwe Laravel applicatie aangemaakt, dan is Pint al inbegrepen in je composer.json. Voor de oudere projecten moet je de package handmatig installeren via de terminal.

composer require laravel/pint --dev

Vervolgens kan je de formatter uitvoeren vanuit de root van je project. Let op, als het de eerste keer is dat je pint gebruikt kan het voor veel code wijzigingen zorgen.

./vendor/bin/pint --test
// Voert geen code wijzigingen door, toont enkel wat er gewijzigd zal worden.

./vendor/bin/pint
// Voert wel code wijzigingen door

pint output

Configuratie

Laravel Pint werkt met presets. Een preset is een samengestelde lijst met regels die bepalen hoe je code opgemaakt zal worden. Standaard wordt de Laravel preset gebruikt, de exacte regels kan je hier bekijken. Naast de Laravel preset heb je ook standaard de beschikking over de PER, PSR12 en Symfony preset.

Een dergelijke preset kan je instellen door een pint.json bestand aan te maken in de root van je project:

{
	"preset": "psr12"
}

Presets zijn handig omdat ze een hele reeks aan regels bevatten waar je zelf niet over na hoeft te denken. Mocht je merken dat je een bepaalde regel toch niet fijn vindt of mis je een regel, dan kan je die via een rules blok overschrijven of toevoegen.

{
	"preset": "psr12",
	"rules": {
		"braces": false
	}
}

Op deze manier kan je Pint helemaal naar wens je code laten opmaken.

Pint automatisch toepassen

Je kan Pint eens in de zoveel tijd handmatig aanroepen om je code op te schonen, maar je kan het ook automatiseren. We laten je zien op welke manieren je dit kan doen.

GitHub actions

Met GitHub actions kan je veel zaken automatiseren, waaronder ook het toepassen van code formatters zoals Pint. Zo kan je een action instellen waarbij na iedere commit die je pushed automatisch Pint zal worden uitgevoerd.

name: Fix Code Style

on: [push]

jobs:
  lint:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: true
      matrix:
        php: [8.4]

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: json, dom, curl, libxml, mbstring
          coverage: none

      - name: Install Pint
        run: composer global require laravel/pint

      - name: Run Pint
        run: pint

      - name: Commit linted files
        uses: stefanzweifel/git-auto-commit-action@v5

De code wijzingen worden via een aparte commit aan de branch toegevoegd. Hierdoor hoef je niets op je computer in te stellen. Dit geldt ook voor andere deelnemers in je project, wel zo handig. Het heeft wel een klein nadeel. Als je nogmaals een commit pusht nadat de GitHub action is afgerond kan het zijn dat je eerst een pull moet doen voordat je kan pushen.
pull notification

Wanneer je de regels hebt aangepast die door Pint zijn aangepast kan dit ook leiden tot een merge conflict.
pull notification
Niet echt een ideale workflow, maar het is te verhelpen.

Pre-commit hook

Door gebruik te maken van een pre-commit hook kun je acties autmatisch uit laten voeren waneer je een commit aanmaakt. Hiermee kan je bijvoorbeeld Pint uitvoeren zonder dat je er over hoeft na te denken. Daardoor push je altijd gestylde PHP code waardoor je de eerder beschreven problemen met GitHub actions kan voorkomen.

Er zijn er verschillende tools waarmee je kan inhaken op git hooks. Zelf vind ik Whisky erg fijn en eenvoudig in gebruikt. Je kan het toevoegen aan je Laravel project via:

composer require --dev projektgopher/whisky

Vergeet niet het install commando te draaien

./vendor/bin/whisky install

Nu is alles ingesteld om Whisky te configureren. Maak een whisky.json bestand aan de root van je project met de volgende inhoud.

{
    "disabled": [],
    "hooks": {
        "pre-commit": ["./vendor/bin/pint --dirty"]
    }
}

Dit zorgt ervoor dat bij iedere commit Pint wordt toegepast op alle aangepaste bestanden. Wanneer je een commit aanmaakt zie je als het goed is dat ook Pint is uitgevoerd:
pre commit hook

Pint uitvoeren bij het opslaan van je bestanden

Een derde manier waarmee je Pint kan uitvoeren is door je IDE te configureren om Pint te gebruiken als formatter voor PHP bestanden. Veel IDE's ondersteunen de optie om een formatter uit te voeren bij het opslaan van bestanden. Aangezien er veel IDE's zijn, ga ik niet in detail over hoe je het bij jouw IDE instelt. Als je met VSCODE (of een afgeleide daarvan) of PHP Storm werkt kan je dit artikel eens bekijken.

Je IDE Pint laten uitvoeren bij het opslaan van PHP bestanden is erg fijn. Bij het opslaan staat alles direct goed, wat het programmeren een stuk aangenamer maakt.

Nu je precies weet wat Pint is en wat het doet zie je hopelijk de voordelen in om het actief te gebruiken in je project. Pint automatiseren vraagt even de nodige aandacht maar eenmaal ingesteld kan je er veel profijt van hebben.

Over de auteur

Dit artikel werd geschreven door Nick Retel, freelance developer bij o.a. Oh Dear en bestuurslid bij de Dutch Laravel Foundation.