phpcs.xml
Rama main · réplica de lectura del repositorio original.
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="artwork-rules">
<description>Ruleset for the artwork project</description>
<!-- Files/Directories to check -->
<file>app</file>
<file>artwork</file>
<file>tests/Unit</file>
<file>config</file>
<file>database</file>
<file>routes</file>
<!-- Excluded files/directories -->
<exclude-pattern>./config/debugbar.php</exclude-pattern>
<exclude-pattern>./database/migrations/</exclude-pattern>
<exclude-pattern>storage/</exclude-pattern>
<exclude-pattern>vendor/</exclude-pattern>
<exclude-pattern>node_modules/</exclude-pattern>
<exclude-pattern>**/*.js</exclude-pattern>
<exclude-pattern>**/*.vue</exclude-pattern>
<!-- Warnungen werden gemeldet, brechen die Pipeline aber nicht (Errors schon) -->
<config name="ignore_warnings_on_exit" value="1"/>
<!-- PSR standard -->
<rule ref="PSR12">
<exclude name="PSR12.Classes.OpeningBraceSpace" />
</rule>
<!-- Testmethoden heißen im Projekt bewusst snake_case (Feature-Tests werden gar nicht geprüft) -->
<rule ref="PSR1.Methods.CamelCapsMethodName">
<exclude-pattern>./tests/Unit/</exclude-pattern>
</rule>
<!-- Laravel coding style: ab 120 Zeichen Warnung, ab 160 Fehler -->
<rule ref="Generic.Files.LineLength">
<properties>
<property name="lineLimit" value="120" />
<property name="absoluteLineLimit" value="160" />
</properties>
</rule>
<!-- SlevomatCodingStandard rules -->
<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint" />
<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint" />
<rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint" />
<rule ref="SlevomatCodingStandard.Classes.PropertyDeclaration.Scope" />
<rule ref="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming">
<!-- Bestandsklasse, an 20 Stellen referenziert — Umbenennung lohnt den Churn nicht -->
<exclude-pattern>./artwork/Modules/Shift/RuleChecks/AbstractRuleCheck.php</exclude-pattern>
</rule>
<!-- Additional rules -->
<rule ref="Generic.Classes.DuplicateClassName"/>
<!-- Leere catch-Blöcke mit erklärendem Kommentar sind hier bewusstes Defensiv-Muster -->
<rule ref="Generic.CodeAnalysis.EmptyStatement">
<exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedCatch"/>
</rule>
<rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
<!-- ForLoopWithTestFunctionCall entfernt: schlägt bei jeder Carbon-Datumsschleife
(for ($day = …; $day->lte($end); $day->addDay())) an; count()-Aufrufe im Schleifenkopf sind bereinigt -->
<rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
<rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
<rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
<!-- Unbenutzte Parameter nur dort melden, wo die Signatur frei ist: bei Interface-/Elternklassen-Implementierungen
und Policies (Laravel ruft mit fester Signatur) lässt sich der Parameter nicht entfernen -->
<rule ref="Generic.CodeAnalysis.UnusedFunctionParameter">
<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass"/>
<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed"/>
<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed"/>
<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterface"/>
<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceBeforeLastUsed"/>
<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceAfterLastUsed"/>
<exclude-pattern>*/Policies/*</exclude-pattern>
<exclude-pattern>./database/factories/</exclude-pattern>
<exclude-pattern>./routes/channels.php</exclude-pattern>
</rule>
<rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
<rule ref="Generic.ControlStructures.InlineControlStructure"/>
<rule ref="Generic.Formatting.DisallowMultipleStatements"/>
<!-- Komplexitäts-/Nesting-Metriken nicht mehr im Sniff: 256 Bestandsfunktionen lagen darüber (Stand 15.09.2026),
das Signal ging im Rauschen unter. Refactoring-Kandidaten sind in der Projektnotiz festgehalten. -->
<rule ref="Generic.PHP.DeprecatedFunctions"/>
<rule ref="Generic.PHP.DisallowShortOpenTag"/>
<rule ref="Generic.PHP.NoSilencedErrors"/>
<rule ref="MySource.PHP.EvalObjectFactory"/>
<rule ref="PEAR.Classes.ClassDeclaration"/>
<rule ref="Squiz.PHP.Eval"/>
<!-- Rechte-Katalog: lange Übersetzungsschlüssel als Strings, keine Zeilenumbrüche im Text -->
<exclude-pattern>artwork/Modules/Permission/Catalog/Modules/*</exclude-pattern>
</ruleset>