{"id":230550,"date":"2022-12-14T16:29:00","date_gmt":"2022-12-14T13:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230550"},"modified":"2022-12-14T16:29:34","modified_gmt":"2022-12-14T13:29:34","slug":"widzety-wordpress-zaczynajac-od-standardow","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-zaczynajac-od-standardow\/","title":{"rendered":"Wid\u017cety WordPress: zaczynaj\u0105c od standard\u00f3w"},"content":{"rendered":"\n<p>Celem tej serii jest rozpocz\u0119cie g\u0142\u0119bszego zanurzenia si\u0119 w pracy z programowaniem obiektowym w kontek\u015bcie WordPressa.<\/p>\n<p>A poniewa\u017c API WordPress Widgets jest jednym z interfejs\u00f3w API, kt\u00f3re wykorzystuje praktyki zorientowane obiektowo, jest to logiczne miejsce na pocz\u0105tek. Co wi\u0119cej, da nam kilka podstawowych technik, kt\u00f3re mo\u017cemy zastosowa\u0107 w przysz\u0142ej pracy, gdy zobaczymy, jak budowa\u0107 wi\u0119cej projekt\u00f3w obiektowych na WordPressie w przysz\u0142ych seriach.<\/p>\n<p>Do tej pory om\u00f3wili\u015bmy nast\u0119puj\u0105ce kwestie:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-podejscie-obiektowe\/\" title=\"Wid\u017cety WordPress: podej\u015bcie obiektowe\">Wid\u017cety WordPress: podej\u015bcie obiektowe<\/a>. Widgets API zapewnia solidny test lakmusowy i przyk\u0142ad, jak rozpocz\u0105\u0107 programowanie obiektowe w WordPressie.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-wykrywanie-programowania-obiektowego\/\" title=\"Wid\u017cety WordPress: Jak wykry\u0107 programowanie obiektowe\">Wid\u017cety WordPress: Jak wykry\u0107 programowanie obiektowe<\/a>. Celem jest uzbroi\u0107 Ci\u0119 we wszystko, czego potrzebujesz do wykrywania praktyk zorientowanych obiektowo.<\/li>\n<\/ol>\n<p>Je\u015bli nie nad\u0105\u017casz, teraz jest na to \u015bwietna pora. A je\u015bli tak, to pami\u0119tasz z ostatniego postu, zako\u0144czyli\u015bmy nast\u0119puj\u0105c\u0105 notatk\u0105:<\/p>\n<blockquote>\n<p>Oznacza to, \u017ce ponownie odwiedzimy <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> i zamierzam dokona\u0107 refaktoryzacji go w obecnym stanie, aby przyj\u0105\u0107 bardziej nowoczesne standardy PHP.<\/p>\n<\/blockquote>\n<p>Aby rozpocz\u0105\u0107 aktualizacj\u0119 WordPress Widget Boilerplate zgodnie ze wspomnianymi standardami, musimy zrobi\u0107 kilka rzeczy:<\/p>\n<ol>\n<li>stworzy\u0107 ga\u0142\u0105\u017a z istniej\u0105cego boilerplate&#8217;u,<\/li>\n<li>zainstalowa\u0107 narz\u0119dzia jako\u015bci kodu,<\/li>\n<li>upewni\u0107 si\u0119, \u017ce nasze IDE jest poprawnie skonfigurowane,<\/li>\n<li>i rozpocznij refaktoryzacj\u0119 kodu do wspomnianych standard\u00f3w.<\/li>\n<\/ol>\n<p>I to w\u0142a\u015bnie zamierzamy zacz\u0105\u0107 robi\u0107 w tym po\u015bcie.<\/p>\n<h2>Zaczynaj\u0105c od standard\u00f3w<\/h2>\n<p>Je\u015bli jeste\u015b cz\u0142onkiem tej witryny od jakiego\u015b czasu, wiesz, \u017ce wol\u0119 u\u017cywa\u0107 Visual Studio Code. Je\u015bli nie, mam <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/visual-studio-code\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ca\u0142y zestaw artyku\u0142\u00f3w<\/a><\/strong> po\u015bwi\u0119conych temu, jak go u\u017cywam (i tym samym, jak b\u0119dziemy go u\u017cywa\u0107 w tej serii post\u00f3w).<\/p>\n<p>A je\u015bli jeste\u015b zainteresowany om\u00f3wieniem standard\u00f3w kodowania, debugowania, \u015brodowisk IDE, \u015brodowisk programistycznych itd., sprawd\u017a <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>Zak\u0142adam jednak, \u017ce je\u015bli to czytasz, to przeczyta\u0142e\u015b powy\u017cszy materia\u0142 lub czujesz si\u0119 komfortowo, przegl\u0105daj\u0105c ca\u0142y powy\u017cszy materia\u0142.<\/p>\n<p>Powiedziawszy to, zacznijmy.<\/p>\n<h3>Pobieranie repozytorium<\/h3>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 b\u0119dziesz chcia\u0142 zrobi\u0107, to sklonowa\u0107 kopi\u0119 repozytorium. Wol\u0119 to zrobi\u0107 za pomoc\u0105 wiersza polece\u0144.<\/p>\n<p>Ponadto uwa\u017cam, \u017ce warto to zrobi\u0107 w stosunku <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/tworzenie-wtyczek-i-motywow-na-wordpress-trunk\/\" title=\"do najnowszej wersji WordPressa\">do najnowszej wersji WordPressa<\/a><\/strong>. Je\u015bli nie masz kopii g\u0142\u00f3wnej kopii WordPressa Subversion, mo\u017cesz przeczyta\u0107, jak to skonfigurowa\u0107 tutaj; jest to jednak ca\u0142kowicie opcjonalne. Mo\u017cesz \u015bledzi\u0107 reszt\u0119 tego samouczka z dowoln\u0105 wersj\u0105 WordPressa, kt\u00f3r\u0105 chcesz.<\/p>\n<p>Aby to zrobi\u0107,<\/p>\n<ol>\n<li>Upewnij si\u0119, \u017ce jeste\u015b w katalogu <strong>wtyczek<\/strong> swojej instalacji WordPress<\/li>\n<li>A nast\u0119pnie wprowad\u017a nast\u0119puj\u0105ce polecenia do kopii swojego terminala<\/li>\n<\/ol>\n<pre><code>$ <\/code><\/pre>\n<p>Spowoduje to utworzenie\u00a0 katalogu <strong>WordPress-Widget-Boilerplate<\/strong> w twoim\u00a0 katalogu <strong>wtyczek<\/strong>. Mo\u017cesz do niego przej\u015b\u0107, wpisuj\u0105c:<\/p>\n<pre><code>$ cd WordPress-Widget-Boilerplate<\/code><\/pre>\n<p>Wyniki klonowania repozytorium powinny wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n<p>Nast\u0119pnie upewnij si\u0119, \u017ce przechodzisz na <strong>ga\u0142\u0105\u017a<\/strong> dewelopersk\u0105, kt\u00f3r\u0105 utworzy\u0142em. To naprawd\u0119 \u0142atwe. Ale zanim to zrobimy, dlaczego nie skonfigurowa\u0107 projektu w Visual Studio?<\/p>\n<h3>Konfigurowanie kodu programu Visual Studio<\/h3>\n<p>Kroki konfigurowania projektu w Visual Studio Code s\u0105 proste:<\/p>\n<ol>\n<li>Przeci\u0105gnij katalog Boilerplate do IDE,<\/li>\n<li>Otw\u00f3rz zintegrowany terminal,<\/li>\n<li>Zamie\u0144 ga\u0142\u0119zie<\/li>\n<\/ol>\n<p>Tak jak zrobi\u0142em powy\u017cej, przedstawi\u0119 screencast, jak to wszystko zrobi\u0107. Przeci\u0105ganie katalogu do Visual Studio Code powinno by\u0107 do\u015b\u0107 \u0142atwe, ale zamiana ga\u0142\u0119zi w wierszu polecenia mo\u017ce by\u0107 nieco inna.<\/p>\n<p>Najpierw skonfiguruj projekt w Visual Studio Code:<\/p>\n<\/p>\n<p>Zauwa\u017c tutaj, \u017ce otwieram r\u00f3wnie\u017c zintegrowany terminal, naciskaj\u0105c skr\u00f3t CMD + P (jestem na macOS, wi\u0119c tw\u00f3j skr\u00f3t mo\u017ce by\u0107 inny). Nast\u0119pnie wpisuj\u0119 polecenie, aby sprawdzi\u0107 <strong>ga\u0142\u0105\u017a<\/strong> dewelopersk\u0105.<\/p>\n<p>Gdy to zrobisz, twoje lokalne repozytorium powinno prze\u0142\u0105czy\u0107 si\u0119 na ga\u0142\u0105\u017a dewelopersk\u0105. Mo\u017cesz potwierdzi\u0107, \u017ce jest to ga\u0142\u0105\u017a, nad kt\u00f3r\u0105 pracujesz, wpisuj\u0105c:<\/p>\n<pre><code>$ git branch<\/code><\/pre>\n<p>A nast\u0119pnie przejrzyj zawarto\u015b\u0107 terminala. \u015aci\u015ble m\u00f3wi\u0105c, nale\u017cy podkre\u015bli\u0107 <strong>rozw\u00f3j .<\/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=\"Wid\u017cety WordPress: zaczynaj\u0105c od standard\u00f3w\"><\/a><\/p>\n<p>W tym momencie wprowadzimy do projektu kilka nowych plik\u00f3w. Na ko\u0144cu tego samouczka mo\u017cesz utworzy\u0107 <strong>\u015bci\u0105ganie<\/strong>, aby uzyska\u0107 wszystko, co zamierzam tutaj udokumentowa\u0107. Ale poniewa\u017c cel tego, co robimy, jest dwojaki, wa\u017cne jest, aby upewni\u0107 si\u0119, \u017ce robimy to we w\u0142a\u015bciwej kolejno\u015bci, poniewa\u017c pierwszym krokiem jest co\u015b, czego u\u017cywam w ka\u017cdym projekcie dla WordPressa w tym momencie.<\/p>\n<p>Wi\u0119c z tym powiedziawszy, sp\u00f3jrzmy.<\/p>\n<h3>Kompozytor i jako\u015b\u0107 kodu<\/h3>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 lubi\u0119 robi\u0107, jest stworzenie szeregu narz\u0119dzi, kt\u00f3re wymuszaj\u0105 jako\u015b\u0107 kodu. Osi\u0105ga si\u0119 to dzi\u0119ki r\u00f3\u017cnym pakietom Composer. Obejmuj\u0105 one:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpro\/grumphp\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GrumPHP<\/a>. Narz\u0119dzie jako\u015bci kodu PHP. Nie lekcewa\u017c jasno\u015bci i stopnia, w jakim to repozytorium jest pe\u0142ne informacji. Je\u015bli kiedykolwiek utkniesz z kt\u00f3rymkolwiek z innych wymienionych tutaj narz\u0119dzi, najpierw przejrzyj dokumentacj\u0119 w tym repozytorium.<\/li>\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Narz\u0119dzie do naprawy PHP CS<\/a>. Narz\u0119dzie do automatycznego rozwi\u0105zywania problem\u00f3w ze standardami kodowania PHP.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/JakubOnderka\/PHP-Parallel-Lint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Parallel Lint<\/a><\/strong>. To narz\u0119dzie sprawdza sk\u0142adni\u0119 plik\u00f3w PHP szybciej ni\u017c sprawdzanie szeregowe z bardziej wyszukanym wyj\u015bciem.<\/li>\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPMD<\/a>. To narz\u0119dzie pobiera dan\u0105 baz\u0119 kodu \u017ar\u00f3d\u0142owego PHP i szuka kilku potencjalnych problem\u00f3w w tym \u017ar\u00f3dle<\/li>\n<li><a href=\"https:\/\/github.com\/nikic\/PHP-Parser\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Parser PHP<\/a>. Parser jest przydatny do <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_program_analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analizy statycznej<\/a>, manipulacji kodem i w zasadzie ka\u017cdej innej aplikacji zajmuj\u0105cej si\u0119 kodem programowo.<\/li>\n<li><a href=\"https:\/\/github.com\/Ocramius\/ProxyManager\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pe\u0142nomocnik<\/a>. Ta biblioteka ma na celu dostarczenie abstrakcji do generowania r\u00f3\u017cnego rodzaju klas proxy.<\/li>\n<\/ul>\n<p>Chc\u0119 by\u0107 wolny od dw\u00f3ch rzeczy:<\/p>\n<ol>\n<li>Powy\u017csze narz\u0119dzia to absolutne minimum, kt\u00f3rego u\u017cywam, i prawdopodobnie zobaczysz, \u017ce u\u017cywam dodatkowych narz\u0119dzi w przysz\u0142o\u015bci,<\/li>\n<li>powy\u017csze narz\u0119dzia pomog\u0105 wymusi\u0107 regu\u0142y jako\u015bci kodu przed umieszczeniem kodu w repozytorium. Ma uzupe\u0142nia\u0107 konfiguracj\u0119 w twoim IDE.<\/li>\n<\/ol>\n<p>Aby skonfigurowa\u0107 i uruchomi\u0107 te narz\u0119dzia w ramach projektu, musimy utworzy\u0107\u00a0 plik <strong>composer.json<\/strong>, kt\u00f3ry wygl\u0105da <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>Pami\u0119taj, mo\u017cesz to zrobi\u0107 r\u0119cznie na ko\u0144cu tego postu. Je\u015bli jednak chcesz kontynuowa\u0107, mo\u017cesz to zrobi\u0107 r\u0119cznie. Nigdy nie chcia\u0142bym ci\u0119 do tego zniech\u0119ca\u0107.<\/p>\n<p>Po utworzeniu\u00a0 pliku <strong>composer.json<\/strong> upewnij si\u0119, \u017ce uruchamiasz nast\u0119puj\u0105ce polecenie z terminala:<\/p>\n<pre><code>$ composer install<\/code><\/pre>\n<p>To mo\u017ce zaj\u0105\u0107 troche czasu; jednak po zako\u0144czeniu powiniene\u015b otrzyma\u0107 nast\u0119puj\u0105cy komunikat:<\/p>\n<blockquote>\n<p>Uwa\u017caj! GrumPHP sniffuje twoje commity!<\/p>\n<\/blockquote>\n<p>Aby przetestowa\u0107 go na sucho, wpisz w terminalu nast\u0119puj\u0105ce polecenie:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>W zale\u017cno\u015bci od tego, jak pracujesz z projektem, mo\u017cesz zobaczy\u0107 dane wyj\u015bciowe, kt\u00f3re wygl\u0105daj\u0105 mniej wi\u0119cej tak:<\/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=\"Wid\u017cety WordPress: zaczynaj\u0105c od standard\u00f3w\"><\/a><\/p>\n<p>Ale jest jeszcze wi\u0119cej pracy. Mianowicie musimy:<\/p>\n<ul>\n<li>zaktualizuj nasz plik <strong>.gitignore ,<\/strong><\/li>\n<li>wprowadzi\u0107 konfiguracj\u0119 dla GrumPHP<\/li>\n<li>wprowadzi\u0107 konfiguracj\u0119 dla PHPMD,<\/li>\n<li>wprowadzi\u0107 konfiguracj\u0119 dla PHPCS,<\/li>\n<li>ostatecznie zrestrukturyzuj struktur\u0119 katalog\u00f3w schematu.<\/li>\n<\/ul>\n<p>Wszystko, a\u017c do ostatniego kroku, zamierzamy zrobi\u0107 w tym po\u015bcie.<\/p>\n<h3>Aktualizacja pliku ignorowania<\/h3>\n<p>Po pierwsze, nie chcemy zatwierdza\u0107 katalogu dostawcy ani pliku blokady kompozytora. Mog\u0105 by\u0107 generowane za ka\u017cdym razem, gdy u\u017cytkownik pobiera katalog. Mog\u0105 \u0142atwo straci\u0107 synchronizacj\u0119 i doda\u0107 ogromny rozmiar do katalogu projektu.<\/p>\n<p>W tym celu tw\u00f3j plik <strong>gitignore<\/strong> powinien wygl\u0105da\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-01-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>To m\u00f3wi wtyczce, aby ignorowa\u0142a wszystko opr\u00f3cz tego, co znajduje si\u0119 w katalogu g\u0142\u00f3wnym wtyczek (i niekt\u00f3rych katalog\u00f3w, kt\u00f3re utworzymy) wraz z kilkoma podstawowymi plikami, do kt\u00f3rych przywykli\u015bmy w instalacjach WordPress.<\/p>\n<p>Niekt\u00f3re z tego, co widzisz, takie jak <strong>wp-config.php<\/strong> lub <strong>wp-content\/backups<\/strong>, kt\u00f3rych nigdy nie zobaczysz w kontek\u015bcie wtyczki, ale s\u0105 to standardowe dyrektywy ignoruj\u0105ce WordPressa, kt\u00f3re lubi\u0119 mie\u0107 pod r\u0119k\u0105.<\/p>\n<p>Zauwa\u017cysz, \u017ce doda\u0142em r\u00f3wnie\u017c\u00a0 plik blokady <strong>dostawcy\u00a0<\/strong> i kompozytora na dole pliku.<\/p>\n<h3>Skonfiguruj GrumPHP<\/h3>\n<p>GrumPHP mo\u017ce wiele zdzia\u0142a\u0107, a je\u015bli sp\u0119dzi\u0142e\u015b czas na przegl\u0105daniu repozytorium przed przeczytaniem tak daleko, prawdopodobnie wiesz o tym; jednak zamierzam zachowa\u0107 jak najszczuplejsz\u0105, aby zawiera\u0142a instrukcje, kt\u00f3rych potrzebuje do u\u017cywanych przez nas narz\u0119dzi, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-02-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i nic wi\u0119cej<\/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>Kr\u00f3tko m\u00f3wi\u0105c, oznacza to przeprowadzenie r\u00f3\u017cnych kontroli pod k\u0105tem:<\/p>\n<ul>\n<li>bezpiecze\u0144stwo,<\/li>\n<li>kompozytor,<\/li>\n<li>JSON,<\/li>\n<li>XML,<\/li>\n<li>Jaml,<\/li>\n<li>PHP,<\/li>\n<li>PHPCS,<\/li>\n<li>Parser PHP,<\/li>\n<li>PHPMD,<\/li>\n<li>i wi\u0119cej.<\/li>\n<\/ul>\n<p>Gdy sko\u0144czymy konfigurowa\u0107 wszystko inne, na pewno poka\u017c\u0119 Ci, jak to wszystko do siebie pasuje. Ale najpierw zako\u0144czmy konfiguracj\u0119 pozosta\u0142ych naszych narz\u0119dzi.<\/p>\n<h3>PHPCS<\/h3>\n<p>Wykorzystuje to dwa oddzielne pliki \u2013\u00a0 plik <strong>dist<\/strong> i plik <strong>XML<\/strong> \u2013 z kt\u00f3rych ka\u017cdy s\u0142u\u017cy innym, cho\u0107 bardzo pomocnym celom.<\/p>\n<p>Pierwszy plik, <strong>php_cs.dist<\/strong>, kt\u00f3ry zobaczysz w repozytorium pod koniec tego postu, zawiera nag\u0142\u00f3wek, kt\u00f3ry jest stosowany do wszystkich plik\u00f3w PHP w naszym projekcie. Wymusza r\u00f3wnie\u017c kilka innych regu\u0142, kt\u00f3re poprawiaj\u0105 jako\u015b\u0107 kodu.<\/p>\n<p>Regu\u0142y nie wymagaj\u0105 wyja\u015bnie\u0144, a ich egzekwowanie mo\u017cna sprawdzi\u0107, przegl\u0105daj\u0105c ka\u017cd\u0105 ze <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-03-phpcs-dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zdefiniowanych<\/a><\/strong> regu\u0142 .<\/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>Nast\u0119pnie b\u0119dziesz chcia\u0142 r\u00f3wnie\u017c utworzy\u0107 plik XML, aby uzupe\u0142ni\u0107 powy\u017cszy plik. Zauwa\u017cysz, \u017ce w dostarczonym przeze mnie pliku, tego w\u0142a\u015bnie u\u017cywam w mojej pracy w <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a><\/strong>. Ponadto potwierdza r\u00f3wnie\u017c katalog <strong>test\u00f3w .<\/strong><\/p>\n<p>W tym momencie nie mamy napisanych \u017cadnych test\u00f3w jednostkowych, ale je\u015bli zdecydujesz si\u0119 wprowadzi\u0107 je do swojego wid\u017cetu, b\u0119dzie on gotowy do ich poprawnej obs\u0142ugi.<\/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>Jest tylko ma\u0142y zestaw konfiguracji, kt\u00f3ry okre\u015blam tutaj, ale uwa\u017cam, \u017ce jest on jak dot\u0105d wi\u0119cej ni\u017c wystarczaj\u0105cy dla moich potrzeb. Gdy odkryj\u0119 wi\u0119cej lub zdecyduj\u0119 si\u0119 u\u017cy\u0107 wi\u0119cej, z pewno\u015bci\u0105 zaktualizuj\u0119 zawarto\u015b\u0107 w przysz\u0142ych postach.<\/p>\n<h3>Skonfiguruj PHPMD<\/h3>\n<p>I na koniec musimy skonfigurowa\u0107 PHP Mess Detector (lub PHPMD). Na szcz\u0119\u015bcie u\u017cywa to pliku XML, kt\u00f3ry b\u0119dzie u\u017cywa\u0142 zestaw\u00f3w regu\u0142 zdefiniowanych w pakiecie zainstalowanym przez Composer. Wszystko, co musimy zrobi\u0107, to odwo\u0142a\u0107 si\u0119 do regu\u0142y w pliku konfiguracyjnym.<\/p>\n<p>Po drugie, zapewnimy r\u00f3wnie\u017c ma\u0142e wykluczenie dla\u00a0 nazwy <strong>ShortVariable<\/strong>, jak wida\u0107 w <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-05-phpmd-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105cym skr\u00f3cie<\/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>A kiedy wszystko to b\u0119dzie gotowe, powinni\u015bmy by\u0107 w stanie ponownie uruchomi\u0107 GrumPHP z wiersza polece\u0144 i uzyska\u0107 nieco inny zestaw wynik\u00f3w.<\/p>\n<h3>Ponownie uruchamiam GrumPHP<\/h3>\n<p>Wprowad\u017a w terminalu:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Powiniene\u015b zobaczy\u0107 co\u015b takiego:<\/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=\"Wid\u017cety WordPress: zaczynaj\u0105c od standard\u00f3w\"><\/a><\/p>\n<p>Inne wyniki ni\u017c za pierwszym razem, co? Dzieje si\u0119 tak, poniewa\u017c naruszamy niekt\u00f3re zasady i standardy, kt\u00f3re s\u0105 nowoczesn\u0105 cz\u0119\u015bci\u0105 PHP i programowania obiektowego.<\/p>\n<p>I to w\u0142a\u015bnie zamierzamy posprz\u0105ta\u0107 w nast\u0119pnym po\u015bcie.<\/p>\n<h2>Nadchodzi<\/h2>\n<p>Sk\u0105d wi\u0119c bierze si\u0119 obiektowo zorientowana natura tego? Do tego momentu m\u00f3wili\u015bmy o wykorzystaniu API Widgets jako modelu obiektowego do pisania kodu obiektowego w WordPressie.<\/p>\n<p>Niekt\u00f3re z tego, co do tej pory zrobili\u015bmy, by\u0142y w\u0142a\u015bnie tym (omawiaj\u0105c jego zasady, widz\u0105c, jak jest rozplanowany i nie tylko).<\/p>\n<p>Ale jak wspomnia\u0142em na pocz\u0105tku tego postu, najpierw stworzenie narz\u0119dzi jako\u015bci kodu zapewnia nam podstaw\u0119, kt\u00f3rej mo\u017cemy u\u017cy\u0107, gdy dokonamy refaktoryzacji boilerplate\u2019u (co oczywi\u015bcie musimy zrobi\u0107, bior\u0105c pod uwag\u0119 ilo\u015b\u0107 czerwieni pokazan\u0105 przez GrumPHP).<\/p>\n<p>I od tego zaczniemy w kolejnym po\u015bcie z tej serii.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jednym z najlepszych sposob\u00f3w programowania obiektowego jest rozpocz\u0119cie od standard\u00f3w i posiadanie narz\u0119dzi do ich egzekwowania.<\/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":[721,897,866],"tags":[1169],"class_list":["post-230550","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=230550"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230550\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/235870"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}