{"id":231085,"date":"2022-12-14T16:26:00","date_gmt":"2022-12-14T13:26:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231085"},"modified":"2022-12-14T16:27:12","modified_gmt":"2022-12-14T13:27:12","slug":"widgets-wordpress-commencer-par-les-normes","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-commencer-par-les-normes\/","title":{"rendered":"Widgets WordPress\u00a0: commencer par les normes"},"content":{"rendered":"\n<p>Le but de cette s\u00e9rie est de commencer \u00e0 approfondir le travail avec la programmation orient\u00e9e objet dans le contexte de WordPress.<\/p>\n<p>Et puisque l&rsquo;API WordPress Widgets est l&rsquo;une des API qui utilise des pratiques orient\u00e9es objet, c&rsquo;est un point de d\u00e9part logique. De plus, cela nous donnera quelques techniques fondamentales que nous pourrons utiliser pour les appliquer \u00e0 des travaux futurs, car nous verrons comment cr\u00e9er davantage de projets orient\u00e9s objet sur WordPress dans les futures s\u00e9ries.<\/p>\n<p>Jusqu&rsquo;\u00e0 pr\u00e9sent, nous avons couvert les \u00e9l\u00e9ments suivants\u00a0:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-une-approche-orientee-objet\/\" title=\"Widgets WordPress: une approche orient\u00e9e objet\">Widgets WordPress: une approche orient\u00e9e objet<\/a>. L&rsquo;API Widgets fournit un test d\u00e9cisif solide et un exemple de la fa\u00e7on de d\u00e9marrer avec la programmation orient\u00e9e objet dans WordPress.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-detecter-la-programmation-orientee-objet\/\" title=\"Widgets WordPress: comment d\u00e9tecter la programmation orient\u00e9e objet\">Widgets WordPress: comment d\u00e9tecter la programmation orient\u00e9e objet<\/a>. Le but est de vous armer de tout ce dont vous avez besoin pour d\u00e9tecter les pratiques orient\u00e9es objet.<\/li>\n<\/ol>\n<p>Si vous n&rsquo;\u00eates pas rattrap\u00e9, c&rsquo;est le moment id\u00e9al pour le faire. Et si vous avez, alors vous vous souviendrez du dernier message, nous avons termin\u00e9 avec la note suivante\u00a0:<\/p>\n<blockquote>\n<p>Autrement dit, nous allons revoir le <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> et je vais le refactoriser dans son \u00e9tat actuel pour adopter des normes PHP plus modernes.<\/p>\n<\/blockquote>\n<p>Pour commencer \u00e0 mettre \u00e0 jour le WordPress Widget Boilerplate pour suivre lesdites normes, nous devons faire quelques choses :<\/p>\n<ol>\n<li>cr\u00e9er une branche \u00e0 partir du passe-partout existant,<\/li>\n<li>installer des outils de qualit\u00e9 de code,<\/li>\n<li>assurez-vous que notre IDE est correctement configur\u00e9,<\/li>\n<li>et commencer \u00e0 refactoriser le code selon ces normes.<\/li>\n<\/ol>\n<p>Et c&rsquo;est ce que nous allons commencer \u00e0 faire avec ce post.<\/p>\n<h2>Commencer par les normes<\/h2>\n<p>Si vous \u00eates membre de ce site depuis un certain temps, vous savez que je pr\u00e9f\u00e8re utiliser Visual Studio Code. Sinon, j&rsquo;ai <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/visual-studio-code\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">toute une s\u00e9rie d&rsquo;articles<\/a><\/strong> consacr\u00e9s \u00e0 la fa\u00e7on dont je l&rsquo;utilise (et donc \u00e0 la fa\u00e7on dont nous l&rsquo;utiliserons tout au long de cette s\u00e9rie d&rsquo;articles).<\/p>\n<p>Et si vous \u00eates int\u00e9ress\u00e9 par la couverture concernant les normes de codage, le d\u00e9bogage, les IDE, les environnements de d\u00e9veloppement, etc., consultez <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">The Independent WordPress Developer<\/a><\/strong>.<\/p>\n<p>Cependant, je suppose que si vous lisez ceci, vous avez lu le mat\u00e9riel ci-dessus ou vous \u00eates \u00e0 l&rsquo;aise de parcourir tout le mat\u00e9riel ci-dessus.<\/p>\n<p>Cela dit, commen\u00e7ons.<\/p>\n<h3>T\u00e9l\u00e9chargement du r\u00e9f\u00e9rentiel<\/h3>\n<p>La premi\u00e8re chose que vous allez vouloir faire est de cloner une copie du r\u00e9f\u00e9rentiel. Je pr\u00e9f\u00e8re le faire via la ligne de commande.<\/p>\n<p>De plus, je pense aussi que cela vaut la peine de le faire contre <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/developper-des-plugins-et-des-themes-contre-wordpress-trunk\/\" title=\"la derni\u00e8re version de WordPress\">la derni\u00e8re version de WordPress<\/a><\/strong>. Si vous n&rsquo;avez pas de copie de la copie principale de Subversion de WordPress, vous pouvez lire comment la configurer ici ; cependant, ceci est purement facultatif. Vous pouvez suivre le reste de ce tutoriel tr\u00e8s bien avec n&rsquo;importe quelle version de WordPress que vous souhaitez.<\/p>\n<p>Faire cela,<\/p>\n<ol>\n<li>Assurez-vous que vous \u00eates dans le r\u00e9pertoire des <strong>plugins<\/strong> de votre installation WordPress<\/li>\n<li>Et puis entrez les commandes suivantes dans une copie de votre terminal<\/li>\n<\/ol>\n<pre><code>$ <\/code><\/pre>\n<p>Cela cr\u00e9era un\u00a0 r\u00e9pertoire <strong>WordPress-Widget-Boilerplate<\/strong> dans votre\u00a0 r\u00e9pertoire de <strong>plugins<\/strong>. Vous pouvez y acc\u00e9der en tapant simplement\u00a0:<\/p>\n<pre><code>$ cd WordPress-Widget-Boilerplate<\/code><\/pre>\n<p>Les r\u00e9sultats du clonage du r\u00e9f\u00e9rentiel devraient ressembler \u00e0 ceci\u00a0:<\/p>\n<p>Ensuite, vous devez vous assurer que vous passez \u00e0 la\u00a0 branche <strong>develop<\/strong> que j&rsquo;ai cr\u00e9\u00e9e. C&rsquo;est vraiment facile \u00e0 faire. Mais avant cela, pourquoi ne pas configurer le projet dans Visual Studio ?<\/p>\n<h3>Configuration du code Visual Studio<\/h3>\n<p>Les \u00e9tapes de configuration du projet dans Visual Studio Code sont simples\u00a0:<\/p>\n<ol>\n<li>Faites glisser le r\u00e9pertoire du Boilerplate dans l&rsquo;IDE,<\/li>\n<li>Ouvrez la borne int\u00e9gr\u00e9e,<\/li>\n<li>\u00c9changer des succursales<\/li>\n<\/ol>\n<p>Tout comme je l&rsquo;ai fait ci-dessus, je vais fournir un screencast sur la fa\u00e7on de faire tout cela. Faire glisser un r\u00e9pertoire dans Visual Studio Code devrait \u00eatre assez facile, mais \u00e9changer des branches sur la ligne de commande peut \u00eatre un peu diff\u00e9rent.<\/p>\n<p>Tout d&rsquo;abord, configurez le projet dans Visual Studio Code\u00a0:<\/p>\n<\/p>\n<p>Notez ici que j&rsquo;ouvre \u00e9galement le terminal int\u00e9gr\u00e9 en appuyant sur le raccourci CMD+P (je suis sur macOS donc votre raccourci peut \u00eatre diff\u00e9rent). Ensuite, j&rsquo;entre la commande pour v\u00e9rifier la branche <strong>develop .<\/strong><\/p>\n<p>Une fois que vous avez fait cela, votre r\u00e9f\u00e9rentiel local devrait basculer vers la branche develop. Vous pouvez confirmer qu&rsquo;il s&rsquo;agit de la succursale \u00e0 partir de laquelle vous travaillez en tapant\u00a0:<\/p>\n<pre><code>$ git branch<\/code><\/pre>\n<p>Et puis revoir le contenu du terminal. Strictement parlant, <strong>d\u00e9velopper<\/strong> doit \u00eatre mis en \u00e9vidence.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e7262e24cf5.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e7262e24cf5.png\" alt=\"Widgets WordPress\u00a0: commencer par les normes\"><\/a><\/p>\n<p>\u00c0 ce stade, nous allons introduire quelques nouveaux fichiers dans le projet. \u00c0 la fin de ce didacticiel, vous pouvez former un <strong>pull<\/strong> pour obtenir tout ce que je suis sur le point de documenter ici. Mais parce que le but de ce que nous faisons est double, il est important de s&rsquo;assurer que nous le faisons dans le bon ordre car la premi\u00e8re \u00e9tape est quelque chose que j&rsquo;utilise dans chaque projet pour WordPress \u00e0 ce stade.<\/p>\n<p>Donc, cela dit, jetons un coup d&rsquo;\u0153il.<\/p>\n<h3>Compositeur et qualit\u00e9 du code<\/h3>\n<p>La premi\u00e8re chose que j&rsquo;aime faire est de mettre en place une s\u00e9rie d&rsquo;outils pour faire respecter la qualit\u00e9 du code. Ceci est r\u00e9alis\u00e9 par une vari\u00e9t\u00e9 de packages Composer. Ceux-ci inclus:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpro\/grumphp\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GrumPHP<\/a>. Un outil de qualit\u00e9 de code PHP. Ne sous-estimez pas la clart\u00e9 et la mesure dans laquelle ce r\u00e9f\u00e9rentiel regorge d&rsquo;informations. Si jamais vous \u00eates bloqu\u00e9 avec l&rsquo;un des autres outils mentionn\u00e9s ici, consultez d&rsquo;abord la documentation de ce r\u00e9f\u00e9rentiel.<\/li>\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fixateur PHP CS<\/a>. Un outil pour r\u00e9soudre automatiquement les probl\u00e8mes de normes de codage PHP.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/JakubOnderka\/PHP-Parallel-Lint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Parall\u00e8le Lint<\/a><\/strong>. Cet outil v\u00e9rifie la syntaxe des fichiers PHP plus rapidement que la v\u00e9rification en s\u00e9rie avec une sortie plus sophistiqu\u00e9e.<\/li>\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPMD<\/a>. Cet utilitaire prend une base de code source PHP donn\u00e9e et recherche plusieurs probl\u00e8mes potentiels dans cette source<\/li>\n<li><a href=\"https:\/\/github.com\/nikic\/PHP-Parser\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Analyseur PHP<\/a>. Un analyseur est utile pour <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_program_analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;analyse statique<\/a>, la manipulation de code et, fondamentalement, toute autre application traitant du code par programmation.<\/li>\n<li><a href=\"https:\/\/github.com\/Ocramius\/ProxyManager\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Gestionnaire de proxy<\/a>. Cette biblioth\u00e8que vise \u00e0 fournir une abstraction pour g\u00e9n\u00e9rer diff\u00e9rents types de classes proxy.<\/li>\n<\/ul>\n<p>Je veux \u00eatre clair sur deux choses :<\/p>\n<ol>\n<li>Les outils ci-dessus sont le strict minimum que j&rsquo;utilise, et vous me verrez probablement utiliser des outils suppl\u00e9mentaires \u00e0 l&rsquo;avenir,<\/li>\n<li>les outils ci-dessus aideront \u00e0 appliquer les r\u00e8gles de qualit\u00e9 du code avant de v\u00e9rifier le code dans un r\u00e9f\u00e9rentiel. Il est destin\u00e9 \u00e0 compl\u00e9ter la configuration de votre IDE.<\/li>\n<\/ol>\n<p>Pour que ces outils soient configur\u00e9s et ex\u00e9cut\u00e9s dans le projet, nous devrons cr\u00e9er un\u00a0 fichier <strong>composer.json<\/strong> qui ressemble <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a><\/strong>\u00a0:<\/p>\n<pre><code>{\n    \"name\": \"wordpress-widget-boilerplate\/wordpress-widget-boilerplate\",\n    \"description\": \"An organized, maintainable boilerplate for building widgets using WordPress best practices.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"homepage\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@pressware.co\",\n        \"homepage\": \"https:\/\/pressware.co\"\n      }\n    ],\n    \"support\": {\n      \"issues\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/issues\"\n    },\n    \"config\": {\n      \"preferred-install\": \"dist\",\n      \"platform\": {\n          \"php\": \"7.1\"\n      }\n    },\n    \"repositories\": [\n      {\n        \"type\": \"composer\",\n        \"url\": \"https:\/\/wpackagist.org\"\n      }\n    ],\n    \"require\": {\n      \"php\": \"7.1\",\n      \"composer\/installers\": \"^1.4\"\n    },\n    \"require-dev\": {\n        \"friendsofphp\/php-cs-fixer\": \"^2.13.1\",\n        \"jakub-onderka\/php-parallel-lint\": \"^1.0.0\",\n        \"phpmd\/phpmd\": \"^v2.6.0\",\n        \"nikic\/php-parser\": \"^4.0\",\n        \"ocramius\/proxy-manager\": \"^2.0.0\",\n        \"phpro\/grumphp\": \"^0.13.1\"\n    },\n    \"scripts\": {\n      \"test\": [\n        \".\/vendor\/bin\/grumphp run\"\n      ]\n    },\n    \"minimum-stability\": \"stable\"\n  }<\/code><\/pre>\n<p>N&rsquo;oubliez pas que vous pouvez le faire manuellement \u00e0 la fin de cet article. Si, toutefois, vous souhaitez suivre, n&rsquo;h\u00e9sitez pas \u00e0 le faire manuellement. Je ne voudrais jamais vous en d\u00e9courager. \ud83d\ude42<\/p>\n<p>Une fois que vous avez cr\u00e9\u00e9 le\u00a0 fichier <strong>composer.json<\/strong>, vous devez vous assurer que vous ex\u00e9cutez la commande suivante depuis le terminal\u00a0:<\/p>\n<pre><code>$ composer install<\/code><\/pre>\n<p>Cela peut prendre un certain temps; cependant, une fois que c&rsquo;est fait, le message suivant devrait s&rsquo;afficher\u00a0:<\/p>\n<blockquote>\n<p>Fais attention! GrumPHP renifle vos commits !<\/p>\n<\/blockquote>\n<p>Pour lui donner un essai, entrez la commande suivante dans votre terminal\u00a0:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Selon la fa\u00e7on dont vous travaillez avec le projet, vous pouvez voir une sortie qui ressemble \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e72631d3f32.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e72631d3f32.gif\" alt=\"Widgets WordPress\u00a0: commencer par les normes\"><\/a><\/p>\n<p>Mais il reste encore du travail \u00e0 faire. A savoir, nous devons :<\/p>\n<ul>\n<li>mettre \u00e0 jour notre\u00a0 fichier <strong>.gitignore<\/strong> ,<\/li>\n<li>introduire la configuration pour GrumPHP<\/li>\n<li>introduire la configuration pour PHPMD,<\/li>\n<li>introduire la configuration de PHPCS,<\/li>\n<li>\u00e9ventuellement, restructurez la structure de r\u00e9pertoires du passe-partout.<\/li>\n<\/ul>\n<p>Tout jusqu&rsquo;\u00e0 l&rsquo;\u00e9tape finale, nous allons nous efforcer de le faire dans ce post.<\/p>\n<h3>Mise \u00e0 jour du fichier Ignorer<\/h3>\n<p>Tout d&rsquo;abord, nous ne voulons pas valider le r\u00e9pertoire du fournisseur ou le fichier de verrouillage du compositeur. Ceux-ci peuvent \u00eatre g\u00e9n\u00e9r\u00e9s chaque fois qu&rsquo;un utilisateur t\u00e9l\u00e9charge le r\u00e9pertoire. Ils peuvent facilement se d\u00e9synchroniser et ils ajoutent une taille \u00e9norme au r\u00e9pertoire du projet.<\/p>\n<p>Pour cela, votre fichier <strong>gitignore<\/strong> devrait ressembler <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-01-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a><\/strong> :<\/p>\n<pre><code>*.DS_Store\n*.log\nwp-config.php\nwp-content\/advanced-cache.php\nwp-content\/backup-db\/\nwp-content\/backups\/\nwp-content\/blogs.dir\/\nwp-content\/cache\/\nwp-content\/upgrade\/\nwp-content\/uploads\/\nwp-content\/mu-plugins\/\nwp-content\/wp-cache-config.php\nwp-content\/plugins\/hello.php\n\n\/.htaccess\n\/license.txt\n\/readme.html\n\/sitemap.xml\n\/sitemap.xml.gz\n\nvendor\/\ncomposer.lock<\/code><\/pre>\n<p>Cela indique au plugin d&rsquo;ignorer tout ce qui se trouve \u00e0 la racine du r\u00e9pertoire du plugin (et certains des r\u00e9pertoires \u00e9ventuels que nous cr\u00e9erons) ainsi que certains fichiers de base que nous avons l&rsquo;habitude de voir dans les installations WordPress.<\/p>\n<p>Certains de ce que vous voyez, tels que <strong>wp-config.php<\/strong> ou <strong>wp-content\/backups<\/strong>, ne seront probablement jamais vus dans le contexte d&rsquo;un plugin, mais ce sont des directives d&rsquo;ignorance WordPress standard que j&rsquo;aime garder \u00e0 port\u00e9e de main.<\/p>\n<p>Vous remarquerez que j&rsquo;ai \u00e9galement ajout\u00e9 <strong>le fournisseur\u00a0<\/strong> et le fichier de verrouillage du compositeur au bas du fichier.<\/p>\n<h3>Configurer GrumPHP<\/h3>\n<p>GrumPHP peut faire beaucoup, et si vous avez pass\u00e9 du temps \u00e0 parcourir le r\u00e9f\u00e9rentiel avant de lire jusqu&rsquo;ici, alors vous le savez probablement ; cependant, je vais le garder aussi simple que possible, afin qu&rsquo;il fournisse les instructions dont il a besoin pour les outils que nous utilisons <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-02-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">et rien de plus<\/a><\/strong>.<\/p>\n<pre><code>parameters:\n    git_dir: .git\n    bin_dir: vendor\/bin\n    process_timeout: 120\n    tasks:\n      securitychecker:\n      composer:\n      jsonlint:\n      xmllint:\n      yamllint:\n      phplint:\n        exclude:\n          - vendor\/\n      phpcs:\n        metadata:\n          priority: 200\n      phpcsfixer2:\n        allow_risky: true\n        config: '.php_cs.dist'\n        metadata:\n          priority: 300\n      phpparser:\n        visitors:\n          forbidden_function_calls:\n            blacklist:\n              - \"exit\"\n              - \"var_dump\"\n      phpversion:\n        project: '7.1'\n      phpmd:\n        exclude: ['vendor']\n        ruleset: ['phpmd.xml']<\/code><\/pre>\n<p>En bref, cela signifie ex\u00e9cuter une vari\u00e9t\u00e9 de v\u00e9rifications pour\u00a0:<\/p>\n<ul>\n<li>S\u00e9curit\u00e9,<\/li>\n<li>compositeur,<\/li>\n<li>JSON,<\/li>\n<li>XML,<\/li>\n<li>Yaml,<\/li>\n<li>PHP,<\/li>\n<li>PHPCS,<\/li>\n<li>Analyseur PHP,<\/li>\n<li>PHPMD,<\/li>\n<li>et plus.<\/li>\n<\/ul>\n<p>Une fois que nous aurons termin\u00e9 de configurer tout le reste, je ne manquerai pas de vous montrer comment tout cela s&#8217;embo\u00eete. Mais d&rsquo;abord, finissons de configurer le reste de nos utilitaires.<\/p>\n<h3>PHPCS<\/h3>\n<p>Cela utilise deux fichiers distincts &#8211; un\u00a0 fichier <strong>dist<\/strong> et un\u00a0 fichier <strong>XML<\/strong> &#8211; chacun ayant des objectifs diff\u00e9rents, bien que tr\u00e8s utiles.<\/p>\n<p>Le premier fichier, <strong>php_cs.dist<\/strong> que vous verrez dans le r\u00e9f\u00e9rentiel \u00e0 la fin de cet article, fournit un en-t\u00eate appliqu\u00e9 \u00e0 tous les fichiers PHP de notre projet. Il applique \u00e9galement certaines r\u00e8gles diff\u00e9rentes qui am\u00e9liorent la qualit\u00e9 du code.<\/p>\n<p>Les r\u00e8gles s&rsquo;expliquent d&rsquo;elles-m\u00eames et vous pouvez voir ce qu&rsquo;elles appliqueront simplement en parcourant chacune des r\u00e8gles <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-03-phpcs-dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">d\u00e9finies<\/a><\/strong>.<\/p>\n<pre><code>&lt;?php\n\n$header = &lt;&lt;&lt;'EOF'\nThis file is part of the WordPress Widget Boilerplate\n(c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n\nThis source file is subject to the GPL license that is bundled\nwith this source code in the file LICENSE.\nEOF;\n\nreturn PhpCsFixerConfig::create()\n  -&gt;setRiskyAllowed(true)\n  -&gt;setRules([\n    '@PHP56Migration' =&gt; true,\n    '@Symfony' =&gt; true,\n    '@Symfony:risky' =&gt; true,\n    'align_multiline_comment' =&gt; true,\n    'array_syntax' =&gt; ['syntax' =&gt; 'short'],\n    'blank_line_before_statement' =&gt; true,\n    'combine_consecutive_issets' =&gt; true,\n    'combine_consecutive_unsets' =&gt; true,\n    \/\/ one should use PHPUnit methods to set up expected exception instead of annotations\n    'general_phpdoc_annotation_remove' =&gt; ['annotations' =&gt; ['expectedException', 'expectedExceptionMessage', 'expectedExceptionMessageRegExp']],\n    'header_comment' =&gt; ['header' =&gt; $header],\n    'heredoc_to_nowdoc' =&gt; true,\n    'list_syntax' =&gt; ['syntax' =&gt; 'long'],\n    'method_argument_space' =&gt; ['ensure_fully_multiline' =&gt; true],\n    'method_chaining_indentation' =&gt; false,\n    'no_extra_consecutive_blank_lines' =&gt; ['tokens' =&gt; ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block']],\n    'no_null_property_initialization' =&gt; true,\n    'no_short_echo_tag' =&gt; true,\n    'no_unneeded_curly_braces' =&gt; true,\n    'no_unneeded_final_method' =&gt; true,\n    'no_unreachable_default_argument_value' =&gt; true,\n    'no_useless_else' =&gt; true,\n    'no_useless_return' =&gt; true,\n    'ordered_class_elements' =&gt; true,\n    'ordered_imports' =&gt; true,\n    'php_unit_construct' =&gt; true,\n    'php_unit_test_class_requires_covers' =&gt; true,\n    'php_unit_dedicate_assert' =&gt; true,\n    'phpdoc_add_missing_param_annotation' =&gt; true,\n    'phpdoc_order' =&gt; true,\n    'phpdoc_types_order' =&gt; ['null_adjustment' =&gt; 'always_last'],\n    'semicolon_after_instruction' =&gt; true,\n    'single_line_comment_style' =&gt; true,\n    'visibility_required' =&gt; ['const', 'property', 'method'],\n    'yoda_style' =&gt; true,\n  ])\n  -&gt;setFinder(\n    PhpCsFixerFinder::create()\n      -&gt;exclude(__DIR__. '\/vendor\/*')\n      -&gt;in([\n        __DIR__. '\/src'\n      ])) ;<\/code><\/pre>\n<p>Ensuite, vous voudrez \u00e9galement cr\u00e9er le fichier XML pour compl\u00e9ter le fichier ci-dessus. Vous remarquerez que dans le fichier que je vous fournis, c&rsquo;est ce que j&rsquo;utilise pour mon travail chez <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a><\/strong>. De plus, il reconna\u00eet \u00e9galement le\u00a0 r\u00e9pertoire des <strong>tests<\/strong>.<\/p>\n<p>\u00c0 ce stade, nous n&rsquo;avons pas \u00e9crit de tests unitaires, mais si vous choisissez de les introduire dans votre widget, celui-ci sera pr\u00eat \u00e0 les g\u00e9rer correctement.<\/p>\n<pre><code>&lt;?xml version=\"1.0\"?&gt;\n&lt;ruleset name=\"Pressware\"&gt;\n    &lt;description&gt;Pressware, LLC Coding Standards&lt;\/description&gt;\n\n    &lt;!-- Scan all files in directory --&gt;\n    &lt;file&gt;.\/src&lt;\/file&gt;\n    &lt;file&gt;.\/tests&lt;\/file&gt;\n    &lt;exclude-pattern&gt;.\/tests\/phpunit\/*&lt;\/exclude-pattern&gt;\n    &lt;!-- Scan only PHP files --&gt;\n    &lt;arg name=\"extensions\" value=\"php\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Show colors in console --&gt;\n    &lt;arg value=\"-colors\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Show sniff codes in all reports --&gt;\n    &lt;arg value=\"ns\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Use PSR-2 as a base --&gt;\n    &lt;rule ref=\"PSR2\"&gt;&lt;\/rule&gt;\n    &lt;rule ref=\"Generic.Arrays.DisallowLongArraySyntax.Found\" &gt;&lt;\/rule&gt;\n\n    &lt;!-- Force 2 spaces indentation --&gt;\n    &lt;rule ref=\"Generic.WhiteSpace.ScopeIndent\"&gt;\n        &lt;properties&gt;\n            &lt;property name=\"indent\" value=\"4\"&gt;&lt;\/property&gt;\n            &lt;property name=\"tabIndent\" value=\"false\"&gt;&lt;\/property&gt;\n        &lt;\/properties&gt;\n    &lt;\/rule&gt;\n&lt;\/ruleset&gt;<\/code><\/pre>\n<p>Il n&rsquo;y a qu&rsquo;un petit ensemble de configuration que je sp\u00e9cifie ici, mais je l&rsquo;ai trouv\u00e9 plus que suffisant pour mes besoins jusqu&rsquo;\u00e0 pr\u00e9sent. Au fur et \u00e0 mesure que j&rsquo;en d\u00e9couvre ou que j&rsquo;opte pour en utiliser davantage, je mettrai certainement \u00e0 jour le contenu dans les prochains articles.<\/p>\n<h3>Configurer PHPMD<\/h3>\n<p>Et enfin, nous devons configurer le PHP Mess Detector (ou PHPMD). Heureusement, cela utilise un fichier XML qui utilisera les ensembles de r\u00e8gles d\u00e9finis dans le package install\u00e9 par Composer. Tout ce que nous avons \u00e0 faire est de r\u00e9f\u00e9rencer la r\u00e8gle dans le fichier de configuration.<\/p>\n<p>Deuxi\u00e8mement, nous fournirons \u00e9galement une petite exclusion pour un\u00a0 nom <strong>ShortVariable<\/strong> comme vous le verrez dans l&rsquo; <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-05-phpmd-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">essentiel suivant<\/a><\/strong>\u00a0:<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;\n&lt;ruleset\n    name=\"VersionEyeModule rules\"\n    xmlns=\"http:\/\/pmd.sf.net\/ruleset\/1.0.0\"\n    xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n    xsi:schemaLocation=\"http:\/\/pmd.sf.net\/ruleset\/1.0.0 http:\/\/pmd.sf.net\/ruleset_xml_schema.xsd\"\n    xsi:noNamespaceSchemaLocation=\"http:\/\/pmd.sf.net\/ruleset_xml_schema.xsd\"\n&gt;\n    &lt;rule ref=\"rulesets\/cleancode.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/codesize.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/controversial.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/design.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/unusedcode.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/naming.xml\"&gt;\n        &lt;exclude name=\"ShortVariable\"&gt;&lt;\/exclude&gt;\n    &lt;\/rule&gt;\n\n    &lt;rule ref=\"rulesets\/naming.xml\/ShortVariable\"\n          since=\"0.2\"\n          message=\"Avoid variables with short names like {0}. Configured minimum length is {1}.\"\n          class=\"PHPMDRuleNamingShortVariable\"\n          externalInfoUrl=\"http:\/\/phpmd.org\/rules\/naming.html#shortvariable\"&gt;\n        &lt;priority&gt;3&lt;\/priority&gt;\n        &lt;properties&gt;\n            &lt;property name=\"minimum\" description=\"Minimum length for a variable, property or parameter name\" value=\"3\"&gt;&lt;\/property&gt;\n            &lt;property name=\"exceptions\" value=\"id,q,w,i,j,v,e,f,fp\" &gt;&lt;\/property&gt;\n        &lt;\/properties&gt;\n    &lt;\/rule&gt;\n&lt;\/ruleset&gt;<\/code><\/pre>\n<p>Et une fois que tout cela est en place, nous devrions pouvoir ex\u00e9cuter \u00e0 nouveau GrumPHP, \u00e0 partir de la ligne de commande, et avoir un ensemble de r\u00e9sultats l\u00e9g\u00e8rement diff\u00e9rent.<\/p>\n<h3>Ex\u00e9cuter \u00e0 nouveau GrumPHP<\/h3>\n<p>Entrez ce qui suit dans votre terminal\u00a0:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Et vous devriez voir quelque chose comme \u00e7a :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e726340729e.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e726340729e.gif\" alt=\"Widgets WordPress\u00a0: commencer par les normes\"><\/a><\/p>\n<p>Des r\u00e9sultats diff\u00e9rents de la premi\u00e8re fois, hein\u00a0? C&rsquo;est parce que nous enfreignons certaines r\u00e8gles et normes qui font partie int\u00e9grante de PHP et du d\u00e9veloppement orient\u00e9 objet.<\/p>\n<p>Et c&rsquo;est ce que nous allons nettoyer dans le prochain article.<\/p>\n<h2>\u00c0 venir<\/h2>\n<p>Alors d&rsquo;o\u00f9 vient la nature orient\u00e9e objet de ceci? Jusqu&rsquo;\u00e0 pr\u00e9sent, nous avons parl\u00e9 d&rsquo;utiliser l&rsquo;API Widgets comme mod\u00e8le orient\u00e9 objet pour \u00e9crire du code orient\u00e9 objet dans WordPress.<\/p>\n<p>Une partie de ce que nous avons fait jusqu&rsquo;\u00e0 pr\u00e9sent a \u00e9t\u00e9 exactement cela (en parlant de ses principes, en voyant comment il est pr\u00e9sent\u00e9, et plus encore).<\/p>\n<p>Mais comme je l&rsquo;ai mentionn\u00e9 au d\u00e9but de cet article, la mise en place d&rsquo;outils de qualit\u00e9 de code nous fournit d&rsquo;abord une base que nous pouvons utiliser lorsque nous refactorisons le passe-partout (ce que nous devons clairement faire compte tenu de la quantit\u00e9 de rouge affich\u00e9e par GrumPHP).<\/p>\n<p>Et c&rsquo;est l\u00e0 que nous commencerons dans le prochain article de cette s\u00e9rie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;une des meilleures fa\u00e7ons d&rsquo;aborder la programmation orient\u00e9e objet consiste \u00e0 commencer par des normes et \u00e0 disposer d&rsquo;outils pour les appliquer.<\/p>\n","protected":false},"author":1,"featured_media":235870,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,862],"tags":[1167],"class_list":["post-231085","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=231085"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231085\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/235870"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}