{"id":231448,"date":"2023-01-04T13:35:00","date_gmt":"2023-01-04T10:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231448"},"modified":"2023-01-04T13:37:06","modified_gmt":"2023-01-04T10:37:06","slug":"domeeniloogika-lahtisidumine-wordpressis","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/domeeniloogika-lahtisidumine-wordpressis\/","title":{"rendered":"Domeeniloogika lahtisidumine WordPressis"},"content":{"rendered":"\n<p>Pidage meeles, et WordPress kasutab <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00fcndmustep\u00f5hist kujundusmustrit<\/a> ja kuigi me viitame sageli toimingutele ja filtritele, taandub kontseptsioon konksudele. Juhtimisvoog l\u00e4bi programmi on umbes selline:<\/p>\n<ol>\n<li>K\u00e4ivitage programm,<\/li>\n<li>Kui programm satub konksule (WordPressis n\u00e4eme <code>do_action<\/code>v\u00f5i <code>apply_filters<\/code>), korrake l\u00e4bi k\u00f5ik registreeritud konksud,<\/li>\n<li>Naaske juhtimine programmile,<\/li>\n<li>Teostage l\u00f5puni.<\/li>\n<\/ol>\n<p>See ei erine t\u00e4ielikult v\u00e4ljaandja\/tellija mustrist (v\u00f5i <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00fchidalt PubSubist<\/a> ), kuid sellel on oluline erinevus: s\u00fcndmustest juhitud muster annab lihtsalt m\u00e4rku, et midagi on juhtunud ja konksude korral k\u00e4ivituvad. PubSub Pattern k\u00e4sib registreeritud tellijal midagi ette v\u00f5tta.<\/p>\n<p>Igatahes, tagasi WordPressi konksude juurde. Kahe konksude kontseptsiooni s\u00e4ilitamine on k\u00f5ige lihtsam, kui m\u00f5elda neile j\u00e4rgmiselt:<\/p>\n<ul>\n<li>Teod on millegi tegemiseks,<\/li>\n<li>Filtrid on m\u00f5eldud andmete t\u00f6\u00f6tlemiseks.<\/li>\n<\/ul>\n<p>Kui soovite l\u00e4heneda WordPressi arendamisele objektorienteeritud viisil, ei ole hea m\u00f5te oma koodi tihedalt WordPressi tuumaga siduda, registreerides oma klassid p\u00f5hirakenduse konksude kaudu.<\/p>\n<p>Teisis\u00f5nu, \u00e4rge registreerige oma \u00e4riloogikat WordPressis. Hoidke neid eraldi. Siin on lakmuspaber selle kohta, kas teie t\u00f6\u00f6 on WordPressiga tihedalt seotud. Kui te ei saa oma klassiga \u00fchikutesti ilma WordPressi laadimata k\u00e4ivitada, on see tihedalt seotud.<\/p>\n<p>Mis on siis lahendus? Delegatsioon.<\/p>\n<h2>Domeeniloogika WordPressis<\/h2>\n<p>Domeeniloogika ja \u00e4riloogika on minu arvates omavahel asendatavad, nii et kui olete lugenud eelnevaid selleteemalisi postitusi ja ma olen neist erineval viisil r\u00e4\u00e4kinud, siis teate, miks.<\/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=\"Domeeniloogika lahtisidumine WordPressis\"><\/a><\/p>\n<p><a href=\"https:\/\/unsplash.com\/photos\/guiQYiRxkZY\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Krediit<\/a><\/p>\n<p>J\u00e4rgmisena teeb WordPressi loogika delegeerimise idee WordPressi domeeniloogika klassile vaheklass, mis vastutab j\u00e4rgmise eest:<\/p>\n<ol>\n<li>konksu tellimine,<\/li>\n<li>T\u00f6\u00f6 delegeerimine klassile.<\/li>\n<\/ol>\n<p>Ma tean, et klassid peaksid &quot;\u00fcht asja h\u00e4sti tegema&quot;, aga mis siis, kui see \u00fcks asi on delegeerimine?<\/p>\n<blockquote>\n<p>teisele agendile p\u00fchenduma (volitused, funktsioonid jne).<\/p>\n<p><a href=\"https:\/\/www.dictionary.com\/browse\/delegate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00f5naraamat<\/a><\/p>\n<\/blockquote>\n<p>Ja selleks, et m\u00e4\u00e4rata funktsionaalsus korralikult teisele agendile v\u00f5i meie puhul klassile, peab teil olema v\u00f5imalus teada, mida delegeerite. M\u00f5nikord on \u00fche asja tegemiseks vaja teada mitut teavet.<\/p>\n<p>Kuidas see siis praktiliselt v\u00e4lja n\u00e4eb? Kujutage ette, et teil on <code>[AbstractSubscriber](https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/Subscriber\/AbstractSubscriber.php)<\/code>soov v\u00f5tta konksu nimi selle konstruktorisse:<\/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>Ja kui see on tehtud, <code>load<\/code>saadab funktsioon t\u00f6\u00f6 klassile, kes vastutab t\u00f6\u00f6tlemise eest.<\/p>\n<p>V\u00f5tke n\u00e4iteks see <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/WordPress\/PostContentProcessor.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kood<\/a> <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jaotisest Eemalda t\u00fchjad l\u00fchikoodid<\/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>Klass tellib konkreetse s\u00fcndmuse (nt <code>[the_content](https:\/\/developer.wordpress.org\/reference\/functions\/the_content\/)<\/code>) ja delegeerib seej\u00e4rel t\u00f6\u00f6 sisu postituse t\u00f6\u00f6tlemise klassile.<\/p>\n<p>See v\u00f5imaldab s\u00f5na otseses m\u00f5ttes plugina alglaadimisfailil delegaadi instantseerida. Seej\u00e4rel haakub delegaat WordPressi ja kui WordPress j\u00f5uab \u00f5igesse t\u00e4itmispunkti, saadab delegaat vastutuse selle t\u00f6\u00f6tlemise eest vastutavale klassile.<\/p>\n<p>Kogu see arhitektuur pole mitte ainult t\u00e4ielikult taaskasutatav (vt abstraktse klassi kasutamist \u00fclal), vaid see v\u00f5imaldab meil domeeniloogika WordPressist lahti \u00fchendada ja seda eraldi katsetada.<\/p>\n<h2>Lisateavet murede lahususe kohta<\/h2>\n<p>Olen kirjutanud m\u00f5ned muud postitused murede lahususe kohta:<\/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\">Murede eraldamine WordPressi mallidega<\/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\">Murede eraldamine p\u00e4ringute ja abifunktsioonidega<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-programmeerimine-murede-eraldamine\/\" title=\"WordPressi programmeerimine: murede eraldamine\">WordPressi programmeerimine: murede eraldamine<\/a><\/li>\n<\/ul>\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>Pidage meeles, et WordPress kasutab s\u00fcndmustep\u00f5hist kujundusmustrit ja kuigi me viitame sageli toimingutele ja filtritele, taandub kontseptsioon konksudele. Juhtimisvoog l\u00e4bi programmi annab midagi\u2026<\/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":[718,833,894,916,842,863],"tags":[1165],"class_list":["post-231448","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-juhend-algajatele","category-kood","category-muud","category-opetused","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231448","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=231448"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231448\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/158739"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=231448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=231448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=231448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}