{"id":230956,"date":"2022-12-24T12:03:00","date_gmt":"2022-12-24T09:03:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230956"},"modified":"2022-12-07T10:57:26","modified_gmt":"2022-12-07T07:57:26","slug":"strukturyzacja-funkcjonalnosci-api","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/strukturyzacja-funkcjonalnosci-api\/","title":{"rendered":"Strukturyzacja funkcjonalno\u015bci API"},"content":{"rendered":"\n<p>Nie mam du\u017cego do\u015bwiadczenia je\u015bli chodzi o tworzenie API. Wykona\u0142em sporo pracy, je\u015bli chodzi o integracj\u0119 WordPressa z zewn\u0119trznymi API, ale po\u015bwi\u0119ci\u0142em bardzo ma\u0142o czasu na stworzenie systemu, kt\u00f3ry ma swoje API, z kt\u00f3rym inne systemy mog\u0105 wchodzi\u0107 w interakcje.<\/p>\n<p>Je\u015bli chodzi o to drugie, to w\u0142a\u015bciwie jestem w trakcie robienia tego (i du\u017co si\u0119 ucz\u0119). Istot\u0105 projektu jest aplikacja na iOS, kt\u00f3ra wchodzi w dwukierunkow\u0105 interakcj\u0119 z WordPressem za po\u015brednictwem <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">interfejsu API REST .<\/a><\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160154-61e7069145e53.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-160154-61e7069145e53.png\" alt=\"Strukturyzacja funkcjonalno\u015bci API\" ><\/a><\/p>\n<p>Ch\u0119tnie podziel\u0119 si\u0119 tym wi\u0119cej, ale musz\u0119 to zrobi\u0107, gdy projekt b\u0119dzie dalej rozwijany.<\/p>\n<p>Ale je\u015bli chodzi o prac\u0119 z zewn\u0119trznymi interfejsami API, a nast\u0119pnie budowanie komponent\u00f3w projektu WordPress, kt\u00f3re z nimi wsp\u00f3\u0142dzia\u0142aj\u0105, dwie rzeczy, kt\u00f3re konsekwentnie uwa\u017cam za przydatne, to:<\/p>\n<ul>\n<li><a href=\"http:\/\/docs.guzzlephp.org\/en\/stable\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">korzystanie z odpowiedniej biblioteki<\/a> ,<\/li>\n<li>diagramowanie systemu,<\/li>\n<li>rozdzielenie funkcjonalno\u015bci na cz\u0119\u015bci.<\/li>\n<\/ul>\n<p>A ostatnie dwa punkty powy\u017cej s\u0105 tym, co chc\u0119 om\u00f3wi\u0107 w tym po\u015bcie.<\/p>\n<h2>Strukturyzacja funkcjonalno\u015bci API<\/h2>\n<p>W tym po\u015bcie nie jest zawarty \u017caden kod, ale by\u0107 mo\u017ce b\u0119dzie to wskaz\u00f3wka, w jaki spos\u00f3b mo\u017cesz i\u015b\u0107 naprz\u00f3d w swojej pracy z tworzeniem funkcji API strukturyzacji lub robieniem czego\u015b podobnego we w\u0142asnym.<\/p>\n<h3>Biblioteki zewn\u0119trzne<\/h3>\n<p>Wspominam o tym tylko dlatego, \u017ce uwa\u017cam, \u017ce warto ponownie wykorzysta\u0107 wypr\u00f3bowane i prawdziwe rozwi\u0105zania, kt\u00f3re zosta\u0142y przetestowane (i tym samym wykorzystane) w r\u00f3\u017cnych projektach.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160154-61e706951696d.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-160154-61e706951696d.png\" alt=\"Strukturyzacja funkcjonalno\u015bci API\" ><\/a><\/p>\n<p>Guzzle to moja biblioteka z wyboru. Tak, WordPress ma wbudowane funkcje do komunikowania si\u0119 z innymi adresami URL, ale jest wi\u0119cej mo\u017cliwo\u015bci z Guzzle (zw\u0142aszcza w odniesieniu do komponent\u00f3w \u017c\u0105dania) ni\u017c z WordPress.<\/p>\n<p>To prawda, to moja opinia, ale lubi\u0119 z ni\u0105 pracowa\u0107. <a href=\"http:\/\/docs.guzzlephp.org\/en\/stable\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A dokumentacja jest solidna<\/a>.<\/p>\n<h3>Diagramowanie systemu<\/h3>\n<p>Je\u015bli wystarczaj\u0105co d\u0142ugo pracujesz z integracj\u0105 z zewn\u0119trznymi interfejsami API, musisz przyzwyczai\u0107 si\u0119 do procesu konfigurowania dzia\u0142ania systemu. Zwykle wygl\u0105da to mniej wi\u0119cej tak:<\/p>\n<ol>\n<li>stworzy\u0107 klienta API do po\u0142\u0105czenia z API,<\/li>\n<li>skonfigurowa\u0107 funkcje niezb\u0119dne do realizacji \u017c\u0105da\u0144, kt\u00f3rych potrzebujesz,<\/li>\n<li>przeanalizuj odpowied\u017a,<\/li>\n<li>zwr\u00f3\u0107 go do oryginalnego obiektu lub funkcji, kt\u00f3ra wywo\u0142a\u0142a \u017c\u0105danie.<\/li>\n<\/ol>\n<p>To troch\u0119 uproszczenie (w ko\u0144cu stworzenie klienta API mo\u017ce by\u0107 zadaniem samym w sobie), ale wszystkie punkty pozostaj\u0105 takie same (i nie mo\u017ce by\u0107 z\u0142\u0105 seri\u0105 \ud83e\udd14).<\/p>\n<p>Zreszt\u0105, przede wszystkim, nigdy nie zaszkodzi stworzy\u0107 diagram systemu. To jest co\u015b, co nadal robi\u0119, poniewa\u017c pomaga mi to w pewnym sensie wyartyku\u0142owa\u0107 to, co buduj\u0119, i zobaczy\u0107, czy istniej\u0105 luki w przep\u0142ywie kontroli przez aplikacj\u0119.<\/p>\n<p>Oto dlaczego, je\u015bli nie z innego powodu, jest to wa\u017cne: artyku\u0142owanie tego, co zamierzasz zrobi\u0107, pomaga ci zrozumie\u0107, co robisz i cz\u0119sto ujawnia luki w twoim my\u015bleniu, kt\u00f3re uwa\u017casz za oczywiste.<\/p>\n<p>Wi\u0119c je\u015bli chodzi o uk\u0142adanie systemu, nie zak\u0142adaj, \u017ce masz wszystko wymy\u015blone.<\/p>\n<h3>Oddzielenie funkcjonalno\u015bci<\/h3>\n<p>Je\u015bli czytasz tego bloga od d\u0142u\u017cszego czasu, to wiesz, \u017ce jestem fanem pod\u0105\u017cania za pomys\u0142ami rozwojowymi \u201eseparacji obaw&quot;.<\/p>\n<p>Dzieje si\u0119 tak z wielu powod\u00f3w, z kt\u00f3rych najmniejsze nie s\u0105:<\/p>\n<ul>\n<li>mo\u017cliwo\u015b\u0107 testowania jednostkowego klienta API w izolacji,<\/li>\n<li>utrzymywanie niezale\u017cnego kodu do komunikacji z front-endem i back-endem.<\/li>\n<\/ul>\n<p>Je\u015bli masz klas\u0119 przeznaczon\u0105 do uruchamiania logiki biznesowej na warto\u015bciach, mo\u017cesz przenie\u015b\u0107 wi\u0119kszo\u015b\u0107 obs\u0142ugi b\u0142\u0119d\u00f3w do klasy po\u015bredniej.<\/p>\n<p>Oznacza to, \u017ce klasa core odpowiedzialna za wi\u0119kszo\u015b\u0107 logiki biznesowej powinna mie\u0107 dok\u0142adnie to, czego potrzebuje do swojej pracy. Nie oznacza to, \u017ce nie powinno by\u0107 kontroli b\u0142\u0119d\u00f3w (dzielenie przez zero czy co\u015b, wiesz?), ale oznacza to, \u017ce dane mog\u0105 by\u0107 sprawdzane, zanim dotr\u0105 do klasy podstawowej przez klas\u0119 po\u015brednicz\u0105c\u0105.<\/p>\n<p>I nie tylko mo\u017ce sprawdzi\u0107 brakuj\u0105ce informacje, ale mo\u017ce r\u00f3wnie\u017c zg\u0142osi\u0107 te b\u0142\u0119dy z powrotem do interfejsu u\u017cytkownika.<\/p>\n<h2>Trzy punkty do zapami\u0119tania<\/h2>\n<p>Je\u015bli tworzysz system oparty na Ajaxie w WordPressie, sedno tego wszystkiego jest potr\u00f3jne:<\/p>\n<ol>\n<li>zaprojektuj system, kt\u00f3ry tworzysz,<\/li>\n<li>utworzy\u0107 klas\u0119 pe\u0142noekranow\u0105 do obs\u0142ugi brakuj\u0105cych informacji i zg\u0142osi\u0107 b\u0142\u0119dy,<\/li>\n<li>wy\u015blij pe\u0142ne informacje do podstawowej klasy biznesowej dopiero po zweryfikowaniu wszystkich informacji.<\/li>\n<\/ol>\n<p>Kiedy ju\u017c to zrobisz, celem b\u0119dzie, aby podstawowa klasa biznesowa zwraca\u0142a \u017c\u0105dane warto\u015bci bez b\u0142\u0119d\u00f3w, poniewa\u017c zostan\u0105 one przechwycone, zanim jeszcze do niej dotr\u0105.<\/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>Poradnik, w jaki spos\u00f3b mo\u017cesz i\u015b\u0107 naprz\u00f3d w swojej pracy z tworzeniem funkcji API strukturyzacji lub robieniem czego\u015b podobnego we w\u0142asnym zakresie.<\/p>\n","protected":false},"author":1,"featured_media":224405,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-230956","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230956","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=230956"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230956\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224405"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}