{"id":230165,"date":"2022-12-04T12:29:00","date_gmt":"2022-12-04T09:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230165"},"modified":"2022-11-09T20:24:13","modified_gmt":"2022-11-09T17:24:13","slug":"anvaenda-registermoenstret-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/anvaenda-registermoenstret-i-wordpress\/","title":{"rendered":"Anv\u00e4nda registerm\u00f6nstret i WordPress"},"content":{"rendered":"\n<p>Jag har haft n\u00e5gra samtal med olika v\u00e4nner och andra p\u00e5 Twitter om begreppet globala variabler i programmeringsspr\u00e5k. F\u00f6r dig som \u00e4r ny p\u00e5 programmering eller som \u00e4r os\u00e4ker p\u00e5 varf\u00f6r de \u00e4r d\u00e5liga:<\/p>\n<blockquote>\n<p>Anv\u00e4ndningen av globala variabler g\u00f6r programvara sv\u00e5rare att l\u00e4sa och f\u00f6rst\u00e5. Eftersom vilken kod som helst i programmet kan \u00e4ndra v\u00e4rdet p\u00e5 variabeln n\u00e4r som helst, kan f\u00f6rst\u00e5elsen av anv\u00e4ndningen av variabeln inneb\u00e4ra att man f\u00f6rst\u00e5r en stor del av programmet.<\/p>\n<\/blockquote>\n<p>Detta betyder inte att <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de inte har sin anv\u00e4ndning<\/a><\/strong>, men om du \u00e4r intresserad av objektorienterad programmering (s\u00e4rskilt i en WordPress-milj\u00f6 d\u00e4r du ska anv\u00e4nda PHP), s\u00e5 \u00e4r det viktigt att f\u00f6rst\u00e5 n\u00e5gra b\u00e4ttre alternativ \u00e4n globala variabler.<\/p>\n<p>Det vill s\u00e4ga, det finns s\u00e4tt att arbeta med att skicka data runt din applikation utan behov av globala variabler. Och ett s\u00e5dant s\u00e4tt \u00e4r registerm\u00f6nstret.<\/p>\n<h2>Registerm\u00f6nstret i WordPress<\/h2>\n<p>F\u00f6rst, notera att designm\u00f6nster \u00f6verskrider ett givet speciellt m\u00f6nster. S\u00e5 l\u00e4nge som ett spr\u00e5k erbjuder begreppen objekt (eller till och med abstraktioner), s\u00e5 \u00e4r det m\u00f6jligt att implementera m\u00f6nstret.<\/p>\n<p>Men varf\u00f6r bry sig om att anv\u00e4nda detta?<\/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=\"Anv\u00e4nda registerm\u00f6nstret i WordPress\" ><\/a><\/p>\n<p>Foto av Samuel Zeller p\u00e5 Unsplash<\/p>\n<p>Kort sagt, det ger ett objektorienterat s\u00e4tt att skicka information runt din applikation utan behov av globala variabler. Saker som <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">injektionsbeh\u00e5llare f\u00f6r beroende<\/a><\/strong> \u00e4r ocks\u00e5 bra f\u00f6r detta, men de ligger utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg. Jag skulle ocks\u00e5 h\u00e4vda att det finns tillf\u00e4llen d\u00e5 de kan vara \u00f6verdrivna i samband med sm\u00e5 plugins.<\/p>\n<h3>Implementering av m\u00f6nstret<\/h3>\n<p>Med det sagt, hur kan vi implementera registerm\u00f6nstret i WordPress och sedan utnyttja det genom hela v\u00e5rt arbete? L\u00e5t oss f\u00f6rst ta en titt p\u00e5 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00f6nstrets grundl\u00e4ggande struktur<\/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>Observera att implementeringen \u00e4r ganska enkel:<\/p>\n<ol>\n<li>Klassen inneh\u00e5ller en enda array som en privat egendom.<\/li>\n<li>Data l\u00e4ggs till i arrayen med ett specifikt ID.<\/li>\n<li>Data kan h\u00e4mtas fr\u00e5n m\u00f6nstret med ID.<\/li>\n<\/ol>\n<p>Du kan till och med ta det h\u00e4r specifika m\u00f6nstret till n\u00e4sta niv\u00e5 om det bara accepterar en klass av en viss typ (som en AbstractEvent, till exempel) och sedan automatiskt anropa en funktion p\u00e5 klassen n\u00e4r den skickas in (eller h\u00e4mtas) fr\u00e5n registret.<\/p>\n<p>Men det blir en mer komplex implementering som jag skulle vilja ha f\u00f6r det h\u00e4r inl\u00e4gget.<\/p>\n<h3>Konfigurera registret<\/h3>\n<p>P\u00e5 grund av naturen hos WordPress hook-system finns det ett speciellt s\u00e4tt p\u00e5 vilket registret m\u00e5ste st\u00e4llas in och sedan registreras med WordPress.<\/p>\n<p>L\u00e5t oss s\u00e4ga att du arbetar med ett plugin. G\u00f6r n\u00e5got s\u00e5 h\u00e4r i pluginens bootstrap-fil <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">:<\/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>Detta skapar registret och skapar sedan ett motsvarande filter som vi kan anv\u00e4nda senare i pluginet f\u00f6r att h\u00e4mta registret och d\u00e4rmed andra objekt som det underh\u00e5ller.<\/p>\n<h3>Anv\u00e4nda registret<\/h3>\n<p>F\u00f6r att l\u00e4gga till ett objekt i registret, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anropa add-funktionen och skicka ett unikt ID och en instans av objektet<\/a><\/strong>. Observera att v\u00e5r nuvarande implementering kommer att kassera alla tidigare instanser av ett objekt som har samma nyckel och ers\u00e4tta det med vad vi \u00e4n skickar till det.<\/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>D\u00e4rifr\u00e5n kan du sedan <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4mta objekten<\/a><\/strong> som du hade lagrat i registret:<\/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>Och du kan anv\u00e4nda dem precis som du skulle g\u00f6ra p\u00e5 n\u00e5got annat s\u00e4tt. Men detta undviker anv\u00e4ndningsbehovet f\u00f6r singlar, globala variabler eller andra farliga saker.<\/p>\n<h2>Ett ord om testbarhet<\/h2>\n<p>En annan f\u00f6rdel som jag finner med implementeringen av det h\u00e4r m\u00f6nstret \u00e4r att det inte bara g\u00f6r att du l\u00e4ttare kan skriva enhetstester mot det, utan det ger dig ocks\u00e5 m\u00f6jligheten att skriva tester mot de objekt som det kan h\u00e5lla.<\/p>\n<p>Med det menar jag att du kan skriva dina klasser mer oberoende av WordPress och p\u00e5 s\u00e5 s\u00e4tt separera dom\u00e4nlogiken fr\u00e5n k\u00e4rnapplikationen och g\u00f6ra dem mer representativa f\u00f6r den data de ska underh\u00e5lla.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det finns s\u00e4tt att arbeta med att skicka data runt din applikation utan behov av globala variabler. Och ett s\u00e5dant s\u00e4tt \u00e4r registerm\u00f6nstret.<\/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":[848,901,724,868],"tags":[1173],"class_list":["post-230165","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230165"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230165\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}