Carnet Wiki

Outils pour la conformité du php avec les PSR-12

Les outils utilisent des fichiers de configurat voir Jeux de règles PSR_SPIP
[Content editable, please fix !!]
Actu au 2022
2 nouveaux liens :
-  https://discuter.spip.net/t/coding-standards/155150/24
-  https://discuter.spip.net/t/coding-standards/155150/50 (même page)
-  le mode d’emploi phpstan plus bas sur cette page

Outils

Yen a 2 sorte : les sniffer (détectent) et les fixers (corrigent).

codesniffer
-  phpcs présente tous les avertissements possibles, corrigibles automatiquement ou non
-  dispose d’un fixer en complément : phpcbf. Exemple : https://git.spip.net/spip-contrib-extensions/gis/pulls/28

PHP CS fixer
-  https://github.com/FriendsOfPHP/PHP-CS-Fixer
-  seulement des corrections certaines, pas d’avertissements non correctibles car incertains

Différence entre les 2 :
-  https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/3459

phpstan
-  https://github.com/phpstan/phpstan (about : https://medium.com/@ondrejmirtes/phpstan-2939cd0ad0e3)
-  Actu SPIP 2022 : https://discuter.spip.net/t/analyse-statique-du-code/155403
-  Exemple : https://git.spip.net/spip-contrib-extensions/gis/issues/32
-  Stratégie d’emploi : voir plus bas dans cette page

Autres
-  mess
-  codestyle dans phpStorm et autres IDE

CodeSniffer

codesniffer parse et teste le source selon des jeux de règles. Ces jeux de règles peuvent être les PSR par défaut, ou des jeux de règles fournis.

-  Installer la version de base : https://github.com/squizlabs/PHP_CodeSniffer
-  Utiliser : https://github.com/squizlabs/PHP_CodeSniffer/wiki

-  Télécharger et installer phpcs
-  Récupérer le fichier de règle (xml) choisi
-  exécuter

Bricebou décrit aussi comment installer CodeSniffer globalement et l’utiliser : https://momh.fr/blog/article/installer-globalement-php_codesniffer

Exemple : Jeu de régle « compatibilité PHP7 »

Ce jeu de règle permet de tester la compatibilité d’un code avec PHP7 et 7.2
-  téléchargement : https://github.com/PHPCompatibility/PHPCompatibility
-  paramétrage de codesniffer avec le jeu de règle phpcompatibility :
php phpcs.phar --config-set installed_paths /chemin/vers/phpcompatibility
-  usage :
php phpcs.phar /chemin/vers/source/php
-  ou bien alors en spécifiant à chaque fois sur la LC :
php phpcs.phar --standard=spipcs.xml /chemin/vers/source/php

Pour SPIP

-  télécharger le jeu de règles spipcs.xml : voir Jeux de règles PSR_SPIP.

-  Se mettre à la racine du dossier à vérifier et lancer la commande php phpcs.phar --standard=spipcs.xml chemin/vers/dossier/a/verifier
-  ou bien se mettre à la racine du spip et lancer php phpcs.phar --standard=spipcs.xml .

- Dans PhpStorm

