{"id":230086,"date":"2022-12-04T12:25:00","date_gmt":"2022-12-04T09:25:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230086"},"modified":"2022-11-09T20:01:43","modified_gmt":"2022-11-09T17:01:43","slug":"korzystanie-z-wzorca-rejestru-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/korzystanie-z-wzorca-rejestru-w-wordpress\/","title":{"rendered":"Korzystanie z wzorca rejestru w WordPress"},"content":{"rendered":"\n<p>Odby\u0142em kilka rozm\u00f3w z r\u00f3\u017cnymi znajomymi i innymi osobami na Twitterze na temat poj\u0119cia zmiennych globalnych w j\u0119zykach programowania. Dla tych, kt\u00f3rzy s\u0105 nowicjuszami w programowaniu lub nie s\u0105 pewni, dlaczego s\u0105 z\u0142e:<\/p>\n<blockquote>\n<p>U\u017cycie zmiennych globalnych sprawia, \u017ce \u200b\u200boprogramowanie jest trudniejsze do odczytania i zrozumienia. Poniewa\u017c dowolny kod w dowolnym miejscu programu mo\u017ce zmieni\u0107 warto\u015b\u0107 zmiennej w dowolnym momencie, zrozumienie u\u017cycia zmiennej mo\u017ce poci\u0105ga\u0107 za sob\u0105 zrozumienie du\u017cej cz\u0119\u015bci programu.<\/p>\n<\/blockquote>\n<p>Nie oznacza to, <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u017ce nie maj\u0105 one swojego zastosowania<\/a><\/strong>, ale je\u015bli interesuje Ci\u0119 programowanie obiektowe (zw\u0142aszcza w ustawieniach WordPress, w kt\u00f3rych zamierzasz u\u017cywa\u0107 PHP), wa\u017cne jest, aby zrozumie\u0107 lepsze alternatywy ni\u017c zmienne globalne.<\/p>\n<p>Oznacza to, \u017ce istniej\u0105 sposoby pracy z przekazywaniem danych w aplikacji bez konieczno\u015bci stosowania zmiennych globalnych. Jednym z takich sposob\u00f3w jest wzorzec rejestru.<\/p>\n<h2>Wzorzec rejestru w WordPress<\/h2>\n<p>Po pierwsze, zauwa\u017c, \u017ce wzorce projektowe wykraczaj\u0105 poza ka\u017cdy konkretny wzorzec. Dop\u00f3ki j\u0119zyk oferuje koncepcje obiekt\u00f3w (lub nawet abstrakcje), mo\u017cliwe jest zaimplementowanie wzorca.<\/p>\n<p>Ale po co zawraca\u0107 sobie g\u0142ow\u0119 u\u017cywaniem tego?<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163107-61e74a43bb7bf.jpg\" 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-163107-61e74a43bb7bf.jpg\" alt=\"Korzystanie z wzorca rejestru w WordPress\" ><\/a><\/p>\n<p>Zdj\u0119cie Samuela Zellera na Unsplash<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, zapewnia zorientowany obiektowo spos\u00f3b przekazywania informacji wok\u00f3\u0142 aplikacji bez potrzeby stosowania zmiennych globalnych. Rzeczy takie jak <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kontenery do wstrzykiwania zale\u017cno\u015bci<\/a><\/strong> r\u00f3wnie\u017c s\u0105 do tego dobre, ale wykraczaj\u0105 poza zakres tego postu. Twierdz\u0119 r\u00f3wnie\u017c, \u017ce s\u0105 chwile, w kt\u00f3rych mog\u0105 by\u0107 przesad\u0105 w kontek\u015bcie ma\u0142ych wtyczek.<\/p>\n<h3>Implementacja wzorca<\/h3>\n<p>Maj\u0105c to na uwadze, jak mo\u017cemy zaimplementowa\u0107 wzorzec rejestru w WordPressie, a nast\u0119pnie wykorzysta\u0107 go w ca\u0142ej naszej pracy? Przyjrzyjmy si\u0119 najpierw <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podstawowej strukturze wzoru<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Serves as a registry for all objects that need to be accessed globally throughout the\n * plugin.\n *\/\nclass Registry\n{\n\n  \/**\n   * @var array The array used to the the various objects that will be used in the plugin.\n   *\/\n  private $storage;\n\n  \/**\n   * Initializes the plugin by creating an instance of an empty array.\n   *\/\n  public function __construct()\n  {\n      $this-&gt;storage = [];\n  }\n\n  \/**\n   * Adds an instance of a class to the registry's storage array using the given key\n   *\n   * @param string $id    The ID of the object to be used to retrieve it later in the plugin.\n   * @param mixed  $class An instance of the class that will be associated with the specified key.\n   *\/\n  public function add($id, $class)\n  {\n      $this-&gt;storage[$id] = $class;\n  }\n\n  \/**\n   * @param string $id    The ID of the object to retrieve from the repository.\n   * @return mixed $class An instance of the class associated with the specified key (or null if it doesn't exist).\n   *\/\n  public function get($id)\n  {\n      return array_key_exists($id, $this-&gt;storage)? $this-&gt;storage[$id]: null;\n  }\n}<\/code><\/pre>\n<p>Zauwa\u017c, \u017ce jego implementacja jest do\u015b\u0107 prosta:<\/p>\n<ol>\n<li>Klasa zawiera pojedyncz\u0105 tablic\u0119 jako w\u0142asno\u015b\u0107 prywatn\u0105.<\/li>\n<li>Dane s\u0105 dodawane do tablicy z okre\u015blonym identyfikatorem.<\/li>\n<li>Dane mo\u017cna pobra\u0107 z wzorca z identyfikatorem.<\/li>\n<\/ol>\n<p>Mo\u017cesz nawet przenie\u015b\u0107 ten konkretny wzorzec na wy\u017cszy poziom, je\u015bli akceptuje on tylko klas\u0119 okre\u015blonego typu (na przyk\u0142ad AbstractEvent), a nast\u0119pnie automatycznie wywo\u0142ywa\u0107 funkcj\u0119 w klasie za ka\u017cdym razem, gdy jest przekazywana (lub pobierana) z rejestru.<\/p>\n<p>Ale to wchodzi w bardziej z\u0142o\u017con\u0105 implementacj\u0119, kt\u00f3r\u0105 chcia\u0142bym w tym po\u015bcie.<\/p>\n<h3>Konfigurowanie rejestru<\/h3>\n<p>Ze wzgl\u0119du na natur\u0119 systemu hak\u00f3w WordPressa istnieje szczeg\u00f3lny spos\u00f3b, w jaki Rejestr musi zosta\u0107 skonfigurowany, a nast\u0119pnie zarejestrowany w WordPressie.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce pracujesz z wtyczk\u0105. W pliku startowym wtyczki <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zr\u00f3b co\u015b takiego:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Creates a Registry using the Registry Design Pattern to store objects\n * that can be used throughout the plugin.\n *\n *\/\n$registry = new Registry();\nadd_filter('acmeRegistry', function() use ($registry) {\n  return $registry;\n});<\/code><\/pre>\n<p>Spowoduje to utworzenie rejestru, a nast\u0119pnie utworzenie odpowiedniego filtra, kt\u00f3rego mo\u017cemy p\u00f3\u017aniej u\u017cy\u0107 we wtyczce, aby pobra\u0107 rejestr, a tym samym inne obs\u0142ugiwane przez niego obiekty.<\/p>\n<h3>Korzystanie z rejestru<\/h3>\n<p>Aby doda\u0107 obiekt do rejestru, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wywo\u0142aj funkcj\u0119 add i przeka\u017c unikalny identyfikator oraz instancj\u0119 obiektu<\/a><\/strong>. Zauwa\u017c, \u017ce nasza obecna implementacja usunie wszystkie poprzednie wyst\u0105pienia obiektu, kt\u00f3ry ma ten sam klucz i zast\u0105pi go tym, co do niego przeka\u017cemy.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository and add an instance of a \n * PostManager to it. The PostManager is a class that allows us\n * to manipulate posts.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());<\/code><\/pre>\n<p>Stamt\u0105d mo\u017cesz <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pobra\u0107 obiekty<\/a><\/strong>, kt\u00f3re zosta\u0142y zapisane w rejestrze:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository, get a reference to the PostManager\n * then you can begin working with it.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());\n\n\/\/ An example call that you can make to set the title of the post.\n$postManager-&gt;updateTitle('This Is the New Title');\n<\/code><\/pre>\n<p>I mo\u017cesz ich u\u017cywa\u0107 tak samo, jak w ka\u017cdy inny spos\u00f3b. Ale to pozwala unikn\u0105\u0107 u\u017cywania singleton\u00f3w, zmiennych globalnych lub innych niebezpiecznych rzeczy.<\/p>\n<h2>S\u0142owo o testowalno\u015bci<\/h2>\n<p>Kolejn\u0105 zalet\u0105, kt\u00f3r\u0105 znalaz\u0142em w implementacji tego wzorca, jest to, \u017ce nie tylko pozwala on \u0142atwiej pisa\u0107 testy jednostkowe wzgl\u0119dem niego, ale tak\u017ce daje mo\u017cliwo\u015b\u0107 pisania test\u00f3w wzgl\u0119dem obiekt\u00f3w, kt\u00f3re mo\u017ce przechowywa\u0107.<\/p>\n<p>Rozumiem przez to, \u017ce mo\u017cesz pisa\u0107 swoje klasy bardziej niezale\u017cne od WordPressa, oddzielaj\u0105c w ten spos\u00f3b logik\u0119 domeny od podstawowej aplikacji i czyni\u0105c je bardziej reprezentatywnymi dla danych, kt\u00f3re maj\u0105 utrzymywa\u0107.<\/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>Istniej\u0105 sposoby pracy z przekazywaniem danych w aplikacji bez konieczno\u015bci stosowania zmiennych globalnych. Jednym z takich sposob\u00f3w jest wzorzec rejestru.<\/p>\n","protected":false},"author":1,"featured_media":163108,"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-230086","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\/230086","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=230086"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230086\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}