# Mettre en place PHP CodeSniffer dans VSCode PHP Cs vous permet de mettre en valeur les défauts niveau PSR dans votre code PHP notamment le casse, défaut dans les structures itératives et dans les if, longueur de ligne de code et commentaire. Mais ce n'est pas tout ! ## 1 - Installation ### Installer l'extension **Il s'agit de cette extension :** https://marketplace.visualstudio.com/items?itemName=ikappas.phpcs ### Installer la dépendance Je recommande pour l'installation de la librairie de l'installer via cette commande, car rien ne bouge si vous mettez à jour les dépendances du projet : ```(bash) composer global require squizlabs/php_codesniffer ``` Vous trouverez le composer sous Ubuntu à la racine de votre utilisateur (accessible via la commande `cd ~`). Chez moi c'est dans `.config/composer/`. ## 2 - Configuration ### Configuration propre à VSCode **Configuration rapide** Ajouter dans votre settings.json (CTRL+SHIFT+P parameters (JSON)) : ```(JSON)"phpcs.executablePath": "~/.config/composer/vendor/squizlabs/php_codesniffer/bin/phpcs", "phpcs.composerJsonPath": "~/.config/composer/", "phpcs.standard": "PSR2", "phpcs.ignorePatterns": [ "/application/core/", "/application/config/", "/application/third_party/", "/system/", "/vendor/", "/javascript/" ], "simple-php-cs-fixer.rules": "@PSR1, @PSR2", "simple-php-cs-fixer.usingCache": true, "phpcs.errorSeverity": 5, ``` Fin de la configuration rapide, ci-dessous si vous souhaitez comprendre / corriger votre configuration. Voici à quoi doit ressembler votre configuration, en recherchant PHPCs dans les réglages de VS Code : ``` ctrl + , ``` **Configurer le chemin** Ajouter dans votre settings.json : ```(JSON) "phpcs.executablePath": "~/.config/composer/vendor/squizlabs/php_codesniffer/bin/phpcs", "phpcs.composerJsonPath": "~/.config/composer/", ``` ![](https://i.imgur.com/2vwZaf8.png) Vous devez faire pointer l'extension sur la dépendance PHP Cs, montrer les warnings avec une sévérité de 5. **Préciser le standard !** Ajouter dans votre settings.json : ```(JSON) "phpcs.standard": "PSR2" ``` Les standards utilisés se trouvent dans le fichier ruleset.xml à la racine du projet Flow. > [] Si vous le souhaitez plus stricte, notamment sur les commentaires de classes, fichier et méthodes/fonctions, ne précisez pas ce paramètre. ### Ignorer des fichiers Pour plus de confort lorsqu'on regarde du code qu'on ne corrige jamais, on peut désactiver PHP Cs : Dans votre settings.json de VS Code ajouter : ```=json "phpcs.ignorePatterns": [ "/application/core/", "/application/config/", "/application/third_party/", "/system/", "/vendor/", "views/*" ] ``` ### Linter spécifique à Flow Flow possède son propre standard de développement, le code suivant est présent dans un fichier `ruleset.xml` à la racine du projet Flow : ```=xml <ruleset name="Flow coding standard"> <!-- Excluded patterns --> <exclude-pattern>*.html</exclude-pattern> <exclude-pattern>*.js</exclude-pattern> <exclude-pattern>/application/core/</exclude-pattern> <exclude-pattern>/application/config/</exclude-pattern> <exclude-pattern>/application/third_party/</exclude-pattern> <exclude-pattern>/system/</exclude-pattern> <exclude-pattern>/vendor/</exclude-pattern> <exclude-pattern>/javascript/</exclude-pattern> <exclude-pattern>*/views/*</exclude-pattern> <!--Arguments--> <arg name="parallel" value="75"/> <arg value="wp"/> <arg name="colors"/> <arg name="report" value="full"/> <!--Rulesets--> <rule ref="PSR1"/> <rule ref="PSR2"/> <rule ref="PSR12"/> <!--Individual rules--> <rule ref="Generic.Arrays.DisallowLongArraySyntax"/> <rule ref="Generic.Classes.DuplicateClassName"/> <rule ref="Generic.CodeAnalysis.EmptyStatement"/> <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/> <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/> <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/> <rule ref="Generic.Commenting.Fixme"/> <rule ref="Generic.Commenting.Todo"/> <rule ref="Generic.Formatting.NoSpaceAfterCast"/> <rule ref="Generic.WhiteSpace.DisallowTabIndent"/> <rule ref="Squiz.Arrays.ArrayBracketSpacing"/> <rule ref="Squiz.ControlStructures.ElseIfDeclaration"/> <rule ref="Squiz.Strings.DoubleQuoteUsage"/> <rule ref="Squiz.Strings.DoubleQuoteUsage.ContainsVar"/> <rule ref="Squiz.WhiteSpace.ControlStructureSpacing"/> <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/> <!--Rule configuration--> <rule ref="Generic.Files.LineLength"> <exclude-pattern>*/views/*</exclude-pattern> <properties> <property name="lineLimit" value="350"/> <property name="absoluteLineLimit" value="350"/> </properties> </rule> <rule ref="Generic.Files.LineLength.TooLong"> <exclude-pattern>*/views/*</exclude-pattern> </rule> <rule ref="Squiz.Commenting.FunctionComment"> <exclude name="Squiz.Commenting.FunctionComment.ScalarTypeHintMissing"/> <exclude name="Squiz.Commenting.FunctionComment.TypeHintMissing"/> </rule> <rule ref="Squiz.WhiteSpace.FunctionSpacing"> <exclude name="Squiz.WhiteSpace.FunctionSpacing.After"/> <properties> <property name="spacingBeforeFirst" value="0"/> <property name="spacingAfterLast" value="0"/> </properties> <properties> <property name="spacing" value="1"/> </properties> </rule> <rule ref="Squiz.WhiteSpace.OperatorSpacing"> <properties> <property name="ignoreNewlines" value="true"/> </properties> </rule> <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"> <properties> <property name="ignoreBlankLines" value="false"/> <!-- turned on by PSR2 -> turning off to be more general --> </properties> </rule> <rule ref="Generic.WhiteSpace.ScopeIndent.IncorrectExact"> <properties> <property name="indent" value="4"/> <property name="tabIndent" value="false" /> </properties> </rule> <rule ref="Squiz.Commenting.FunctionComment.Missing"> <exclude-pattern>*/install/*</exclude-pattern> </rule> <rule ref="Squiz.Strings.DoubleQuoteUsage.NotRequired"> <exclude-pattern>*/install/*</exclude-pattern> </rule> <rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace"> <type>warning</type> <exclude-pattern>*/install/*</exclude-pattern> </rule> <rule ref="Squiz.Classes.ValidClassName.NotCamelCaps"> <type>warning</type> <exclude-pattern>*/install/*</exclude-pattern> </rule> <rule ref="Squiz.Strings.DoubleQuoteUsage.ContainsVar"> <exclude-pattern>*/install/*</exclude-pattern> </rule> <!-- These rules have no seerity --> <rule ref="PSR12.Operators.OperatorSpacing.NoSpaceBefore"> <severity>0</severity> </rule> <rule ref="PSR12.Operators.OperatorSpacing.NoSpaceAfter"> <severity>0</severity> </rule> <rule ref="Squiz.WhiteSpace.FunctionSpacing.Before"> <severity>0</severity> </rule> <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines"> <severity>1</severity> <!-- turned off by PSR2 -> turning on with default severity --> </rule> <rule ref="PSR12.ControlStructures.ControlStructureSpacing.FirstExpressionLine"> <severity>0</severity> </rule> <rule ref="Squiz.ControlStructures.ElseIfDeclaration.NotAllowed"> <severity>0</severity> </rule> <rule ref="Squiz.Commenting.FunctionComment.SpacingAfterParamName"> <severity>0</severity> </rule> <rule ref="Squiz.Commenting.FunctionComment.SpacingAfterParamType"> <severity>0</severity> </rule> <!-- Declares these rules like warnings only --> <rule ref="PSR2.Methods.MethodDeclaration.Underscore"> <type>warning</type> </rule> <rule ref="Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore"> <type>warning</type> </rule> <rule ref="PSR2.Classes.PropertyDeclaration.Underscore"> <type>warning</type> </rule> <rule ref="PSR1.Methods.CamelCapsMethodName"> <type>warning</type> </rule> <rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps"> <type>warning</type> </rule> </ruleset> ```