Installer le codesniffer
-  activer php : Settings > Langages and frameworks > PHP (car a priori ya besoin de php pour Composer)
-  installer et activer composer dans phpstorm : Tools > Composer > Install (cf https://www.jetbrains.com/help/phpstorm/using-the-composer-dependency-manager.html)

-  installer codesniffer : Tools > Composer > Manage Dependencies : chercher et installer squizlabs/php_codesniffer, puis récupérez sur votre disque le fichier SPIP_style.xml de jeu de règles (voir Jeux de règles PSR_SPIP)

-  ou bien (mieux) : via Composer, installez le jeu de règle PSR2-rectified qui est beaucoup plus proche des règles SPIP. C’est le jeu de règle vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml qu’il faut alors rechercher et installer.
Celui ci installe le code_sniffer d’origine plus des règles spécifiques.

Configurer le code inspector (pas ok)

La doc https://www.jetbrains.com/help/phpstorm/using-php-code-sniffer.html permet a priori d’intégrer le sniffer aux outils d’inspection de code de PhpStorm, mais pour l’instant j’ai pas réussi comme ça (erreur « manque de sniff »).
Configurer codesniffer pour utiliser ce jeu de règles : Settings > Editor > Inspections > Quality tools > PHP code sniffer validation > Coding standard > Custom puis « ... » pour choisir le fichier SPIP_style.xml. Le petit bouton « raffraichir » permet de vérifier que les règles sont bien comprises.

Quelque part dans un des fichiers des config json de composer (dans composer.json a priori, mais je ne sais pas où précisément, je l’ai mis dans une nouvelle section) on peut ajouter :
"scripts": {    "phpcs": "phpcs --standard=/chemin/vers/SPIP_style.xml"

Activer le codesniffing à la demande (OK)

Ça ça marche :

-  Settings > Tools > External tools : déclarer les outils phpcodesniffer (phpcs) et phpcbf.
Pour phpcs :
* programme : /mon/chemin/vendor/squizlabs/php_codesniffer/bin/phpcs
* arguments : —standard=$ProjectFileDir$/vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml -p $FilePath$
* working directory : $ProjectFileDir$
-  Settings > Keymap >External tools : déclarer 2 raccourcis
* CTRL+; pour phpcs
* CTRL+SHIFT+; pour fixer
-  Ouvrir un fichier php ou sélectionner un dossier dans l’arborescence, puis CTRL+ : l’analyse se fait

On peut simultanément installer les autres paramétrages de phpcs, avec d’autres raccourcis :
-  PSR2R : CTRL+; et CTRL+.
-  PHPcompatibility : CTRL+: et CTRL+/
-  PSR2 : CTRL+, et CTRL+?

Paramétrage de l’éditeur

C’est un fichier de paramétrage pour la visualisation et l’édition dans l’éditeur de PhpStorm. Il ne corrige pas le code existant mais aide à l’écrire de la bonne manière. N’étant pas destiné à phpcs il n’a pas le même format XML.

-  télécharger : https://gist.github.com/Cerdic/efdb1d5c9318670d19fe
Rq : cette version définit des tabulations de 2 espaces ce qui est différent des 4 espaces habituels.

Pour l’installer : allez dans Settings -> Editor -> Code Style > PHP cliquez sur la roue dentée puis Import scheme > Intellij IDEA codestyle XML et importez le fichier de paramétrage téléchargé.

Cela active aussi les inspections de code sur la base de PSR2, modifiées selon les instructions du fichier de paramétrage du codestyle.

- Avec Sublime Text

-  origine : https://gist.github.com/magikcypress/200f2d2491ba5cc57051fdf6d9412fbd
-  version au 12 mai 2016 :

<?xml version="1.0"?>
<ruleset name="SPIP">
<!--
	Liens utiles
                documentation : [->4738]
		https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
		https://github.com/ucfcdl/fuelphp-phpcs/tree/master/Standards/FuelPHP
		https://github.com/vanilla/addons/tree/master/standards/Vanilla
-->

	<description>Coding rules for SPIP with Sublime text</description>

	<exclude-pattern>config/*</exclude-pattern>
	<exclude-pattern>IMG/*</exclude-pattern>
	<exclude-pattern>lib/*</exclude-pattern>
	<exclude-pattern>local/*</exclude-pattern>
	<exclude-pattern>plugins-dist/*</exclude-pattern>
	<exclude-pattern>squelettes/*</exclude-pattern>
	<exclude-pattern>tmp/*</exclude-pattern>

	<!-- Appliquer PSR-2 moins nos exceptions -->
	<rule ref="PSR2" >
		<!-- Désactiver la vérification sur les noms de classes/fonctions -->
		<exclude name="Squiz.Classes.ValidClassName" />
		<!-- Désactiver la vérification sur l'indentation -->
		<exclude name="Generic.WhiteSpace.ScopeIndent" />
		<exclude name="Generic.WhiteSpace.DisallowTabIndent" />
		<!-- Désactiver les camel caps sur les fonctions -->
		<exclude name="Generic.NamingConventions.CamelCapsFunctionName" />
		<!-- Désactiver la vérification sur les accolades -->
		<exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" />
		<exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine" />
		<exclude name="PSR2.Classes.PropertyDeclaration" />
	</rule>

	<!-- Tabulations pour l'indentation -->
	<arg name="tab-width" value="4"/>
	<rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
	<rule ref="Generic.WhiteSpace.ScopeIndent">
		<properties>
			<property name="indent" value="4"/>
			<property name="tabIndent" value="true"/>
		</properties>
	</rule>

	<!-- Accolades -->
	<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie"/>
	<rule ref="Generic.ControlStructures.InlineControlStructure" />
	<rule ref="Squiz.ControlStructures.ControlSignature" />
	<rule ref="Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace">
		<severity>0</severity>
	</rule>

	<!-- Guillemets doubles -->
	<rule ref="Squiz.Strings.DoubleQuoteUsage"/>
	<rule ref="Squiz.Strings.DoubleQuoteUsage.ContainsVar">
		<severity>0</severity>
	</rule>
	
	<!-- Constantes en majuscules -->
	<rule ref="Generic.NamingConventions.UpperCaseConstantName"/>

</ruleset>

Rq à vérifier : phpcs ne permet pas de corriger les tabulations en 2016

- Avec Visual Studio Code

Témoignage Bricebou 2022

Avec un phpcs.xml à la racine de ton projet, pas besoin de déclarer grand chose. Je viens de tester PHP Sniffer & Beautifier et j’ai juste dû spécifier le chemin vers les exécutables dans /home/$USER/bin/

Témoignage 2019

-  Installer phpcs
-  Installer l’extension PHPtelliSense (directement depuis VSCode)
-  Indiquer le chemin vers les règles de SPIP dans la configuration de l’extension (fichier settings.json) :

"phpcs.standard": "/chemin/vers/phpcs.xml"

Nb : j’ai du aussi y mettre le chemin complet vers l’exécutable de phpcs

"phpcs.executablePath": "/home/spip/.config/composer/vendor/squizlabs/php_codesniffer/bin/phpcs",

PhpStan

Une fois phpstan installé sur votre système, Bricebou énonce un mode d’emploi :

-  Commencer par créer un fichier phpstan.neon.dist à la racine de notre plugin, avec ceci :

includes:
	- phpstan-baseline.neon

parameters:
    paths:
        - .
    excludePaths:
        analyseAndScan:
            - lang
            - vendor
    level: 0

-  Puis lancer la commande suivante depuis la racine du SPIP

vendor/bin/phpstan --configuration=plugins/optimages/phpstan.neon.dist --generate-baseline=plugins/optimages/phpstan-baseline.neon

-  Corriger les éventuelles erreurs qui remontent
-  Relancer alors PHPStan ainsi :

vendor/bin/phpstan --configuration=plugins/optimages/phpstan.neon.dist

-  Ensuite, monter progressivement le niveau d’analyse en ajoutant l’argument --level=[0-8]

-  une fois toutes les erreurs à notre portée corrigées, on peut relancer la génération de la baseline en ayant au préalable modifié la valeur pour le paramètre level de notre fichier de configuration.

- Mise à jour :10 août 2022 à 16h47min