{"id":231447,"date":"2023-01-04T13:43:00","date_gmt":"2023-01-04T10:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231447"},"modified":"2023-01-04T13:44:40","modified_gmt":"2023-01-04T10:44:40","slug":"de-coupling-domain-logic-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/de-coupling-domain-logic-i-wordpress\/","title":{"rendered":"De-coupling Domain Logic i WordPress"},"content":{"rendered":"\n<p>Kom ih\u00e5g att WordPress anv\u00e4nder det <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4ndelsedrivna designm\u00f6nstret<\/a> och \u00e4ven om vi ofta h\u00e4nvisar till \u00e5tg\u00e4rder och filter, handlar konceptet om krokar. Fl\u00f6det av kontroll genom programmet g\u00e5r ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<ol>\n<li>K\u00f6r programmet,<\/li>\n<li>N\u00e4rhelst programmet st\u00f6ter p\u00e5 en krok (i WordPress ser vi <code>do_action<\/code>eller <code>apply_filters<\/code>), iterera igenom alla registrerade krokar,<\/li>\n<li>\u00c5terg\u00e5 kontrollen tillbaka till programmet,<\/li>\n<li>K\u00f6r till slutet.<\/li>\n<\/ol>\n<p>Det h\u00e4r skiljer sig inte helt fr\u00e5n Publisher\/Subscriber-m\u00f6nstret (eller <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PubSub<\/a>, f\u00f6rkortat) men det finns en viktig skillnad: Det h\u00e4ndelsedrivna m\u00f6nstret signalerar helt enkelt att n\u00e5got har h\u00e4nt och om det finns krokar kommer de att avfyras. PubSub-m\u00f6nstret kommer att ber\u00e4tta f\u00f6r en registrerad prenumerant att g\u00f6ra n\u00e5got.<\/p>\n<p>Hur som helst, tillbaka till krokar i WordPress. Att beh\u00e5lla de tv\u00e5 begreppen krokar som vi har kan g\u00f6ras enklast genom att t\u00e4nka p\u00e5 dem s\u00e5 h\u00e4r:<\/p>\n<ul>\n<li>Handlingar \u00e4r till f\u00f6r att g\u00f6ra n\u00e5got,<\/li>\n<li>Filter \u00e4r till f\u00f6r att bearbeta data.<\/li>\n<\/ul>\n<p>Om du funderar p\u00e5 att n\u00e4rma dig WordPress-utveckling p\u00e5 ett objektorienterat s\u00e4tt, \u00e4r det ingen bra id\u00e9 att koppla din kod till WordPress-k\u00e4rnan genom att registrera dina klasser via krokar till k\u00e4rnapplikationen.<\/p>\n<p>Med andra ord, registrera inte din aff\u00e4rslogik med WordPress. H\u00e5ll dem \u00e5tskilda. H\u00e4r \u00e4r ett lackmustest f\u00f6r om ditt arbete \u00e4r t\u00e4tt kopplat till WordPress: Om du inte kan k\u00f6ra ett enhetstest mot din klass utan att ladda WordPress, \u00e4r det t\u00e4tt kopplat.<\/p>\n<p>S\u00e5 vad \u00e4r l\u00f6sningen? Delegation.<\/p>\n<h2>Dom\u00e4nlogik i WordPress<\/h2>\n<p>Dom\u00e4nlogik och aff\u00e4rslogik \u00e4r utbytbara vad jag betr\u00e4ffar, s\u00e5 om du har l\u00e4st tidigare inl\u00e4gg om detta och jag har pratat om dem p\u00e5 olika s\u00e4tt s\u00e5 vet du varf\u00f6r.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158738-61e6e493ec777.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-158738-61e6e493ec777.png\" alt=\"De-coupling Domain Logic i WordPress\"><\/a><\/p>\n<p><a href=\"https:\/\/unsplash.com\/photos\/guiQYiRxkZY\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kreditera<\/a><\/p>\n<p>D\u00e4refter g\u00f6rs id\u00e9n att delegera logik fr\u00e5n WordPress till en klass f\u00f6r dom\u00e4nlogik i WordPress av en mellanklass som \u00e4r ansvarig f\u00f6r f\u00f6ljande:<\/p>\n<ol>\n<li>Prenumerera p\u00e5 en hook,<\/li>\n<li>Delegera arbetet till en klass.<\/li>\n<\/ol>\n<p>Jag vet att klasser ska g\u00f6ra &quot;en sak bra&quot;, men vad h\u00e4nder om den ena saken \u00e4r delegering?<\/p>\n<blockquote>\n<p>att beg\u00e5 (befogenheter, funktioner etc.) till en annan som ombud<\/p>\n<p><a href=\"https:\/\/www.dictionary.com\/browse\/delegate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ordboken<\/a><\/p>\n<\/blockquote>\n<p>Och f\u00f6r att \u00f6verl\u00e5ta funktionalitet till en annan agent eller, i v\u00e5rt fall, en klass, m\u00e5ste du ha f\u00f6rm\u00e5gan att veta vad du delegerar. Ibland, f\u00f6r att g\u00f6ra en sak beh\u00f6ver du k\u00e4nna till flera delar av information.<\/p>\n<p>S\u00e5 hur ser det h\u00e4r ut rent praktiskt? F\u00f6rest\u00e4ll dig att du har en <code>[AbstractSubscriber](https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/Subscriber\/AbstractSubscriber.php)<\/code>till kommer att ta namnet p\u00e5 en krok i dess konstruktor:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of Remove Empty Shortcodes.\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace TomMcFarlinRESCSubscriber;\n\nuse TomMcFarlinUtilitiesRegistry;\n\n\/**\n * An abstract implementation of a subscriber that requires a hook and the ability to\n * start the class.\n *\/\nabstract class AbstractSubscriber\n{\n    \/**\n     * @var string a reference to the hook to which the subscriber should be registered\n     *\/\n    protected $hook;\n\n    \/**\n     * @var Registry a reference to the simple container used to maintain plugin objects\n     *\/\n    protected $registry;\n\n    \/**\n     * @param string $hook the hook to which the subscriber is registered\n     *\/\n    public function __construct(string $hook)\n    {\n        $this-&gt;hook = $hook;\n        $this-&gt;registry = apply_filters('rescRegistry', null);\n    }\n\n    \/**\n     * @return string the hook to which the subscriber is registered\n     *\/\n    public function getHook(): string\n    {\n        return $this-&gt;hook;\n    }\n\n    abstract public function load();\n}<\/code><\/pre>\n<p>Och sedan n\u00e4r det \u00e4r klart kommer <code>load<\/code>funktionen att skicka arbetet till en klass som \u00e4r ansvarig f\u00f6r att faktiskt utf\u00f6ra bearbetningen.<\/p>\n<p>Ta till exempel <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/WordPress\/PostContentProcessor.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den h\u00e4r koden<\/a> fr\u00e5n <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ta bort tomma kortkoder<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of Remove Empty Shortcodes.\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace TomMcFarlinRESCWordPress;\n\n\/**\n * Processes the post content by looking to see if any orphaned shortcode\n * exists and then removes it from displaying it from the user.\n *\/\nclass PostContentProcessor\n{\n    \/**\n     * A reference to the Shortcode Manager for processing orphaned shortcodes.\n     *\/\n    private $shortcodeManager;\n\n    \/**\n     * Initializes the class by setting up a reference to the Registry and the\n     * Shortcode Manager.\n     *\/\n    public function __construct()\n    {\n        $registry = apply_filters('rescRegistry', null);\n        $this-&gt;shortcodeManager = $registry-&gt;get('shortcodeManager');\n    }\n\n    \/**\n     * @param string $content the filtered post content\n     *\n     * @return string $content the filtered post content without the shortcode\n     *\/\n    public function run(string $content): string\n    {\n        return $this-&gt;shortcodeManager-&gt;processShortcodes($content);\n    }\n}<\/code><\/pre>\n<p>En klass prenumererar p\u00e5 en viss h\u00e4ndelse, till exempel <code>[the_content](https:\/\/developer.wordpress.org\/reference\/functions\/the_content\/)<\/code>, och delegerar sedan arbetet till klassen f\u00f6r bearbetning av efterinneh\u00e5ll.<\/p>\n<p>Detta till\u00e5ter bokstavligen plugin-bootstrap-filen att instansiera delegaten. Delegaten kopplar sedan in i WordPress och n\u00e4r WordPress kommer till r\u00e4tt utf\u00f6rande skickar delegaten ansvaret till klassen som ansvarar f\u00f6r att bearbeta det.<\/p>\n<p>Hela den h\u00e4r arkitekturen \u00e4r inte bara helt \u00e5teranv\u00e4ndbar (se anv\u00e4ndningen av en abstrakt klass ovan), men den till\u00e5ter oss att koppla bort dom\u00e4nlogik fr\u00e5n WordPress och testa den isolerat.<\/p>\n<h2>Mer om Separation of concerns<\/h2>\n<p>Jag har skrivit n\u00e5gra andra inl\u00e4gg om separation av bekymmer:<\/p>\n<ul>\n<li><a href=\"https:\/\/tommcfarlin.com\/separation-of-concerns-with-wordpress-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Separering av bekymmer med WordPress-mallar<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/separation-of-concerns-with-queries-and-helper-functions\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Separering av bekymmer med fr\u00e5gor och hj\u00e4lpfunktioner<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-programmering-separera-bekymmer\/\" title=\"WordPress-programmering: Separera bekymmer\">WordPress-programmering: Separera bekymmer<\/a><\/li>\n<\/ul>\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>Kom ih\u00e5g att WordPress anv\u00e4nder det h\u00e4ndelsedrivna designm\u00f6nstret och \u00e4ven om vi ofta h\u00e4nvisar till \u00e5tg\u00e4rder och filter, handlar konceptet om krokar. Fl\u00f6det av kontroll genom programmet g\u00e5r n\u00e5got&#8230;<\/p>\n","protected":false},"author":1,"featured_media":158739,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[838,848,901,922,724,868],"tags":[1173],"class_list":["post-231447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-handledningar","category-koda","category-oevrig","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231447","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=231447"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231447\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/158739"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=231447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=231447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=231447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}