{"id":230756,"date":"2022-12-04T13:02:00","date_gmt":"2022-12-04T10:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230756"},"modified":"2022-11-09T23:51:17","modified_gmt":"2022-11-09T20:51:17","slug":"rekisterimallin-kaeyttaeminen-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/rekisterimallin-kaeyttaeminen-wordpressissae\/","title":{"rendered":"Rekisterimallin k\u00e4ytt\u00e4minen WordPressiss\u00e4"},"content":{"rendered":"\n<p>Olen keskustellut Twitteriss\u00e4 useiden yst\u00e4vien ja muiden kanssa ohjelmointikielten globaalien muuttujien k\u00e4sitteest\u00e4. Niille, jotka ovat uusia ohjelmoinnin parissa tai jotka eiv\u00e4t ole varmoja siit\u00e4, miksi ne ovat huonoja:<\/p>\n<blockquote>\n<p>Globaalien muuttujien k\u00e4ytt\u00f6 tekee ohjelmistoista vaikeampaa lukea ja ymm\u00e4rt\u00e4\u00e4. Koska mik\u00e4 tahansa koodi miss\u00e4 tahansa ohjelmassa voi muuttaa muuttujan arvoa milloin tahansa, muuttujan k\u00e4yt\u00f6n ymm\u00e4rt\u00e4minen voi edellytt\u00e4\u00e4 suuren osan ohjelman ymm\u00e4rt\u00e4mist\u00e4.<\/p>\n<\/blockquote>\n<p>T\u00e4m\u00e4 ei tarkoita, etteik\u00f6 <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">niill\u00e4 olisi k\u00e4ytt\u00f6\u00e4<\/a><\/strong>, mutta jos olet kiinnostunut olio-ohjelmoinnista (etenkin WordPress-asetuksissa, joissa aiot k\u00e4ytt\u00e4\u00e4 PHP:t\u00e4), on t\u00e4rke\u00e4\u00e4 ymm\u00e4rt\u00e4\u00e4 joitain parempia vaihtoehtoja. kuin globaalit muuttujat.<\/p>\n<p>Toisin sanoen on olemassa tapoja k\u00e4sitell\u00e4 tietoja sovelluksesi ymp\u00e4rill\u00e4 ilman globaaleja muuttujia. Ja yksi t\u00e4llainen tapa on rekisterimalli.<\/p>\n<h2>Rekisterimalli WordPressiss\u00e4<\/h2>\n<p>Ensinn\u00e4kin huomaa, ett\u00e4 suunnittelumallit ylitt\u00e4v\u00e4t mink\u00e4 tahansa tietyn kuvion. Niin kauan kuin kieli tarjoaa objektien (tai jopa abstraktioiden) k\u00e4sitteet, malli on mahdollista toteuttaa.<\/p>\n<p>Mutta miksi vaivautua k\u00e4ytt\u00e4m\u00e4\u00e4n t\u00e4t\u00e4?<\/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=\"Rekisterimallin k\u00e4ytt\u00e4minen WordPressiss\u00e4\" ><\/a><\/p>\n<p>Kuva Samuel Zeller Unsplashista<\/p>\n<p>Lyhyesti sanottuna se tarjoaa oliopohjaisen tavan siirt\u00e4\u00e4 tietoja sovelluksesi ymp\u00e4rill\u00e4 ilman globaaleja muuttujia. Asiat, kuten <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">riippuvuusinjektios\u00e4ili\u00f6t,<\/a><\/strong> ovat my\u00f6s hyvi\u00e4 t\u00e4h\u00e4n, mutta ne eiv\u00e4t kuulu t\u00e4m\u00e4n postauksen piiriin. V\u00e4itt\u00e4isin my\u00f6s, ett\u00e4 joskus ne voivat olla ylivoimaisia \u200b\u200bpienten laajennusten yhteydess\u00e4.<\/p>\n<h3>Mallin toteuttaminen<\/h3>\n<p>N\u00e4in ollen kuinka voimme ottaa rekisterimallin k\u00e4ytt\u00f6\u00f6n WordPressiss\u00e4 ja hy\u00f6dynt\u00e4\u00e4 sit\u00e4 ty\u00f6ss\u00e4mme? Katsotaanpa <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ensin kuvion perusrakennetta<\/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>Huomaa, ett\u00e4 sen toteutus on melko yksinkertaista:<\/p>\n<ol>\n<li>Luokka sis\u00e4lt\u00e4\u00e4 yhden taulukon yksityisen\u00e4 omaisuutena.<\/li>\n<li>Tiedot lis\u00e4t\u00e4\u00e4n taulukkoon tietyll\u00e4 tunnuksella.<\/li>\n<li>Tiedot voidaan hakea kuviosta tunnuksella.<\/li>\n<\/ol>\n<p>Voit jopa vied\u00e4 t\u00e4m\u00e4n tietyn mallin seuraavalle tasolle, jos se hyv\u00e4ksyy vain tietyn tyyppisen luokan (kuten esimerkiksi AbstractEvent) ja sitten automaattisesti kutsua luokassa olevan funktion aina, kun se siirret\u00e4\u00e4n (tai haetaan) rekisterist\u00e4.<\/p>\n<p>Mutta siit\u00e4 on tulossa monimutkaisempi toteutus, jonka haluaisin t\u00e4lle viestille.<\/p>\n<h3>Rekisterin m\u00e4\u00e4ritt\u00e4minen<\/h3>\n<p>WordPressin koukkuj\u00e4rjestelm\u00e4n luonteen vuoksi rekisteri on m\u00e4\u00e4ritett\u00e4v\u00e4 ja rekister\u00f6it\u00e4v\u00e4 WordPressiin tietyll\u00e4 tavalla.<\/p>\n<p>Oletetaan, ett\u00e4 ty\u00f6skentelet laajennuksen kanssa. Tee laajennuksen bootstrap-tiedostossa <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jotain t\u00e4llaista:<\/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>T\u00e4m\u00e4 luo rekisterin ja sitten vastaavan suodattimen, jota voimme k\u00e4ytt\u00e4\u00e4 my\u00f6hemmin laajennuksessa rekisterin ja siten sen yll\u00e4pit\u00e4mien muiden objektien hakemiseen.<\/p>\n<h3>Rekisterin k\u00e4ytt\u00e4minen<\/h3>\n<p>Jos haluat lis\u00e4t\u00e4 kohteen rekisteriin, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kutsu lis\u00e4ystoiminto ja anna yksil\u00f6llinen tunnus ja objektin esiintym\u00e4<\/a><\/strong>. Huomaa, ett\u00e4 nykyinen toteutuksemme siirt\u00e4\u00e4 kaikki aiemmat objektin esiintym\u00e4t roskakoriin, jolla on sama avain, ja korvaa sen sill\u00e4, mit\u00e4 annamme sille.<\/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>Sielt\u00e4 voit sitten noutaa rekisteriin tallentamasi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">objektit :<\/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 voit k\u00e4ytt\u00e4\u00e4 niit\u00e4 aivan kuten oy muillakin tavoilla. Mutta n\u00e4in v\u00e4ltyt\u00e4\u00e4n yksitt\u00e4isten muuttujien, globaalien muuttujien tai muiden vaarallisten asioiden k\u00e4yt\u00f6n tarpeelta.<\/p>\n<h2>Sana koetettavuudesta<\/h2>\n<p>Toinen etu, jonka l\u00f6yd\u00e4n t\u00e4m\u00e4n mallin toteutuksesta, on se, ett\u00e4 sen avulla voit kirjoittaa yksikk\u00f6testej\u00e4 helpommin sit\u00e4 vastaan, vaan se antaa sinulle my\u00f6s mahdollisuuden kirjoittaa testej\u00e4 sen sis\u00e4lt\u00e4miin objekteihin.<\/p>\n<p>T\u00e4ll\u00e4 tarkoitan, ett\u00e4 voit kirjoittaa luokkasi riippumattomammin WordPressist\u00e4, jolloin verkkotunnuksen logiikka erotetaan ydinsovelluksesta ja ne edustavat paremmin tietoja, joita niiden on tarkoitus yll\u00e4pit\u00e4\u00e4.<\/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>On olemassa tapoja k\u00e4sitell\u00e4 tietoja sovelluksesi ymp\u00e4rill\u00e4 ilman globaaleja muuttujia. Ja yksi t\u00e4llainen tapa on rekisterimalli.<\/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":[719,895,843,864],"tags":[1166],"class_list":["post-230756","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230756"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230756\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}