{"id":230592,"date":"2022-12-14T16:28:00","date_gmt":"2022-12-14T13:28:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230592"},"modified":"2022-12-14T16:28:14","modified_gmt":"2022-12-14T13:28:14","slug":"wordpress-widgets-boerjar-med-standarder","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-boerjar-med-standarder\/","title":{"rendered":"WordPress-widgets: B\u00f6rjar med standarder"},"content":{"rendered":"\n<p>Syftet med den h\u00e4r serien \u00e4r att b\u00f6rja g\u00f6ra en djupare dykning i arbetet med objektorienterad programmering i WordPress-sammanhang.<\/p>\n<p>Och eftersom WordPress Widgets API \u00e4r en av API:erna som anv\u00e4nder objektorienterade metoder, \u00e4r det ett logiskt st\u00e4lle att b\u00f6rja. Vidare kommer det att ge oss n\u00e5gra grundl\u00e4ggande tekniker som vi kan anv\u00e4nda f\u00f6r att till\u00e4mpa p\u00e5 framtida arbete n\u00e4r vi ser hur man bygger mer objektorienterade projekt p\u00e5 WordPress i framtida serier.<\/p>\n<p>Hittills har vi t\u00e4ckt f\u00f6ljande:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-ett-objektorienterat-tillvaegagaangssaett\/\" title=\"WordPress-widgets: ett objektorienterat tillv\u00e4gag\u00e5ngss\u00e4tt\">WordPress-widgets: ett objektorienterat tillv\u00e4gag\u00e5ngss\u00e4tt<\/a>. Widgets API ger ett gediget lackmustest och exempel p\u00e5 hur man kommer ig\u00e5ng med objektorienterad programmering i WordPress.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-upptaeck-objektorienterad-programmering\/\" title=\"WordPress-widgets: Hur man uppt\u00e4cker objektorienterad programmering\">WordPress-widgets: Hur man uppt\u00e4cker objektorienterad programmering<\/a>. M\u00e5let \u00e4r att bev\u00e4pna dig med allt du beh\u00f6ver f\u00f6r att uppt\u00e4cka objektorienterade metoder.<\/li>\n<\/ol>\n<p>Om du inte \u00e4r ikapp \u00e4r det nu ett bra tillf\u00e4lle att g\u00f6ra det. Och om du har, kommer du att minnas fr\u00e5n det f\u00f6rra inl\u00e4gget, vi avslutade med f\u00f6ljande anteckning:<\/p>\n<blockquote>\n<p>Det vill s\u00e4ga, vi kommer att \u00e5terbes\u00f6ka <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> och jag kommer att omstrukturera den i dess nuvarande tillst\u00e5nd f\u00f6r att anta mer moderna PHP-standarder.<\/p>\n<\/blockquote>\n<p>F\u00f6r att b\u00f6rja uppdatera WordPress Widget Boilerplate f\u00f6r att f\u00f6lja n\u00e4mnda standarder m\u00e5ste vi g\u00f6ra n\u00e5gra saker:<\/p>\n<ol>\n<li>skapa en gren fr\u00e5n den befintliga pannplattan,<\/li>\n<li>installera verktyg f\u00f6r kodkvalitet,<\/li>\n<li>se till att v\u00e5r IDE \u00e4r korrekt inst\u00e4lld,<\/li>\n<li>och b\u00f6rja omfaktorisera koden till n\u00e4mnda standarder.<\/li>\n<\/ol>\n<p>Och det \u00e4r vad vi ska b\u00f6rja g\u00f6ra med det h\u00e4r inl\u00e4gget.<\/p>\n<h2>B\u00f6rjar med standarder<\/h2>\n<p>Om du har varit medlem p\u00e5 den h\u00e4r webbplatsen ett tag, d\u00e5 vet du att jag f\u00f6redrar att anv\u00e4nda Visual Studio Code. Om inte, har jag <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/visual-studio-code\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en hel upps\u00e4ttning artiklar<\/a><\/strong> som \u00e4gnas \u00e5t hur jag anv\u00e4nder det (och d\u00e4rmed hur vi kommer att anv\u00e4nda det i den h\u00e4r serien av inl\u00e4gg).<\/p>\n<p>Och om du \u00e4r intresserad av t\u00e4ckning ang\u00e5ende kodningsstandarder, fels\u00f6kning, IDE, utvecklingsmilj\u00f6er och s\u00e5 vidare, kolla in <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>Jag antar dock att om du l\u00e4ser detta s\u00e5 har du l\u00e4st igenom materialet ovan eller s\u00e5 \u00e4r du bekv\u00e4m med att g\u00e5 igenom allt material ovan.<\/p>\n<p>Med det sagt, l\u00e5t oss b\u00f6rja.<\/p>\n<h3>Laddar ned arkivet<\/h3>\n<p>Det f\u00f6rsta du kommer att vilja g\u00f6ra \u00e4r att klona en kopia av f\u00f6rvaret. Jag f\u00f6redrar att g\u00f6ra detta via kommandoraden.<\/p>\n<p>Dessutom tycker jag ocks\u00e5 att det \u00e4r v\u00e4rt att g\u00f6ra det mot <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/utveckla-plugins-och-teman-mot-wordpress-trunk\/\" title=\"den senaste versionen av WordPress\">den senaste versionen av WordPress<\/a><\/strong>. Om du inte har en kopia av Subversions trunkkopia av WordPress kan du l\u00e4sa hur du st\u00e4ller in det h\u00e4r; detta \u00e4r dock helt valfritt. Du kan f\u00f6lja med resten av denna handledning alldeles utm\u00e4rkt med vilken version av WordPress du vill.<\/p>\n<p>Att g\u00f6ra s\u00e5,<\/p>\n<ol>\n<li>Se till att du \u00e4r i <strong>plugins-<\/strong> katalogen f\u00f6r din WordPress-installation<\/li>\n<li>Och skriv sedan in f\u00f6ljande kommandon i en kopia av din terminal<\/li>\n<\/ol>\n<pre><code>$ <\/code><\/pre>\n<p>Detta kommer att skapa en <strong>WordPress-Widget-Boilerplate-<\/strong> katalog i din <strong>plugin<\/strong> &#8211; katalog. Du kan navigera till det genom att enkelt skriva:<\/p>\n<pre><code>$ cd WordPress-Widget-Boilerplate<\/code><\/pre>\n<p>Resultaten av att klona f\u00f6rvaret b\u00f6r se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p>D\u00e4refter m\u00e5ste du se till att du byter till <strong>utvecklingsgrenen<\/strong> som jag har skapat. Det \u00e4r verkligen l\u00e4tt att g\u00f6ra det h\u00e4r. Men innan vi g\u00f6r det, varf\u00f6r inte s\u00e4tta upp projektet i Visual Studio?<\/p>\n<h3>Konfigurera Visual Studio Code<\/h3>\n<p>Stegen f\u00f6r att st\u00e4lla in projektet i Visual Studio Code \u00e4r enkla:<\/p>\n<ol>\n<li>Dra katalogen f\u00f6r Boilerplate till IDE,<\/li>\n<li>\u00d6ppna den integrerade terminalen,<\/li>\n<li>Byt grenar<\/li>\n<\/ol>\n<p>Precis som jag har gjort ovan kommer jag att ge en screencast om hur man g\u00f6r allt detta. Att dra en katalog till Visual Studio Code borde vara l\u00e4tt nog, men att byta grenar p\u00e5 kommandoraden kan vara lite annorlunda.<\/p>\n<p>St\u00e4ll f\u00f6rst in projektet i Visual Studio Code:<\/p>\n<\/p>\n<p>L\u00e4gg m\u00e4rke till att jag ocks\u00e5 \u00f6ppnar den integrerade terminalen genom att trycka p\u00e5 CMD+P-genv\u00e4gen (jag anv\u00e4nder macOS s\u00e5 din genv\u00e4g kan vara annorlunda). Sedan skriver jag in kommandot f\u00f6r att kolla in <strong>utveckla<\/strong> grenen.<\/p>\n<p>N\u00e4r du har gjort detta b\u00f6r ditt lokala arkiv byta \u00f6ver till utvecklingsgrenen. Du kan bekr\u00e4fta att det \u00e4r grenen som du arbetar med genom att skriva:<\/p>\n<pre><code>$ git branch<\/code><\/pre>\n<p>Och granska sedan inneh\u00e5llet i terminalen. Str\u00e4ngt taget b\u00f6r <strong>utveckla lyftas fram.<\/strong><\/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=\"WordPress-widgets: B\u00f6rjar med standarder\"><\/a><\/p>\n<p>Vid det h\u00e4r laget kommer vi att introducera n\u00e5gra nya filer i projektet. I slutet av den h\u00e4r handledningen kan du skapa en <strong>dragning<\/strong> f\u00f6r att f\u00e5 allt som jag ska dokumentera h\u00e4r. Men eftersom syftet med det vi g\u00f6r \u00e4r dubbelt s\u00e5 \u00e4r det viktigt att se till att vi g\u00f6r detta i r\u00e4tt ordning eftersom det f\u00f6rsta steget \u00e4r n\u00e5got som jag anv\u00e4nder i varje enskilt projekt f\u00f6r WordPress vid det h\u00e4r laget.<\/p>\n<p>S\u00e5 med det sagt, l\u00e5t ta en titt.<\/p>\n<h3>Komposit\u00f6r och kodkvalitet<\/h3>\n<p>Det f\u00f6rsta jag gillar att g\u00f6ra \u00e4r att st\u00e4lla in en serie verktyg f\u00f6r att framtvinga kodkvalitet. Detta uppn\u00e5s med en m\u00e4ngd olika Composer-paket. Dessa inkluderar:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpro\/grumphp\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GrumPHP<\/a>. Ett verktyg f\u00f6r PHP-kodkvalitet. Underskatta inte f\u00f6rtydligandet och i vilken grad detta f\u00f6rr\u00e5d \u00e4r fullt av information. Om du n\u00e5gonsin fastnar med n\u00e5got av de andra verktygen som n\u00e4mns h\u00e4r, titta igenom dokumentationen i det h\u00e4r arkivet f\u00f6rst.<\/li>\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP CS Fixer<\/a>. Ett verktyg f\u00f6r att automatiskt fixa problem med PHP-kodningsstandarder.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/JakubOnderka\/PHP-Parallel-Lint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Parallell Lint<\/a><\/strong>. Det h\u00e4r verktyget kontrollerar syntaxen f\u00f6r PHP-filer snabbare \u00e4n seriell kontroll med en snyggare utdata.<\/li>\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPMD<\/a>. Det h\u00e4r verktyget tar en given PHP-k\u00e4llkodsbas och letar efter flera potentiella problem inom den k\u00e4llan<\/li>\n<li><a href=\"https:\/\/github.com\/nikic\/PHP-Parser\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Parser<\/a>. En parser \u00e4r anv\u00e4ndbar f\u00f6r <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_program_analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">statisk analys<\/a>, manipulation av kod och i princip alla andra applikationer som hanterar kod programmatiskt.<\/li>\n<li><a href=\"https:\/\/github.com\/Ocramius\/ProxyManager\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Proxy Manager<\/a>. Detta bibliotek syftar till att tillhandah\u00e5lla en abstraktion f\u00f6r att generera olika typer av proxyklasser.<\/li>\n<\/ul>\n<p>Jag vill vara tydlig med tv\u00e5 saker:<\/p>\n<ol>\n<li>Ovanst\u00e5ende verktyg \u00e4r det absoluta minimum som jag anv\u00e4nder, och du kommer sannolikt att se mig anv\u00e4nda ytterligare verktyg i framtiden,<\/li>\n<li>verktygen ovan hj\u00e4lper till att uppr\u00e4tth\u00e5lla regler f\u00f6r kodkvalitet innan du checkar in kod i ett arkiv. Det \u00e4r t\u00e4nkt att komplettera uppst\u00e4llningen i din IDE.<\/li>\n<\/ol>\n<p>F\u00f6r att f\u00e5 dessa verktyg konfigurerade och k\u00f6rda inom projektet m\u00e5ste vi skapa en <strong>composer.json<\/strong> -fil som ser <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/a><\/strong> :<\/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>Kom ih\u00e5g att du kan dra ner detta manuellt i slutet av det h\u00e4r inl\u00e4gget. Om du d\u00e4remot vill f\u00f6lja med kan du g\u00f6ra detta manuellt. Jag skulle aldrig vilja avskr\u00e4cka dig fr\u00e5n det. \ud83d\ude42<\/p>\n<p>N\u00e4r du har skapat\u00a0 filen <strong>composer.json<\/strong> vill du se till att du k\u00f6r f\u00f6ljande kommando fr\u00e5n terminalen:<\/p>\n<pre><code>$ composer install<\/code><\/pre>\n<p>Detta kan ta lite tid; men n\u00e4r det \u00e4r gjort b\u00f6r du f\u00e5 f\u00f6ljande meddelande:<\/p>\n<blockquote>\n<p>Se upp! GrumPHP sniffar dina \u00e5taganden!<\/p>\n<\/blockquote>\n<p>F\u00f6r att ge det en torrk\u00f6rning, skriv in f\u00f6ljande kommando i din terminal:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Beroende p\u00e5 hur du arbetar med projektet kan du se utdata som ser ut ungef\u00e4r s\u00e5 h\u00e4r:<\/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=\"WordPress-widgets: B\u00f6rjar med standarder\"><\/a><\/p>\n<p>Men det finns mer att g\u00f6ra. Vi beh\u00f6ver n\u00e4mligen:<\/p>\n<ul>\n<li>uppdatera v\u00e5r <strong>.gitignore<\/strong> -fil,<\/li>\n<li>introducera konfiguration f\u00f6r GrumPHP<\/li>\n<li>introducera konfiguration f\u00f6r PHPMD,<\/li>\n<li>introducera konfiguration f\u00f6r PHPCS,<\/li>\n<li>s\u00e5 sm\u00e5ningom, strukturera om boilerplates katalogstruktur.<\/li>\n<\/ul>\n<p>Allt fram till det sista steget kommer vi att sikta p\u00e5 att g\u00f6ra i det h\u00e4r inl\u00e4gget.<\/p>\n<h3>Uppdaterar Ignorera-filen<\/h3>\n<p>F\u00f6r det f\u00f6rsta vill vi inte commitera leverant\u00f6rskatalogen eller komposit\u00f6rens l\u00e5sfil. Dessa kan genereras n\u00e4r en anv\u00e4ndare laddar ner katalogen. De kan l\u00e4tt falla ur synk och de l\u00e4gger till enorm storlek till projektets katalog.<\/p>\n<p>F\u00f6r det \u00e4ndam\u00e5let b\u00f6r din <strong>gitignore<\/strong> -fil se <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-01-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/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>Detta s\u00e4ger \u00e5t plugin-programmet att ignorera allt utom det som finns i roten av plugin-katalogen (och n\u00e5gra av de eventuella katalogerna vi kommer att skapa) tillsammans med n\u00e5gra grundl\u00e4ggande filer som vi \u00e4r vana vid att se i WordPress-installationer.<\/p>\n<p>En del av det du ser, som <strong>wp-config.php<\/strong> eller <strong>wp-content\/backups,<\/strong> kommer du aldrig att se i samband med ett plugin, men det h\u00e4r \u00e4r standarddirektiv f\u00f6r WordPress som jag vill ha till hands.<\/p>\n<p>Du kommer att m\u00e4rka att jag ocks\u00e5 har lagt till <strong>leverant\u00f6rs-\u00a0<\/strong> och komposit\u00f6rl\u00e5sfilen l\u00e4ngst ned i filen.<\/p>\n<h3>Konfigurera GrumPHP<\/h3>\n<p>GrumPHP kan g\u00f6ra mycket, och om du \u00e4gnade tid \u00e5t att granska f\u00f6rvaret innan du l\u00e4ste s\u00e5 h\u00e4r l\u00e5ngt, s\u00e5 vet du f\u00f6rmodligen det; Jag kommer dock att h\u00e5lla den s\u00e5 smal som m\u00f6jligt, s\u00e5 den ger instruktionerna den beh\u00f6ver f\u00f6r de verktyg vi anv\u00e4nder <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-02-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">och inget mer<\/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>Kort sagt, detta s\u00e4ger att k\u00f6ra en m\u00e4ngd olika kontroller f\u00f6r:<\/p>\n<ul>\n<li>s\u00e4kerhet,<\/li>\n<li>komposit\u00f6r,<\/li>\n<li>JSON,<\/li>\n<li>XML,<\/li>\n<li>Yaml,<\/li>\n<li>PHP,<\/li>\n<li>PHPCS,<\/li>\n<li>PHP Parser,<\/li>\n<li>PHPMD,<\/li>\n<li>och mer.<\/li>\n<\/ul>\n<p>N\u00e4r vi har slutf\u00f6rt konfigureringen av allt annat kommer jag att se till att visa dig hur allt detta h\u00e4nger ihop. Men f\u00f6rst, l\u00e5t oss slutf\u00f6ra konfigureringen av resten av v\u00e5ra verktyg.<\/p>\n<h3>PHPCS<\/h3>\n<p>Detta anv\u00e4nder tv\u00e5 separata filer \u2013 en <strong>dist<\/strong> -fil och en <strong>XML<\/strong> -fil \u2013 som var och en har olika, men mycket anv\u00e4ndbara syften.<\/p>\n<p>Den f\u00f6rsta filen, <strong>php_cs.dist<\/strong> som du kommer att se i f\u00f6rvaret i slutet av detta inl\u00e4gg, tillhandah\u00e5ller en rubrik som till\u00e4mpas p\u00e5 alla PHP-filer i v\u00e5rt projekt. Det uppr\u00e4tth\u00e5ller ocks\u00e5 n\u00e5gra olika regler som f\u00f6rb\u00e4ttrar kodens kvalitet.<\/p>\n<p>Reglerna \u00e4r sj\u00e4lvf\u00f6rklarande och du kan se vad de kommer att till\u00e4mpa genom att bara titta igenom var och en av reglerna <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-03-phpcs-dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">som definieras<\/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>D\u00e4refter vill du ocks\u00e5 skapa XML-filen f\u00f6r att komplettera filen ovan. Du kommer att notera att i filen jag tillhandah\u00e5ller \u00e4r detta vad jag anv\u00e4nder f\u00f6r mitt arbete p\u00e5 <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a><\/strong>. Dessutom bekr\u00e4ftar den ocks\u00e5 <strong>testkatalogen<\/strong>.<\/p>\n<p>F\u00f6r n\u00e4rvarande har vi inga enhetstester skrivna, men skulle du v\u00e4lja att introducera dem i din widget kommer detta att vara redo att hantera dem p\u00e5 r\u00e4tt s\u00e4tt.<\/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>Det finns bara en liten upps\u00e4ttning konfigurationer som jag anger h\u00e4r, men jag har tyckt att den \u00e4r mer \u00e4n tillr\u00e4cklig f\u00f6r mina behov hittills. N\u00e4r jag uppt\u00e4cker mer eller v\u00e4ljer att anv\u00e4nda mer, kommer jag definitivt att uppdatera inneh\u00e5llet i framtida inl\u00e4gg.<\/p>\n<h3>Konfigurera PHPMD<\/h3>\n<p>Och slutligen m\u00e5ste vi konfigurera PHP Mess Detector (eller PHPMD). Lyckligtvis anv\u00e4nder detta en XML-fil som kommer att anv\u00e4nda regelupps\u00e4ttningar som definieras i paketet installerat av Composer. Allt vi beh\u00f6ver g\u00f6ra \u00e4r att referera till regeln i konfigurationsfilen.<\/p>\n<p>F\u00f6r det andra kommer vi ocks\u00e5 att tillhandah\u00e5lla en liten uteslutning f\u00f6r ett <strong>ShortVariable-<\/strong> namn som du ser i <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-05-phpmd-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6ljande sammanfattning<\/a><\/strong> :<\/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>Och n\u00e4r alla dessa \u00e4r p\u00e5 plats borde vi kunna k\u00f6ra GrumPHP igen, fr\u00e5n kommandoraden, och ha en n\u00e5got annorlunda upps\u00e4ttning resultat.<\/p>\n<h3>K\u00f6r GrumPHP igen<\/h3>\n<p>Ange f\u00f6ljande i din terminal:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Och du borde se n\u00e5got s\u00e5nt h\u00e4r:<\/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=\"WordPress-widgets: B\u00f6rjar med standarder\"><\/a><\/p>\n<p>Annat resultat \u00e4n f\u00f6rsta g\u00e5ngen, va? Detta beror p\u00e5 att vi bryter mot vissa regler och standarder som \u00e4r en modern del av PHP och objektorienterad utveckling.<\/p>\n<p>Och det \u00e4r vad vi ska st\u00e4da upp i n\u00e4sta inl\u00e4gg.<\/p>\n<h2>Kommer upp<\/h2>\n<p>S\u00e5 var kommer den objektorienterade naturen av detta ifr\u00e5n? Fram till denna punkt har vi pratat om att anv\u00e4nda Widgets API som en objektorienterad modell f\u00f6r att skriva objektorienterad kod i WordPress.<\/p>\n<p>En del av det vi har gjort hittills har varit exakt det (genom att prata igenom dess principer, se hur det \u00e4r upplagt och mer).<\/p>\n<p>Men som jag n\u00e4mnde i b\u00f6rjan av det h\u00e4r inl\u00e4gget, ger l\u00e4ggande av kodkvalitetsverktyg oss f\u00f6rst en grund som vi kan anv\u00e4nda n\u00e4r vi refaktorerar boilerplate (vilket vi helt klart m\u00e5ste g\u00f6ra med tanke p\u00e5 m\u00e4ngden r\u00f6tt som visas av GrumPHP).<\/p>\n<p>Och det \u00e4r d\u00e4r vi b\u00f6rjar i n\u00e4sta inl\u00e4gg i den h\u00e4r serien.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ett av de b\u00e4sta s\u00e4tten att g\u00e5 till v\u00e4ga f\u00f6r objektorienterad programmering \u00e4r att b\u00f6rja med standarder och ha verktyg f\u00f6r att uppr\u00e4tth\u00e5lla dem.<\/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":[901,724,868],"tags":[1173],"class_list":["post-230592","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230592"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230592\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/235870"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230592"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}