{"id":230244,"date":"2022-12-08T09:37:00","date_gmt":"2022-12-08T06:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230244"},"modified":"2022-12-08T09:37:08","modified_gmt":"2022-12-08T06:37:08","slug":"zapisywanie-wiadomosci-do-dziennika-debugowania-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/zapisywanie-wiadomosci-do-dziennika-debugowania-wordpress\/","title":{"rendered":"Zapisywanie wiadomo\u015bci do dziennika debugowania WordPress"},"content":{"rendered":"\n<p>Za ka\u017cdym razem, gdy pracuj\u0119 nad projektem, cz\u0119sto mam WordPress ustawiony w <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/natywne-narzedzia-do-debugowania-wordpress-ktore-nie-wymagaja-ide\/\" title=\"trybie debugowania\">trybie debugowania<\/a><\/strong> i lubi\u0119 pisa\u0107 komunikaty w dzienniku b\u0142\u0119d\u00f3w, kt\u00f3re mog\u0119 \u0142atwo przegl\u0105da\u0107, \u015bledzi\u0107 i \u015bledzi\u0107 za ka\u017cdym razem, gdy pracuj\u0119 nad projektem.<\/p>\n<p>Kiedy to robi\u0119, s\u0105 dwa sposoby (i to tylko zale\u017cy od projektu):<\/p>\n<ul>\n<li>U\u017cyj\u0119 biblioteki takiej jak <strong><a href=\"https:\/\/github.com\/Seldaek\/monolog\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Monolog<\/a><\/strong> ,<\/li>\n<li>U\u017cyj\u0119 w\u0142asnej, prostej funkcji dziennika.<\/li>\n<\/ul>\n<p>W tym po\u015bcie om\u00f3wi\u0119 to drugie. Oznacza to, \u017ce podziel\u0119 si\u0119 tym, w jaki spos\u00f3b pisz\u0119 wiadomo\u015bci do dziennika debugowania WordPressa, a nast\u0119pnie o niekt\u00f3rych rzeczach, na kt\u00f3re musisz zwr\u00f3ci\u0107 uwag\u0119, gdy robisz to samo.<\/p>\n<h2>Dziennik debugowania WordPressa<\/h2>\n<p>Po pierwsze, nale\u017cy zauwa\u017cy\u0107, \u017ce funkcja, kt\u00f3r\u0105 zamierzam udost\u0119pni\u0107, jest zwykle w kontek\u015bcie klasy bazowej.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce mam <strong>AbstractSubscriber<\/strong>, kt\u00f3ry implementuj\u0105 wszyscy moi subskrybenci (np. <strong>ScriptAssetSubscriber<\/strong> do rejestracji i kolejkowania pliku JavaScript).<\/p>\n<p><strong>AbstractSubscriber<\/strong> b\u0119dzie zawiera\u0142 t\u0119 funkcj\u0119, dzi\u0119ki czemu mo\u017ce by\u0107 wywo\u0142ywana przez dowolne klasy podrz\u0119dne. <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d8bed85851dad283183d84a819dd6c9a#file-00-log-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Funkcja jest do\u015b\u0107 prosta:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Prints a message to the debug file that can easily be called by any subclass.\n *\n * @param mixed $message      an object, array, string, number, or other data to write to the debug log\n * @param bool  $shouldNotDie whether or not the The function should exit after writing to the log\n *\n *\/\nprotected function log($message, $shouldNotDie = true)\n{\n    error_log(print_r($message, true));\n    if ($shouldNotDie) {\n        exit;\n    }\n}<\/code><\/pre>\n<p>Jest jednak kilka rzeczy zwi\u0105zanych z t\u0105 funkcj\u0105, kt\u00f3re mog\u0105 narusza\u0107 zasad\u0119 lub powodowa\u0107 b\u0142\u0119dy w narz\u0119dziach jako\u015bci kodu.<\/p>\n<h3>Opcjonalne argumenty logiczne<\/h3>\n<p>Za ka\u017cdym razem, gdy funkcja akceptuje opcjonalny argument logiczny, mo\u017ce to wskazywa\u0107, \u017ce funkcja ma wi\u0119cej ni\u017c jedn\u0105 odpowiedzialno\u015b\u0107 (w ten spos\u00f3b naruszaj\u0105c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zasad\u0119 pojedynczej odpowiedzialno\u015bci<\/a> ).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162356-61e73cdb388b5.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-162356-61e73cdb388b5.png\" alt=\"Zapisywanie wiadomo\u015bci do dziennika debugowania WordPress\"><\/a><\/p>\n<p>Powodem, dla kt\u00f3rego naruszy\u0142oby to wspomnian\u0105 zasad\u0119, jest to, \u017ce daje modu\u0142owi wi\u0119cej ni\u017c jeden pow\u00f3d do zmiany.<\/p>\n<p>Czuj\u0119 si\u0119 komfortowo pozwalaj\u0105c, aby to zosta\u0142o napisane w ten spos\u00f3b, poniewa\u017c u\u017cywam go do debugowania, a nie w \u015brodowiskach produkcyjnych, i poniewa\u017c s\u0105 chwile, w kt\u00f3rych mog\u0119 chcie\u0107 zatrzyma\u0107 wykonanie, a czasami nie.<\/p>\n<p>I oczywi\u015bcie, m\u00f3g\u0142bym napisa\u0107 dwie oddzielne funkcje, ale je\u015bli jest to jedyna funkcja, kt\u00f3ra to robi, to nie przeszkadza mi to.<\/p>\n<h3>Wyci\u0105gi o zakazie wyj\u015bcia<\/h3>\n<p>Inne narz\u0119dzia jako\u015bci kodu nie lubi\u0105 instrukcji <strong>exit<\/strong> (i podobnie nie lubi\u0105 instrukcji <strong>die<\/strong> ). I jest to zrozumia\u0142e: zazwyczaj powoduj\u0105 ca\u0142kowite zatrzymanie programu, gdy powinni\u015bmy zg\u0142osi\u0107 wyj\u0105tek, zwr\u00f3ci\u0107 warto\u015b\u0107 lub og\u00f3lnie zrobi\u0107 co\u015b, aby zgrabnie poradzi\u0107 sobie z sytuacj\u0105.<\/p>\n<p>Znowu jednak, poniewa\u017c w tej funkcji s\u0105 chwile, w kt\u00f3rych chc\u0119 zatrzyma\u0107 wykonanie, nie mam nic przeciwko konsekwencjom posiadania wiersza kodu w funkcji.<\/p>\n<p>Alternatywnie m\u00f3g\u0142bym u\u017cy\u0107 <strong>wp_die(),<\/strong> a wi\u0119kszo\u015b\u0107 narz\u0119dzi jako\u015bci kodu prawdopodobnie by tego nie wy\u0142apa\u0142a, ale to maskuje g\u0142\u00f3wny problem. Je\u015bli ju\u017c, to mo\u017ce najlepiej po prostu st\u0142umi\u0107 ostrze\u017cenie za pomoc\u0105 dowolnej dyrektywy, na kt\u00f3r\u0105 pozwala tw\u00f3j wybrany sniffer.<\/p>\n<h2>Niezale\u017cnie od tego, zapisz wiadomo\u015b\u0107<\/h2>\n<p>Ostatecznym celem powy\u017cszej funkcji jest zapewnienie prostego sposobu zapisywania w dzienniku debugowania WordPressa i opcjonalnie zatrzymanie wykonywania programu podczas wykonywania tego.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162356-61e73ce108d1e.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-162356-61e73ce108d1e.png\" alt=\"Zapisywanie wiadomo\u015bci do dziennika debugowania WordPress\"><\/a><\/p>\n<p>Oczywi\u015bcie nie jest bez problem\u00f3w i istniej\u0105 biblioteki wy\u017cszej jako\u015bci, kt\u00f3re s\u0105 dost\u0119pne, ale czasami nie potrzebujesz m\u0142ota, aby rozwi\u0105za\u0107 problem.<\/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>Oto prosta funkcja do zapisywania w dzienniku debugowania WordPressa (nie bez kilku zastrze\u017ce\u0144). Zwykle u\u017cywam go w kodzie lokalnym podczas pracy z klasami abstrakcyjnymi.<\/p>\n","protected":false},"author":1,"featured_media":235343,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,805,866],"tags":[1169],"class_list":["post-230244","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230244","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=230244"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230244\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/235343"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}