{"id":228746,"date":"2022-11-01T12:13:00","date_gmt":"2022-11-01T09:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228746"},"modified":"2022-11-09T04:07:37","modified_gmt":"2022-11-09T01:07:37","slug":"wordpress-plugin-konstruktoerer-borde-inte-definiera-krokar","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-plugin-konstruktoerer-borde-inte-definiera-krokar\/","title":{"rendered":"WordPress Plugin-konstrukt\u00f6rer borde inte definiera krokar"},"content":{"rendered":"\n<p>WordPress plugin konstrukt\u00f6rer verkar vara mer och mer ett \u00e4mne f\u00f6r debatt n\u00e4r det kommer till vad de ska definiera. Jag har pratat om det f\u00f6rut men det \u00e4r okej att \u00e5terkomma till ett s\u00e5dant h\u00e4r \u00e4mne d\u00e5 och d\u00e5, eller hur?<\/p>\n<p>Det finns trots allt saker vi l\u00e4r oss och saker som vi f\u00f6r\u00e4ndrar n\u00e4r vi f\u00e5r mer erfarenhet.<\/p>\n<p>Det \u00e4r inte alls ovanligt att se plugins som definierar hooks och annat beteende, men jag \u00e4r inte ett fan av detta tillv\u00e4gag\u00e5ngss\u00e4tt. Ist\u00e4llet tycker jag att hantering av krokregistrering b\u00f6r ske i sin egen funktion eller, \u00e4nnu mer drastiskt, hanteras av en upps\u00e4ttning klasser.<\/p>\n<p>Men innan jag g\u00e5r in p\u00e5 det vill jag f\u00f6rklara vad som ska ing\u00e5 i en WordPress-pluginkonstrukt\u00f6r, varf\u00f6r den ska g\u00e5 i en konstruktor och hur detta kan hanteras n\u00e4r du arbetar med dina plugins.<\/p>\n<h2>WordPress plugin-konstrukt\u00f6rer<\/h2>\n<p>Fr\u00e5n b\u00f6rjan tycker jag att konstrukt\u00f6rer ska anv\u00e4ndas till en sak:<\/p>\n<ul>\n<li>Initiera tillst\u00e5ndet f\u00f6r ett objekt.<\/li>\n<\/ul>\n<p>Vad som definierar ett objekts initiala tillst\u00e5nd kan bero p\u00e5 om det har skapats &quot;fr\u00e5n grunden&quot; eller om det laddas med information fr\u00e5n en tidigare upps\u00e4ttning (som en session som serialiseras). S\u00e5 h\u00e4r ser jag det:<\/p>\n<ul>\n<li>attribut \u00e4r substantiv som beskriver ett objekt,<\/li>\n<li>funktioner \u00e4r verb som beskriver vad objektet kan g\u00f6ra.<\/li>\n<\/ul>\n<p>Funktionerna g\u00f6r naturligtvis det arbete som objektet kan g\u00f6ra. De kan \u00e4ndra objektets tillst\u00e5nd n\u00e4r de anropas, eller de kan arbeta med argumenten som skickas till funktionerna.<\/p>\n<h3>Vad ska g\u00e5 i en konstrukt\u00f6r?<\/h3>\n<p>N\u00e4r ett objekt \u00e4r konstruerat b\u00f6r det helt enkelt st\u00e4llas in p\u00e5 ett s\u00e5dant s\u00e4tt att dess attribut \u00e4r inst\u00e4llda och dess funktioner \u00e4r redo att utf\u00f6ra arbete.<\/p>\n<p>Om det finns n\u00e5got i konstruktorn som inte p\u00e5verkar ett objekts initiala tillst\u00e5nd b\u00f6r det inte finnas d\u00e4r.<\/p>\n<h3>Varf\u00f6r ska attribut finnas i en konstrukt\u00f6r?<\/h3>\n<p>Kanske ett b\u00e4ttre s\u00e4tt att st\u00e4lla den h\u00e4r fr\u00e5gan \u00e4r:<\/p>\n<p>Varf\u00f6r ska inte krokar definieras i konstruktorn?<\/p>\n<p>WordPress kroksystem \u00e4r en del av det <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_programming\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4ndelsedrivna designm\u00f6nstret<\/a> (som jag \u00e4r ett fan av), men att registrera krokar beskriver inte objektets tillst\u00e5nd. Ist\u00e4llet, p\u00e5 den mest grundl\u00e4ggande niv\u00e5n, \u00e4r det n\u00e5got som skapar en relation med objektet och WordPress.<\/p>\n<p>Objektets initiala tillst\u00e5nd beh\u00f6ver inte k\u00e4nna till WordPress, ha n\u00e5gon av dess funktioner inst\u00e4llda f\u00f6r att kopplas till WordPress, eller beh\u00f6ver g\u00f6ra n\u00e5gon bearbetning med WordPress.<\/p>\n<p>Kom ih\u00e5g att attribut initieras i en konstruktor. WordPress \u00e4r inte ett attribut. Det \u00e4r ett beroende. Att skapa ett beroende \u00e4r att vidta en handling som \u00e4r definitionen av ett verb.<\/p>\n<p>Allts\u00e5 ska all krokregistrering g\u00f6ras i en funktion.<\/p>\n<h3>Hur kan vi hantera krokregistrering?<\/h3>\n<p>Det h\u00e4r \u00e4r ett av de \u00e4mnen som kan vara ett inl\u00e4gg eller en serie inl\u00e4gg i sig.<\/p>\n<ul>\n<li>Det \u00e4r m\u00f6jligt att skapa en klass som uppr\u00e4tth\u00e5ller ett register \u00f6ver objekt och krokar med WordPress.<\/li>\n<li>Det \u00e4r ocks\u00e5 m\u00f6jligt att definiera krokregistrering inom en funktion i klassen.<\/li>\n<li>Vi kan ocks\u00e5 g\u00f6ra ett antal saker med <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">beroendeinversion<\/a>.<\/li>\n<\/ul>\n<p>Alla ovanst\u00e5ende \u00e4r saker som ligger utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg men f\u00f6r enkelhetens skull ska jag visa ett exempel p\u00e5 hur en klass kan registrera sina funktioner med WordPress <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i en init-funktion<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>P\u00e5 s\u00e5 s\u00e4tt kan vi instansiera objektet, testa det, anv\u00e4nda det etc., men vi beh\u00f6ver inte ta itu med n\u00e5got som har med WordPress att g\u00f6ra utan att uttryckligen anropa <strong>init-<\/strong> funktionen.<\/p>\n<p>N\u00e4r det v\u00e4l kallas skapas beroendet, WordPress beh\u00f6vs och saker och ting blir mer komplicerade.<\/p>\n<h2>\u00c5h, och den d\u00e4r testa saken<\/h2>\n<p>Jag vill n\u00e4mna ytterligare en punkt som ligger lite utanf\u00f6r r\u00e4ckvidden och po\u00e4ngen med det h\u00e4r inl\u00e4gget men som fortfarande \u00e4r relevant: N\u00e4r det kommer till att testa en klass b\u00f6r vi kunna:<\/p>\n<ol>\n<li>skapa en instans av klassen,<\/li>\n<li>testa dess logik genom att anropa funktioner,<\/li>\n<li>skickar parametrarna och utv\u00e4rderar dess returv\u00e4rden.<\/li>\n<\/ol>\n<p>Och vi borde kunna g\u00f6ra s\u00e5 mycket av detta som m\u00f6jligt isolerat. Om krokar \u00e4r definierade i konstruktorn skapar det ett omedelbart beroende av WordPress som inte borde beh\u00f6vas.<\/p>\n<p>WordPress beskriver inte tillst\u00e5ndet f\u00f6r ett objekt. Det \u00e4r ett beroende av objektet.<\/p>\n<p>Hur som helst, po\u00e4ngen jag f\u00f6rs\u00f6ker g\u00f6ra \u00e4r att WordPress-pluginkonstrukt\u00f6rer inte ska hantera registreringen av krokar eftersom krokar inte beskriver dess tillst\u00e5nd. De \u00e4r relaterade till n\u00e5got klassen g\u00f6r och de hindrar oss fr\u00e5n att kunna testa ett objekt isolerat.<\/p>\n<p>S\u00e5 de har sin plats, men den finns inte i konstrukt\u00f6ren.<\/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>WordPress plugin konstrukt\u00f6rer b\u00f6r inte hantera registreringen av krokar eftersom krokar inte beskriver dess tillst\u00e5nd.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,807,818,724,868],"tags":[1173],"class_list":["post-228746","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-php-9","category-plugins-3","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228746","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=228746"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228746\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}