{"id":230167,"date":"2022-12-04T12:42:00","date_gmt":"2022-12-04T09:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230167"},"modified":"2022-11-09T20:24:58","modified_gmt":"2022-11-09T17:24:58","slug":"registri-mustri-kasutamine-wordpressis","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/registri-mustri-kasutamine-wordpressis\/","title":{"rendered":"Registri mustri kasutamine WordPressis"},"content":{"rendered":"\n<p>Olen vestelnud Twitteris erinevate s\u00f5prade ja teiste inimestega programmeerimiskeelte globaalsete muutujate m\u00f5iste \u00fcle. Neile, kes on programmeerimisega uued v\u00f5i kes pole kindlad, miks need halvad on:<\/p>\n<blockquote>\n<p>Globaalsete muutujate kasutamine muudab tarkvara lugemise ja m\u00f5istmise raskemaks. Kuna mis tahes kood programmis v\u00f5ib muutuja v\u00e4\u00e4rtust igal ajal muuta, v\u00f5ib muutuja kasutamise m\u00f5istmine eeldada suure osa programmist m\u00f5istmist.<\/p>\n<\/blockquote>\n<p>See ei t\u00e4henda, et <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">neid ei kasutata<\/a><\/strong>, kuid kui olete huvitatud objektorienteeritud programmeerimisest (eriti WordPressi seadetes, kus kavatsete PHP-d kasutada), on oluline m\u00f5ista m\u00f5nda paremat alternatiivi. kui globaalsed muutujad.<\/p>\n<p>See t\u00e4hendab, et on olemas viise, kuidas oma rakenduses andmeid edastada, ilma et oleks vaja globaalseid muutujaid. Ja \u00fcks selline viis on registri muster.<\/p>\n<h2>WordPressi registri muster<\/h2>\n<p>Esiteks pange t\u00e4hele, et kujundusmustrid \u00fcletavad mis tahes konkreetset mustrit. Kuni keel pakub objektide (v\u00f5i isegi abstraktsioonide) m\u00f5isteid, on mustrit v\u00f5imalik rakendada.<\/p>\n<p>Aga milleks selle kasutamisega vaeva n\u00e4ha?<\/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=\"Registri mustri kasutamine WordPressis\" ><\/a><\/p>\n<p>Samuel Zelleri foto saidil Unsplash<\/p>\n<p>L\u00fchidalt \u00f6eldes pakub see objektorienteeritud viisi rakenduse \u00fcmber teabe edastamiseks ilma globaalseid muutujaid kasutamata. Sellised asjad nagu <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00f5ltuvuss\u00fcsti konteinerid<\/a><\/strong> on ka selleks head, kuid need ei kuulu selle postituse ulatusse. Ma v\u00e4idan ka, et m\u00f5nikord v\u00f5ivad need v\u00e4ikeste pistikprogrammide kontekstis olla \u00fcle j\u00f5u k\u00e4ivad.<\/p>\n<h3>Mustri rakendamine<\/h3>\n<p>Seda arvestades, kuidas saaksime WordPressis registrimustrit rakendada ja seej\u00e4rel kogu oma t\u00f6\u00f6s \u00e4ra kasutada? Vaatame k\u00f5igepealt <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mustri p\u00f5histruktuuri<\/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>Pange t\u00e4hele, et selle rakendamine on \u00fcsna lihtne:<\/p>\n<ol>\n<li>Klass sisaldab eraomandina \u00fchte massiivi.<\/li>\n<li>Andmed lisatakse massiivi kindla ID-ga.<\/li>\n<li>Andmeid saab mustrist ID-ga k\u00e4tte saada.<\/li>\n<\/ol>\n<p>V\u00f5ite isegi viia selle konkreetse mustri j\u00e4rgmisele tasemele, kui see aktsepteerib ainult teatud t\u00fc\u00fcpi klassi (n\u00e4iteks AbstractEvent) ja k\u00e4ivitab seej\u00e4rel automaatselt klassi funktsiooni, kui see registrist sisestatakse (v\u00f5i hangitakse).<\/p>\n<p>Kuid see on muutumas keerulisemaks teostuseks, mida ma selle postituse jaoks sooviksin.<\/p>\n<h3>Registri seadistamine<\/h3>\n<p>WordPressi konksus\u00fcsteemi olemuse t\u00f5ttu tuleb register seadistada ja seej\u00e4rel WordPressis registreerida.<\/p>\n<p>Oletame, et t\u00f6\u00f6tate pistikprogrammiga. Tehke pistikprogrammi alglaadimisfailis <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">midagi sellist:<\/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>See loob registri ja seej\u00e4rel vastava filtri, mida saame hiljem pistikprogrammis kasutada registri ja seega ka muude selle hooldatavate objektide toomiseks.<\/p>\n<h3>Registri kasutamine<\/h3>\n<p>Objekti registrisse <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lisamiseks helistage lisamisfunktsioonile ja edastage kordumatu ID ja objekti eksemplar<\/a><\/strong>. Pange t\u00e4hele, et meie praegune rakendamine h\u00e4vitab k\u00f5ik sama v\u00f5tmega objekti varasemad eksemplarid ja asendab selle sellega, mida me sellele edastame.<\/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>Sealt saate seej\u00e4rel tuua registrisse salvestatud <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">objektid .<\/a><\/strong><\/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>Ja saate neid kasutada samamoodi nagu oy muul viisil. Kuid see v\u00e4ldib \u00fcksikute, globaalsete muutujate v\u00f5i muude ohtlike asjade kasutamise vajadust.<\/p>\n<h2>S\u00f5na testitavuse kohta<\/h2>\n<p>Teine eelis, mille ma selle mustri rakendamisel leian, on see, et see mitte ainult ei v\u00f5imalda teil h\u00f5lpsamini selle vastu \u00fchikteste kirjutada, vaid annab teile ka v\u00f5imaluse kirjutada teste objektide vastu, mida see mahutab.<\/p>\n<p>Selle all pean silmas, et saate oma klassid kirjutada WordPressist s\u00f5ltumatumalt, eraldades seega domeeniloogika p\u00f5hirakendusest ja muutes need paremini esindavaks andmete suhtes, mida nad peaksid s\u00e4ilitama.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Andmete edastamiseks rakenduses on v\u00f5imalusi ilma globaalsete muutujateta. Ja \u00fcks selline viis on registri muster.<\/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":[718,894,842,863],"tags":[1165],"class_list":["post-230167","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-opetused","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=230167"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230167\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}