{"id":231572,"date":"2023-01-08T09:57:00","date_gmt":"2023-01-08T06:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231572"},"modified":"2023-01-08T09:57:24","modified_gmt":"2023-01-08T06:57:24","slug":"anvaenda-ett-register-prenumeranter-och-tjaenster-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/anvaenda-ett-register-prenumeranter-och-tjaenster-i-wordpress\/","title":{"rendered":"Anv\u00e4nda ett register, prenumeranter och tj\u00e4nster i WordPress"},"content":{"rendered":"\n<p><strong>TL;DR:<\/strong> Jag tycker att anv\u00e4ndningen av ett register, abonnenter och tj\u00e4nster \u00e4r mycket anv\u00e4ndbart n\u00e4r jag bygger backend-centrerade plugins och verktyg f\u00f6r WordPress. Det h\u00e4r inl\u00e4gget g\u00e5r igenom hur man g\u00f6r.<\/p>\n<hr \/>\n<p>Efter att ha arbetat med designm\u00f6nster, objektorienterad programmering och WordPress i flera \u00e5r, kommer vanliga s\u00e4tt att l\u00f6sa problem att uppst\u00e5.<\/p>\n<p>S\u00e5 h\u00e4r fick vi objektorienterade designm\u00f6nster till att b\u00f6rja med, s\u00e5 kanske det h\u00e4r \u00e4r en WordPress-centrerad variant av det.<\/p>\n<p>\u00c4ven om jag har skrivit om saker som register i tidigare artiklar (och s\u00e5dana som <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/anvaenda-registermoenstret-i-wordpress\/\" title=\"inte ens \u00e4r s\u00e5 gamla\">inte ens \u00e4r s\u00e5 gamla<\/a> ), \u00e4r det aldrig en d\u00e5lig id\u00e9 att \u00e5terkomma till samma \u00e4mne, s\u00e4rskilt n\u00e4r det finns n\u00e5got att forts\u00e4tta att l\u00e4gga till i den tidigare versionen.<\/p>\n<h2>Ett register, abonnenter och tj\u00e4nster<\/h2>\n<p>Allt som beskrivs nedan ska f\u00f6rst\u00e5s inom ramen f\u00f6r WordPress-plugin. Det vill s\u00e4ga, det h\u00e4r \u00e4r inte t\u00e4nkt att l\u00e4sas som ett s\u00e4tt att arbeta med andra ramverk, spr\u00e5k, applikationer eller n\u00e4r du anv\u00e4nder det med andra m\u00f6nster.<\/p>\n<p>Kom ih\u00e5g det n\u00e4r du l\u00e4ser detta.<\/p>\n<hr \/>\n<p>Hur som helst, den allm\u00e4nna id\u00e9n bakom kombinationen av dessa objekttyper om f\u00f6ljande:<\/p>\n<ol>\n<li>Registret hanterar alla abonnenter,<\/li>\n<li>Prenumeranterna lyssnar efter krokar inom WordPress (de som finns eller till och med anpassade krokar),<\/li>\n<li>Tj\u00e4nsterna utf\u00f6r sj\u00e4lva arbetet n\u00e4rhelst abonnenten skickar dem.<\/li>\n<\/ol>\n<p>Syftet \u00e4r att det finns en enda plats f\u00f6r att registrera de klasser som ansvarar f\u00f6r att skicka arbetet. Det \u00e4r allt.<\/p>\n<p>Detta g\u00f6r det ocks\u00e5 enkelt att h\u00e5lla saker \u00e5tskilda s\u00e5 att om du vill testa dina tj\u00e4nster isolerat \u00e4r det mycket enklare eftersom de inte n\u00f6dv\u00e4ndigtvis \u00e4r t\u00e4tt kopplade till WordPress. Och om de \u00e4r det, d\u00e5 kan du h\u00e5na de data som m\u00e5ste skickas till en given funktion och sedan utv\u00e4rdera resultatet.<\/p>\n<p>Det h\u00e4r \u00e4r dock inte en artikel om testning, s\u00e5 tillbaka till de faktiska klasserna.<\/p>\n<h3>Register<\/h3>\n<p>Per definition \u00e4r syftet med ett register att h\u00e5lla reda p\u00e5 saker och ting. N\u00e4r det g\u00e4ller att implementera det h\u00e4r m\u00f6nstret i WordPress \u00e4r tanken att registret kan h\u00e5lla reda p\u00e5 prenumeranter (vilket jag kommer att definiera senare i den h\u00e4r artikeln).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.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-158242-61e6dacccb19c.png\" alt=\"Anv\u00e4nda ett register, prenumeranter och tj\u00e4nster i WordPress\"><\/a><\/p>\n<p>Foto av <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny M\u00fcller<\/a> p\u00e5 <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Vidare \u00e4r tanken att n\u00e4r tiden kommer, vilket sannolikt kommer att vara annorlunda oavsett hur ditt plugin \u00e4r strukturerat, kommer alla prenumeranter att vara instanser. Till den punkten kommer du dock troligen att vilja g\u00f6ra det tidigt i WordPress-livscykeln.<\/p>\n<p>Som sagt, h\u00e4r \u00e4r ett exempel p\u00e5 hur man koder f\u00f6r att registrera prenumeranter:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>N\u00e4sta, h\u00e4r \u00e4r en funktion f\u00f6r att instansiera prenumeranterna.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>Dessa block kan vara en del av samma funktion eller s\u00e5 kan de vara separata beroende p\u00e5 dina behov.<\/p>\n<h3>Prenumeranter<\/h3>\n<p>Som n\u00e4mnts \u00e4r prenumeranter v\u00e4gen till:<\/p>\n<ol>\n<li>Lyssna efter en viss hook i WordPress<\/li>\n<li>Skicka en tj\u00e4nst f\u00f6r att utf\u00f6ra det arbete som \u00e4r avsett f\u00f6r den givna kroken.<\/li>\n<\/ol>\n<p>S\u00e5 anta f\u00f6r ett \u00f6gonblick att du vill g\u00f6ra n\u00e5got n\u00e4r en anv\u00e4ndare raderas. Du vill instansiera en tj\u00e4nst via abonnenten n\u00e4rhelst denna hook intr\u00e4ffar.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.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-158242-61e6dad44a26f.png\" alt=\"Anv\u00e4nda ett register, prenumeranter och tj\u00e4nster i WordPress\"><\/a><\/p>\n<p>Foto av <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee Campbell<\/a> p\u00e5 <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Som ett exempel:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Notera att abonnenten \u00e4r medveten om tj\u00e4nsten (\u00e4ven om den inte \u00e4r beroende av den eftersom den helt enkelt \u00e4r en mellanhand mellan WordPress och tj\u00e4nsten) och anger vilken krok p\u00e5 tj\u00e4nsten som den instansierar.<\/p>\n<h3>Tj\u00e4nster<\/h3>\n<p>Slutligen, tj\u00e4nster \u00e4r de objekt som g\u00f6r allt det tunga arbetet i ett plugin. Det betyder att om de beh\u00f6ver l\u00e4sa eller skriva till databasen, filsystemet, n\u00e4tverket, bearbeta data etc. sker allt inom deras sammanhang.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.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-158242-61e6dadba8851.png\" alt=\"Anv\u00e4nda ett register, prenumeranter och tj\u00e4nster i WordPress\"><\/a><\/p>\n<p>Foto av <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erik Mclean<\/a> p\u00e5 <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>De kanske \u00e4r medvetna om andra klasser, kanske inte. De kan implementera ett gr\u00e4nssnitt eller en abstrakt klass eller inte. Det \u00e4r verkligen utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg. Men po\u00e4ngen \u00e4r att, med hj\u00e4lp av kroken fr\u00e5n ovan som exempel, om du vill g\u00f6ra n\u00e5got n\u00e4r en anv\u00e4ndare raderas s\u00e5 g\u00f6r du det inom tj\u00e4nsten.<\/p>\n<p>Till exempel:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>Och det \u00e4r slutet p\u00e5 det. N\u00e4r tj\u00e4nsten k\u00f6rs kommer kontrollen att returneras till WordPress och applikationen kommer att forts\u00e4tta k\u00f6ras som vanligt.<\/p>\n<h3>Alla tillsammans nu<\/h3>\n<p>Om du antar att du har en bootstrap-fil f\u00f6r din plugin, vilket de flesta g\u00f6r eftersom det \u00e4r h\u00e4r det erforderliga pluginet definieras, kr\u00e4vs en autoloader och instansiering av sj\u00e4lva pluginet sker.<\/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>Att anv\u00e4nda ett register, prenumeranter och tj\u00e4nster \u00e4r anv\u00e4ndbara n\u00e4r du bygger backend-centrerade plugins och verktyg f\u00f6r WordPress. Det h\u00e4r inl\u00e4gget g\u00e5r igenom hur man g\u00f6r.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[838,848,901,807,724,868],"tags":[1173],"class_list":["post-231572","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-handledningar","category-koda","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231572","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=231572"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231572\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=231572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=231572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=231572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}