{"id":228796,"date":"2022-11-02T18:08:00","date_gmt":"2022-11-02T15:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228796"},"modified":"2022-11-09T04:18:46","modified_gmt":"2022-11-09T01:18:46","slug":"podklad-wzorca-repozytorium","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/podklad-wzorca-repozytorium\/","title":{"rendered":"Podk\u0142ad wzorca repozytorium"},"content":{"rendered":"\n<p>Za ka\u017cdym razem, gdy pracujesz nad wi\u0119kszym projektem opartym na WordPressie, szanse, \u017ce b\u0119dziesz pracowa\u0107 z wi\u0119cej ni\u017c jednym \u017ar\u00f3d\u0142em danych \u2013 czyli baz\u0105 danych WordPress \u2013 s\u0105 wy\u017csze ni\u017c normalnie. Na przyk\u0142ad mo\u017cesz pracowa\u0107 nad projektem, kt\u00f3ry musi koordynowa\u0107 informacje z:<\/p>\n<ul>\n<li>baza danych WordPress,<\/li>\n<li>system biletowy help desk,<\/li>\n<li>system importu tre\u015bci,<\/li>\n<li>inny API innej firmy,<\/li>\n<li>i mo\u017cliwe wi\u0119cej.<\/li>\n<\/ul>\n<p>A kiedy tak si\u0119 dzieje, pisanie kodu, kt\u00f3ry u\u0142atwia pobieranie informacji z tych r\u00f3\u017cnych miejsc, mo\u017ce by\u0107 nieco k\u0142opotliwe. To, o czym zwykle m\u00f3wi\u0105 programi\u015bci, gdy odnosz\u0105 si\u0119 do \u201ewarstw&quot; w swojej aplikacji.<\/p>\n<ul>\n<li>istniej\u0105 warstwy do prezentacji informacji u\u017cytkownikowi,<br \/>\nwarstwy do obs\u0142ugi logiki biznesowej (lub logiki domenowej),<\/li>\n<li>warstwy do komunikacji z API,<\/li>\n<li>oraz warstwy do przechowywania danych.<\/li>\n<\/ul>\n<p>Szczerze m\u00f3wi\u0105c, nie musisz mie\u0107 r\u00f3\u017cnych magazyn\u00f3w danych do ogl\u0105dania, aby utworzy\u0107 warstw\u0119, kt\u00f3ra u\u0142atwia wysy\u0142anie i pobieranie danych z bazy danych, to tylko wtedy, gdy jest to bardziej powszechne. R\u00f3wnie skutecznie mo\u017cesz pracowa\u0107 z pojedynczym magazynem danych, takim jak baza danych WordPress, wdra\u017caj\u0105c wzorzec repozytorium.<\/p>\n<p>Niezale\u017cnie od tego, czy budujesz wi\u0119ksz\u0105 witryn\u0119, aplikacj\u0119 internetow\u0105 lub wtyczk\u0119, implementacja wzorca repozytorium jest czym\u015b, co mo\u017ce przynie\u015b\u0107 zyski w utrzymaniu, przejrzysto\u015bci kodu i oddzieleniu obaw.<\/p>\n<p>Ale jak mo\u017cna to zaimplementowa\u0107 w WordPressie? Nie jest to trudne, ale najpierw warto przejrze\u0107 elementarz repozytorium przed przej\u015bciem do jakiegokolwiek kodu.<\/p>\n<h2>Podk\u0142ad wzorca repozytorium<\/h2>\n<p>Zanim przyjrzymy si\u0119 rzeczywistej implementacji w WordPress, wa\u017cne jest, aby zrozumie\u0107, czym jest repozytorium, jak jest zdefiniowane, co oferuje i jaka jest jego og\u00f3lna implementacja. Podziel\u0119 si\u0119 dalsz\u0105 lektur\u0105 na ko\u0144cu artyku\u0142u, ale do tego czasu om\u00f3wi\u0119 tutaj moje og\u00f3lne podej\u015bcie do wzoru.<\/p>\n<p>Po pierwsze, implementacja tego wzorca mo\u017ce sta\u0107 si\u0119 bardziej skomplikowana ni\u017c jest to konieczne dla pocz\u0105tkuj\u0105cych. Nie oznacza to, \u017ce rzeczywisty wz\u00f3r nie jest wart zrozumienia, ale je\u015bli chcesz si\u0119 z tym po prostu zmoczy\u0107, nie jestem fanem rzucania czytelnik\u00f3w na g\u0142\u0119bok\u0105 wod\u0119. Nie s\u0105dz\u0119, \u017ce to najlepszy spos\u00f3b na nauk\u0119.<\/p>\n<p>Zamiast tego warto prze\u0142ama\u0107 problem, a nast\u0119pnie przebudowa\u0107 go na co\u015b bardziej eleganckiego. Wi\u0119c to w\u0142a\u015bnie zamierzam zrobi\u0107.<\/p>\n<h3>S\u0142owo o oddzieleniu<\/h3>\n<p>M\u00f3wi\u0105c o programowaniu obiektowym, cz\u0119sto m\u00f3wimy o idei \u201eodsprz\u0119gania&#8221; cz\u0119\u015bci systemu. Je\u015bli znasz si\u0119 na <a href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2014\/05\/08\/SingleReponsibilityPrinciple.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprz\u0119\u017ceniu i sp\u00f3jno\u015bci<\/a>, wiesz dlaczego.<\/p>\n<p>Ale je\u015bli nie, wystarczy powiedzie\u0107, \u017ce im bardziej sprz\u0119\u017cone s\u0105 komponenty twojego systemu, tym trudniej je zmieni\u0107. Za du\u017co o sobie wiedz\u0105. Oznacza to, \u017ce je\u015bli zmienisz jeden z aspekt\u00f3w systemu, prawdopodobnie wp\u0142ynie to kaskadowo lub wp\u0142ynie na inn\u0105 cz\u0119\u015b\u0107 systemu, kt\u00f3rej nigdy nie mia\u0142e\u015b zamiaru wydarzy\u0107. Wtedy pozostajesz, gdy musisz sp\u0119dza\u0107 znacznie wi\u0119cej czasu na naprawieniu wszystkich innych \u201epunkt\u00f3w styku&#8221; w ca\u0142ym systemie, kt\u00f3re nie powinny by\u0107 konieczne.<\/p>\n<p>Wdra\u017canie r\u00f3\u017cnych strategii, takich jak wzorzec repozytorium, mo\u017ce pom\u00f3c w rozdzieleniu cz\u0119\u015bci systemu. Przyk\u0142ad: warstwa prezentacji nie wie, jak zorganizowany jest bazowy magazyn danych. Nie musi zna\u0107 SQL. Nie musi wiedzie\u0107, \u017ce to baza danych. Zamiast tego musi tylko wiedzie\u0107, jak rozmawia\u0107 z repozytorium.<\/p>\n<p>\u0141adne, prawda?<\/p>\n<p>Oznacza to, \u017ce mo\u017cesz wymieni\u0107 magazyn danych zaplecza i zak\u0142adaj\u0105c, \u017ce Tw\u00f3j interfejs API jest solidny; Twoja aplikacja b\u0119dzie nadal dzia\u0142a\u0107 bez zmian. I to w\u0142a\u015bnie oznacza bycie naprawd\u0119 oddzielonym.<\/p>\n<h3>Implementacja wzorca repozytorium<\/h3>\n<p>Jak wi\u0119c wygl\u0105da wzorzec repozytorium? Podobnie jak w przypadku wi\u0119kszo\u015bci wzorc\u00f3w projektowych, istnieje og\u00f3lna forma wzorca, kt\u00f3ra zawsze jest pomocna, ale my\u015bl\u0119, \u017ce pomaga r\u00f3wnie\u017c tym z nas, kt\u00f3rzy pracuj\u0105 nad WordPressem, zobaczy\u0107, jak mo\u017ce dzia\u0142a\u0107 w kontek\u015bcie, wiesz, WordPressa.\u00a0<\/p>\n<p>Wi\u0119c najpierw chc\u0119 rozbi\u0107 sam wzorzec, a nast\u0119pnie poda\u0107 przyk\u0142ad, jak mo\u017ce wygl\u0105da\u0107 podczas pracy z WordPressem.<\/p>\n<h3>Og\u00f3lna implementacja wzorca repozytorium<\/h3>\n<p>Rzeczywista implementacja wzorca repozytorium jest do\u015b\u0107 prosta. W rzeczywisto\u015bci nigdy nie jestem pewien, czy jest to tak pomocne, poniewa\u017c pokazuje tylko, w jaki spos\u00f3b magazyny danych, repozytorium i reszta aplikacji wsp\u00f3\u0142dzia\u0142aj\u0105 ze sob\u0105.<\/p>\n<p>Nie zrozum mnie \u017ale: jestem za koncepcyjnymi modelami tego, jak rzeczy s\u0105 zorganizowane. Osobi\u015bcie pomaga mi my\u015ble\u0107 o strukturze aplikacji podczas jej budowania, ale je\u015bli jest zbyt og\u00f3lna, to niewiele pomaga.<\/p>\n<p>Ale \u017ceby dosta\u0107 si\u0119 do konkretnego narz\u0119dzia, musimy gdzie\u015b zacz\u0105\u0107, prawda? Wi\u0119c zaczn\u0119 od najwy\u017cszego mo\u017cliwego poziomu i b\u0119d\u0119 pracowa\u0107 w d\u00f3\u0142.<\/p>\n<p>Jak wida\u0107 na powy\u017cszym obrazku, masz kilka magazyn\u00f3w danych, z kt\u00f3rych wszystkie s\u0105 odczytywane przez repozytorium, a nast\u0119pnie aplikacja wysy\u0142a zapytanie do repozytorium, kt\u00f3re z kolei pobiera informacje z magazynu danych.<\/p>\n<p>Tak, istniej\u0105 opcje buforowania informacji, uniewa\u017cniania pami\u0119ci podr\u0119cznej i wszystkich tych zabawnych rzeczy. Ale jest poza zakresem g\u0142\u00f3wnego repozytorium. Wi\u0119c na razie nie zamierzam i\u015b\u0107 t\u0105 konkretn\u0105 \u015bcie\u017ck\u0105. By\u0107 mo\u017ce w przysz\u0142ym po\u015bcie (je\u015bli ten oka\u017ce si\u0119 dla Ciebie przydatny).<\/p>\n<h2>Wzorzec repozytorium w WordPress<\/h2>\n<p>Maj\u0105c to na uwadze, przyjrzyjmy si\u0119 podstawowej implementacji tego, jak mo\u017ce to wygl\u0105da\u0107 w standardowej instalacji WordPressa. Oznacza to, \u017ce wszystko, co mamy, to magazyn danych. Nie komunikujemy si\u0119 z niczym innym, ale chcemy mie\u0107 pewno\u015b\u0107, \u017ce wszystko, co \u0142\u0105czy si\u0119 z baz\u0105 danych lub API, jest obs\u0142ugiwane przez repozytorium<\/p>\n<p>Wygl\u0105da\u0142oby to mniej wi\u0119cej tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.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-166793-61e79a689f876.png\" alt=\"Podk\u0142ad wzorca repozytorium\" ><\/a><\/p>\n<p>Jak to mo\u017ce wygl\u0105da\u0107 z WordPress<\/p>\n<p>I mo\u017cna to jeszcze bardziej wyabstrahowa\u0107. By\u0107 mo\u017ce istnieje repozytorium post\u00f3w lub repozytorium u\u017cytkownik\u00f3w. Osobi\u015bcie jestem fanem posiadania repozytorium dla ka\u017cdego typu encji, poniewa\u017c pomaga to zawiera\u0107 powi\u0105zan\u0105 logik\u0119 biznesow\u0105 bez tworzenia tych du\u017cych klas, kt\u00f3re wiedz\u0105 wszystko (i niepotrzebnie).<\/p>\n<p>Mo\u017ce to wygl\u0105da\u0107 tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.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-166793-61e79a6e78654.png\" alt=\"Podk\u0142ad wzorca repozytorium\" ><\/a><\/p>\n<p>Pakiet repozytori\u00f3w<\/p>\n<p>Nast\u0119pnie we\u017amy jeszcze jeden poziom i powiedzmy, \u017ce pracujesz z API Twittera, ZenDesk API, WordPress User API i WordPress Post API. Co wtedy? Jest wi\u0119cej repozytori\u00f3w.<\/p>\n<p>By\u0107 mo\u017ce s\u0105 one zawarte w ich przestrzeni nazw (kt\u00f3r\u0105 powinny by\u0107), mo\u017ce implementuj\u0105 wsp\u00f3lny interfejs (na co jest ku temu pow\u00f3d), ale w czasie tworzenia uwa\u017cam, \u017ce wa\u017cne jest, aby wyra\u017anie okre\u015bli\u0107, kt\u00f3rego repozytorium u\u017cywasz tak, aby by\u0107 tak jasnym, jak to mo\u017cliwe.<\/p>\n<p>Oznacza to, \u017ce nie u\u017cywaj generycznego i pozw\u00f3l \u015brodowisku wykonawczemu to rozgry\u017a\u0107:<\/p>\n<pre><code>$support_repository = new Support_Repository();\n$support_repository-&gt;get_tickets_for( 'tommcfarlin' );<\/code><\/pre>\n<p>Zamiast tego b\u0105d\u017a wyra\u017any:<\/p>\n<pre><code>$zendesk_repository = new ZenDesk_Repository();\n$zendesk_repository-&gt;get_tickets_from( 'yesterday' );<\/code><\/pre>\n<p>To mo\u017ce wydawa\u0107 si\u0119 du\u017co. Nie wiem, czy tego do\u015bwiadczasz, ale jest dziwne uczucie w programowaniu obiektowym, gdzie chcemy tworzy\u0107 ma\u0142e, skoncentrowane klasy, ale tworzy wiele plik\u00f3w.<\/p>\n<p>Masz wi\u0119c te starannie skonfigurowane pliki, z kt\u00f3rych ka\u017cdy robi co\u015b ma\u0142ego i celowego. Nie pozw\u00f3l, aby liczba plik\u00f3w sk\u0142adaj\u0105cych si\u0119 na projekt sprawia\u0142a wra\u017cenie, \u017ce masz s\u0142ab\u0105 architektur\u0119.<\/p>\n<h2>Wniosek<\/h2>\n<p>To jest podk\u0142ad do wzorca repozytorium. Oczywi\u015bcie istnieje kod, kt\u00f3ry si\u0119 z tym zgadza, ale zanim zag\u0142\u0119bi\u0119 si\u0119 w t\u0119 cz\u0119\u015b\u0107 \u2013 poniewa\u017c kod jest miejscem, w kt\u00f3rym \u0142atwo gin\u0105 rzeczy w t\u0142umaczeniu \u2013 chcia\u0142em si\u0119 upewni\u0107, \u017ce pomog\u0142em dostarczy\u0107 ilustracj\u0119 do opracowania modelu koncepcyjnego dzia\u0142ania wzorca.<\/p>\n<p>Od tego momentu mo\u017cemy zacz\u0105\u0107 m\u00f3wi\u0107 o implementacji wzorca. Wi\u0119c w nast\u0119pnym po\u015bcie lub kilku nast\u0119pnych postach zamierzam to zrobi\u0107.<\/p>\n<p>W mi\u0119dzyczasie nie wahaj si\u0119 zostawia\u0107 \u017cadnych komentarzy lub pyta\u0144 dotycz\u0105cych tego, co tutaj om\u00f3wili\u015bmy.<\/p>\n<h2>Powi\u0105zane czytanie<\/h2>\n<ul>\n<li><a href=\"https:\/\/8thlight.com\/blog\/mike-ebert\/2013\/03\/23\/the-repository-pattern.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Wzorzec repozytorium za po\u015brednictwem \u00f3smego \u015bwiat\u0142a<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ff649690.aspx\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Wzorzec repozytorium za po\u015brednictwem MSDN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/clean\/repository\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Implementacja wzorca repozytorium<\/a><\/li>\n<\/ul>\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>Implementacja wzorca repozytorium nie jest strasznie trudna, ale warto przejrze\u0107 elementarz repozytorium przed przej\u015bciem do jakiegokolwiek kodu.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,845],"tags":[1169],"class_list":["post-228796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228796","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=228796"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228796\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}