{"id":232007,"date":"2023-01-04T13:20:00","date_gmt":"2023-01-04T10:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232007"},"modified":"2023-01-04T13:20:26","modified_gmt":"2023-01-04T10:20:26","slug":"verkkotunnuksen-logiikan-irrottaminen-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/verkkotunnuksen-logiikan-irrottaminen-wordpressissae\/","title":{"rendered":"Verkkotunnuksen logiikan irrottaminen WordPressiss\u00e4"},"content":{"rendered":"\n<p>Muista, ett\u00e4 WordPress k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tapahtumal\u00e4ht\u00f6ist\u00e4 suunnittelumallia,<\/a> ja vaikka viittaamme usein toimiin ja suodattimiin, konsepti on kiinni koukuista. Ohjauskulku ohjelman l\u00e4pi menee suunnilleen n\u00e4in:<\/p>\n<ol>\n<li>Suorita ohjelma,<\/li>\n<li>Aina kun ohjelma osuu koukkuun (WordPressiss\u00e4, n\u00e4emme <code>do_action<\/code>tai <code>apply_filters<\/code>), toista kaikki rekister\u00f6idyt koukut,<\/li>\n<li>Palauta ohjaus takaisin ohjelmaan,<\/li>\n<li>Suorita loppuun asti.<\/li>\n<\/ol>\n<p>T\u00e4m\u00e4 ei ole t\u00e4ysin erilainen kuin Publisher\/Subscriber Pattern (tai <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PubSub<\/a>, lyhennettyn\u00e4), mutta siin\u00e4 on keskeinen ero: Tapahtumavetoinen malli yksinkertaisesti viestii, ett\u00e4 jotain on tapahtunut, ja jos koukut ovat p\u00e4\u00e4ll\u00e4, ne laukeavat. PubSub Pattern kehottaa rekister\u00f6ity\u00e4 tilaajaa tekem\u00e4\u00e4n jotain.<\/p>\n<p>Joka tapauksessa takaisin WordPressin koukkuihin. Meid\u00e4n kahden koukkuk\u00e4sitteen s\u00e4ilytt\u00e4minen voidaan helpoimmin tehd\u00e4 ajattelemalla niit\u00e4 n\u00e4in:<\/p>\n<ul>\n<li>Teot ovat jotain tekemist\u00e4 varten,<\/li>\n<li>Suodattimet on tarkoitettu tietojen k\u00e4sittelyyn.<\/li>\n<\/ul>\n<p>Jos haluat l\u00e4hesty\u00e4 WordPress-kehityst\u00e4 oliokeskeisell\u00e4 tavalla, koodin tiivis yhdist\u00e4minen WordPress-ytimeen rekister\u00f6im\u00e4ll\u00e4 luokkasi ydinsovelluksen koukkujen kautta ei ole hyv\u00e4 idea.<\/p>\n<p>Toisin sanoen, \u00e4l\u00e4 rekister\u00f6i liiketoimintalogiikkaasi WordPressiin. Pid\u00e4 ne erill\u00e4\u00e4n. T\u00e4ss\u00e4 on lakmustesti siit\u00e4, onko ty\u00f6si tiiviisti yhdistetty WordPressiin: Jos et voi suorittaa yksikk\u00f6testi\u00e4 luokkaasi vastaan \u200b\u200blataamatta WordPressi\u00e4, se on tiiviisti kytketty.<\/p>\n<p>Joten mik\u00e4 on ratkaisu? Valtuuskunta.<\/p>\n<h2>Domain Logic WordPressiss\u00e4<\/h2>\n<p>Verkkotunnuksen logiikka ja liiketoimintalogiikka ovat minun mielest\u00e4ni kesken\u00e4\u00e4n vaihdettavissa, joten jos olet lukenut aiempia viestej\u00e4 t\u00e4st\u00e4 ja olen puhunut niist\u00e4 eri tavoin, tied\u00e4t miksi.<\/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=\"Verkkotunnuksen logiikan irrottaminen WordPressiss\u00e4\"><\/a><\/p>\n<p><a href=\"https:\/\/unsplash.com\/photos\/guiQYiRxkZY\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Luotto<\/a><\/p>\n<p>Seuraavaksi ajatus logiikan delegoimisesta WordPressist\u00e4 verkkotunnuksen logiikkaluokkaan WordPressiss\u00e4 toteutetaan v\u00e4litt\u00e4j\u00e4luokalla, joka vastaa seuraavista:<\/p>\n<ol>\n<li>koukun tilaaminen,<\/li>\n<li>Ty\u00f6n delegointi luokalle.<\/li>\n<\/ol>\n<p>Tied\u00e4n, ett\u00e4 luokkien pit\u00e4isi tehd\u00e4 &quot;yksi asia hyvin&quot;, mutta ent\u00e4 jos se yksi asia on delegointi?<\/p>\n<blockquote>\n<p>sitoutua (valtuudet, toiminnot jne.) toiselle agenttina<\/p>\n<p><a href=\"https:\/\/www.dictionary.com\/browse\/delegate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sanakirja<\/a><\/p>\n<\/blockquote>\n<p>Ja jotta voit sitoa toiminnallisuuden oikein toiselle agentille tai, meid\u00e4n tapauksessamme, luokalle, sinulla on oltava kyky tiet\u00e4\u00e4, mit\u00e4 delegoit. Joskus yhden asian tekemiseksi sinun on tiedett\u00e4v\u00e4 useita tietoja.<\/p>\n<p>Milt\u00e4 t\u00e4m\u00e4 sitten n\u00e4ytt\u00e4\u00e4 k\u00e4yt\u00e4nn\u00f6ss\u00e4? Kuvittele, ett\u00e4 sinulla on <code>[AbstractSubscriber](https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/Subscriber\/AbstractSubscriber.php)<\/code>pakko ottaa koukun nimi sen rakentajaan:<\/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 sitten kun se on tehty, <code>load<\/code>toiminto l\u00e4hett\u00e4\u00e4 ty\u00f6n luokkaan, joka on vastuussa k\u00e4sittelyn suorittamisesta.<\/p>\n<p>Otetaan esimerkiksi <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\/blob\/master\/src\/WordPress\/PostContentProcessor.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4m\u00e4 koodi<\/a> kohdasta <a href=\"https:\/\/github.com\/tommcfarlin\/remove-empty-shortcodes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Poista tyhj\u00e4t lyhytkoodit<\/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>Luokka tilaa tietyn tapahtuman, kuten <code>[the_content](https:\/\/developer.wordpress.org\/reference\/functions\/the_content\/)<\/code>, ja delegoi sitten ty\u00f6n sis\u00e4ll\u00f6nk\u00e4sittelyluokalle.<\/p>\n<p>T\u00e4m\u00e4 kirjaimellisesti mahdollistaa liit\u00e4nn\u00e4isen bootstrap-tiedoston ilment\u00e4m\u00e4\u00e4n edustajan. T\u00e4m\u00e4n j\u00e4lkeen edustaja kytkeytyy WordPressiin ja kun WordPress p\u00e4\u00e4see oikeaan suorituspisteeseen, delegaatti siirt\u00e4\u00e4 vastuun sen k\u00e4sittelyst\u00e4 vastaavalle luokalle.<\/p>\n<p>T\u00e4m\u00e4 koko arkkitehtuuri ei ole vain t\u00e4ysin uudelleenk\u00e4ytett\u00e4v\u00e4 (katso abstraktin luokan k\u00e4ytt\u00f6 yll\u00e4), vaan sen avulla voimme irrottaa verkkotunnuksen logiikan WordPressist\u00e4 ja testata sit\u00e4 erikseen.<\/p>\n<h2>Lis\u00e4\u00e4 huolenaiheiden erottamisesta<\/h2>\n<p>Olen kirjoittanut joitakin muita viestej\u00e4 huolenaiheiden erottamisesta:<\/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\">Huolien erottelu WordPress-malleilla<\/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\">Huolien erottaminen kyselyill\u00e4 ja aputoiminnoilla<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-ohjelmointi-huolenaiheiden-erottaminen\/\" title=\"WordPress-ohjelmointi: huolenaiheiden erottaminen\">WordPress-ohjelmointi: huolenaiheiden erottaminen<\/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>Muista, ett\u00e4 WordPress k\u00e4ytt\u00e4\u00e4 tapahtumal\u00e4ht\u00f6ist\u00e4 suunnittelumallia, ja vaikka viittaamme usein toimiin ja suodattimiin, konsepti on kiinni koukuista. Ohjausvirta ohjelman l\u00e4pi johtaa jotain\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":[719,895,917,834,843,864],"tags":[1166],"class_list":["post-232007","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-muut","category-opas-aloittelijoille","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232007","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=232007"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232007\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/158739"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=232007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=232007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=232007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}