{"id":229034,"date":"2022-10-22T09:57:00","date_gmt":"2022-10-22T06:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229034"},"modified":"2022-11-09T05:16:45","modified_gmt":"2022-11-09T02:16:45","slug":"pysaeytae-laajennuksen-suorittaminen-ilman-riippuvuutta","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/pysaeytae-laajennuksen-suorittaminen-ilman-riippuvuutta\/","title":{"rendered":"Pys\u00e4yt\u00e4 laajennuksen suorittaminen ilman riippuvuutta"},"content":{"rendered":"\n<p>Jos l\u00e4hestyt suurta osaa WordPress-laajennusten kehitt\u00e4misest\u00e4 oliol\u00e4ht\u00f6isest\u00e4 n\u00e4k\u00f6kulmasta, tulet lopulta pisteeseen, jossa et ole juurikaan vuorovaikutuksessa suoraan WordPress-ytimen kanssa.<\/p>\n<p>Ja mielest\u00e4ni se on hyv\u00e4 asia. Se on merkki arkkitehtuurista, ett\u00e4 rakentelet koodisi oikein. Tuo on:<\/p>\n<ol>\n<li>Sinulla on WordPress perustasolla,<\/li>\n<li>Sinulla on joukko luokkia, jotka sijaitsevat aivan WordPressin yl\u00e4puolella ja vastaavat tietojen l\u00e4hett\u00e4misest\u00e4 WordPressiin ja WordPressist\u00e4 laajennuksen v\u00e4lill\u00e4,<\/li>\n<li>Ja sinulla on loput koodistasi, joka sis\u00e4lt\u00e4\u00e4 loput toiminnot.<\/li>\n<\/ol>\n<p>Se, miten t\u00e4m\u00e4 toteutetaan, voi vaihdella, mutta yleinen tapa kuvitella t\u00e4m\u00e4n on samalla tavalla kuin minulla on tapana ajatella tavallista <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">N-tason<\/a> sovellusta, jossa sinulla on tietokerros, sovelluskerros ja k\u00e4ytt\u00f6liittym\u00e4.<\/p>\n<p>T\u00e4t\u00e4 kertaa lukuun ottamatta sinulla on WordPress, kerros WordPressin ja muun koodisi kanssa kommunikointia varten, ja tied\u00e4th\u00e4n, loput koodistasi.<\/p>\n<p>Miten laajennus voidaan j\u00e4rjest\u00e4\u00e4.<\/p>\n<p>Joten mit\u00e4 tapahtuu, kun haluat lopettaa laajennuksen suorittamisen, kun sen on oltava vuorovaikutuksessa kolmannen osapuolen riippuvuuden kanssa, ja sen pit\u00e4isi suorittaa vain, jos t\u00e4m\u00e4 riippuvuus on olemassa?<\/p>\n<h2>Pys\u00e4yt\u00e4 laajennuksen suorittaminen<\/h2>\n<p>PHP:n ja WordPressin luonteen vuoksi t\u00e4m\u00e4 voidaan tehd\u00e4 joillakin tavoilla. Koodi, jonka aion jakaa, ei m\u00e4\u00e4r\u00e4\u00e4 tapaa tehd\u00e4 se.<\/p>\n<p>Sen sijaan t\u00e4m\u00e4 on tapa tehd\u00e4 se (joka on per\u00e4isin jostakin, joka on kehitteill\u00e4). Lis\u00e4ksi n\u00e4yt\u00e4n, kuinka se on vuorovaikutuksessa my\u00f6s muutamien muiden laajennusosien kanssa.<\/p>\n<h3>1 Rakentaja<\/h3>\n<p>Jos luet tarpeeksi WordPressist\u00e4 ja olio-ohjelmointia koskevia artikkeleita, tulet todenn\u00e4k\u00f6isesti huomaamaan, ett\u00e4 koukkujen m\u00e4\u00e4ritt\u00e4miseen ei tule k\u00e4ytt\u00e4\u00e4 konstruktoreita. Ja olen samaa mielt\u00e4.<\/p>\n<p>Se luo tarpeettoman kytkent\u00e4tason ja tekee asioiden testaamisesta vaikeampaa. Mik\u00e4 sitten on rakentajan tarkoitus WordPress-pohjaisessa koodissa?<\/p>\n<p>K\u00e4yt\u00e4n sit\u00e4 samoista syist\u00e4, joita odotat mill\u00e4 tahansa muulla kielell\u00e4: Luokan ominaisuuksien alustamiseen. Alla olevassa koodissa n\u00e4et kolme asiaa:<\/p>\n<ol>\n<li>Alustan kiinteist\u00f6n,<\/li>\n<li>Tarkistan, onko kolmannen osapuolen riippuvuus olemassa,<\/li>\n<li>Jos ei, lis\u00e4\u00e4n virheilmoituksen,<\/li>\n<li>P\u00e4ivit\u00e4n kiinteist\u00f6n.<\/li>\n<\/ol>\n<p>Toki, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-00-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se on monisanainen<\/a>, mutta se ei my\u00f6sk\u00e4\u00e4n turvaudu \u00e4lykk\u00e4\u00e4seen koodiin arvojen alustamiseen.<\/p>\n<pre><code>&lt;?php\n\npublic function __construct( $container) {\n\n    $this-&gt;can_run = true;\n\n    \/\/ If the dependency isn't installed, then add a message and flag execution to stop.\n    $this-&gt;messenger = $container-&gt;get( 'settings-messenger');\n    if (! class_exists( 'Acme_Dependency')) {\n\n        $this-&gt;messenger-&gt;add_error_message( 'The dependency is not installed.' );\n        $this-&gt;can_run = false;\n    }\n}\n<\/code><\/pre>\n<p>(Mit\u00e4 vanhemmaksi olen tullut, sit\u00e4 enemm\u00e4n olen ihastunut tiettyyn koodiin, koska se helpottaa sen lukemista, poimimista ja k\u00e4ytt\u00f6\u00e4 nopeammin kuin vaihtoehto.)<\/p>\n<h3>2 Alustusmenetelm\u00e4<\/h3>\n<p>Koska emme k\u00e4yt\u00e4 konstruktoria ty\u00f6skennell\u00e4ksemme WordPress-koukkujen kanssa, t\u00e4m\u00e4n toiminnon pit\u00e4isi olla toisen menetelm\u00e4n yhteydess\u00e4.<\/p>\n<p>T\u00e4m\u00e4 antaa meille omistetun paikan t\u00e4m\u00e4ntyyppisten toimintojen sijoittamiseen, irroittamiseen muusta luokasta ja sen vuorovaikutukseen WordPressin kanssa vain, kun menetelm\u00e4\u00e4 kutsutaan erikseen.<\/p>\n<p>Mutta muista, ett\u00e4 koko asian pointti liittyy laajennuksen suorittamisen pys\u00e4ytt\u00e4miseen \u2013 ei siihen, mihin koukut sijoittaa.<\/p>\n<p>Joten sanotaan, ett\u00e4 kolmannen osapuolen riippuvuutta ei ole olemassa, mit\u00e4 sitten? Muista, ett\u00e4 konstruktoriin asetettiin ominaisuus, jonka avulla voimme m\u00e4\u00e4ritt\u00e4\u00e4, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-01-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pit\u00e4isik\u00f6 meid\u00e4n edet\u00e4<\/a> koukkujen asettamisessa vai ei:<\/p>\n<pre><code>&lt;?php\n\npublic function init() {\n\n    if (! $this-&gt;can_run) {\n        return;\n    }\n\n    add_action( 'admin_notices', array( $this, 'admin_notices') );\n}\n<\/code><\/pre>\n<p>Ja kun se on paikallaan, muu koodi ei toimi.<\/p>\n<h2>Paljon sanoja, v\u00e4h\u00e4n koodia<\/h2>\n<p>Se kuulostaa suurelta selitykselt\u00e4 niin pienelle koodille.<\/p>\n<p>Mutta osa t\u00e4st\u00e4 on my\u00f6s yritt\u00e4\u00e4 v\u00e4litt\u00e4\u00e4 WordPress-pohjaisen projektin osien erottamisen t\u00e4rkeydest\u00e4 muusta ytimest\u00e4, jotta osat voivat olla vuorovaikutuksessa itsens\u00e4 kanssa ilman, ett\u00e4 heid\u00e4n tarvitsee puhua ytimen kanssa koko ajan.<\/p>\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>Mit\u00e4 tapahtuu, kun haluat lopettaa laajennuksen suorittamisen, kun sen on toimittava kolmannen osapuolen riippuvuuden kanssa, ja pit\u00e4isi tehd\u00e4 niin vain, jos se on olemassa?<\/p>\n","protected":false},"author":1,"featured_media":221144,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,917,803,864],"tags":[1166],"class_list":["post-229034","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-muut","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229034","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=229034"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229034\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/221144"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229034"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229034"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229034"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}