Oleme WordPress Widget Boilerplate’is sisse viinud märkimisväärse hulga muudatusi. Kui te pole jälginud, soovitan alustada sarja algusest ja jõuda järele.
Kui aga olete seda jälginud ja kasutate ka mõnda koodikvaliteedi tööriista, mis uurib projekti olekut, märkate konsoolis käputäis vigu.
Tavaliselt on see punkt, kus soovitan pöörata tähelepanu sellele, mida see jagab, ja seejärel parandada kõik, mida see teatab, kuid me pole veel seal.
Näiteks mõned vead, mida meie tööriistad praegu näitavad, põhinevad asjaolul, et meil on kasutamata muutujaid. Muidugi on see nii, sest me pole alustanud vidina ehitamist.
Kuid meil on veel mõned konkreetsed klassid, mida peame rakendama.
WordPressi vidina katlaplaat: ümberkujundamine, 4. osa
Üks probleem, mis koodis praegu veel eksisteerib, on see, et vidina konstruktor registreerib funktsioone ja see pole hea.
Konstruktori eesmärk on määrata klassi omaduste väärtusi, mitte realiseerida mingit tüüpi loogikat. Seda mitmel põhjusel:
- see loob tugeva seose või sõltuvused projekti klasside vahel alati, kui antud klass instantseeritakse,
- see lisab äriloogika funktsiooni, mis ei ole mõeldud nimetatud funktsiooni sisaldama,
- see muudab klassi eraldiseisva testimise keeruliseks.
Sellega toimetulemiseks on kaks võimalust:
- lisage register, mida saame kasutada klasside registreerimiseks rakenduses (ja edastage need võimalikult väheste sõltuvustega, mida ma hiljem selgitan),
- luua tellijaid, kes saavad äriloogikaga konksupõhiselt hakkama.
Järgmise kolme postituse jooksul:
- uurime registri loomist,
- kuidas saame selle alglaadimisfaili sisestada,
- ja seejärel vaadake iga meie funktsiooni jaoks tellijate loomist (mis ei tohiks olla liiga raske, arvestades seda, mida me tegime eelmises postituses ja mida me teeme selles postituses).
Looge register
Enne registri koodi kirjutamist on oluline märkida, mis on selle peamine eesmärk. Lihtsamalt öeldes on klass mõeldud sisaldama viidet mis tahes klassile, mis on sellega registreeritud.
Selleks antakse antud objektile viide funktsioonile ja seotakse see ka võtmega, et saaksime selle hiljem hõlpsasti kätte saada.
Esialgsed kaalutlused
Kuid mõningaid asju tuleb arvestada. Näiteks:
kui antud võtme jaoks on registris objekt juba olemas, siis tuleb teha erand – kui kasutaja üritab antud võtmega registrist objekti haarata, siis peaks ta tegema erandi
Muidugi ei pea see ilmtingimata erandeid tegema. Selle asemel võib see kuvada ka tõrketeateid, tagastada null- või tühjad väärtused või mida iganes soovite.
Teiseks peab register suutma tagastada kõigi selles sisalduvate tellijate loendi, et neid saaks WordPressis registreerida (see on see, mida me järgmises postituses näeme).
Selleks peame aga tagama, et see toetaks kõiki tellijaid ja siin tuleb mängu eelmise postituse mõiste AbstractSubscriber. See tähendab, et seni, kuni klass on selle klassi lasteklass, on kõik korras.
Registri loomine
Seda arvestades kavandame järgmise:
- Loome registriklassi ja asetame selle utiliitide nimeruumi (ja seega ka kataloogi), kui seda teie töös veel ei ole.
- Me laseme registril säilitada viiteid kõikidele oma objektidele assotsiatiivses massiivis.
- Vajame meetodeid üksiku abonendi lisamiseks ja hankimiseks ning seejärel tervete tellijate loendi hankimiseks.
Klassi tünn näeb välja umbes selline:
<?php
class Registry extends AbstractSubscriber
{
public function __construct()
{
}
public function add($id, $obj)
{
}
public function get($id)
{
}
public function getRegisteredSubscribers()
{
}
}
Järgmisena saame määratleda põhiomaduse, massiivi ja lähtestada selle konstruktoris:
<?php
class Registry
{
private $registry;
public function __construct()
{
$this->registry = [];
}
// ...
}
Pärast seda saame luua lisamismeetodi. Pidage meeles, et kui võti on juba määratletud, valin ma oma teostuses erandi, kuid te ei pea seda tegema.
<?php
public function add($id, $obj)
{
if (isset($this->registry[$id])) {
throw new Exception('An object already exists for this given key.');
}
$this->registry[$id] = $obj;
}
Samamoodi tagastab meetod get viite selle võtmega tuvastatud objekti eksemplarile. Kui võtit pole seadistatud, teeb see erandi. Kui see on määratud, kuid objekti pole olemas, tagastame null.
<?php
public function get($id)
{
if (!isset($this->registry[$id])) {
throw new Exception('No object exists for the specified key.');
}
return $this->registry[$id] ?? null;
}
Lõpuks vajame meetodit kõigi registreeritud abonentide tagastamiseks. Tulevases postituses muutub selle kasutamine palju selgemaks, kuid praegu pange tähele, et loome massiivi mis tahes klassist, mis on klassi AbstractSubscriber eksemplar, ja tagastame seejärel filtreeritud massiivi.
<?php
public function getRegisteredSubscribers()
{
$subscribers = [];
foreach ($this->registry as $object) {
if ($object instanceof AbstractSubscriber) {
$subscribers[] = $object;
}
}
return array_filter($subscribers);
}
Praegu on meil terve klass (koos dokumentatsiooniga):
<?php
/*
* This file is part of the WordPress Widget Boilerplate
*
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
namespace WordPressWidgetBoilerplateUtilities;
use Exception;
use WordPressWidgetBoilerplateSubscriberAbstractSubscriber;
/**
* This class services as a simple container that can be used to pass objects
* around the plugin.
*
* To use this class you'd make a call to the registry by saying Registry->get(),
* then making a class to `register()` and `retrieve()` on an instance of the object.
*/
class Registry
{
/**
* @var array an array used to maintain the objects registered with the plugin
*/
private $registry;
/**
* Initializes the class by setting up the registry.
*/
public function __construct()
{
$this->registry = [];
}
/**
* Registers an object with the registry with the specified ID; however, will throw an
* exception if the ID is already referencing an object.
*
* @param string $id an ID by which the specified object will be referenced
* @param mixed $obj an instance of an object to store in the registry
*
* @throws Exception if an object already exists for the specified key
*/
public function add($id, $obj)
{
if (isset($this->registry[$id])) {
throw new Exception('An object already exists for this given key.');
}
$this->registry[$id] = $obj;
}
/**
* @param string $id the ID for the object that we wish to retrieve
*
* @throws Exception if no object exists for the specified key
*
* @return mixed a reference to the object or null
*/
public function get($id)
{
if (!isset($this->registry[$id])) {
throw new Exception('No object exists for the specified key.');
}
return $this->registry[$id] ?? null;
}
/**
* @return array all of the the Subscribers that should be registered with WordPress
*/
public function getRegisteredSubscribers()
{
$subscribers = [];
foreach ($this->registry as $object) {
if ($object instanceof AbstractSubscriber) {
$subscribers[] = $object;
}
}
return array_filter($subscribers);
}
}
Nüüd peame selle lisama oma pistikprogrammi alglaadimisribale.
Enne The Bootstrapi siiski
Nagu postituses varem mainitud, peame selle lisama pistikprogrammi alglaadimisribale. Selleks peame aga määratlema oma filtri, et saaksime registrit hõlpsalt ülejäänud pistikprogrammist mööda saata (kui selleks on aeg).
Enne selle tegemist on aga oluline veenduda, et teil on äsja loodud registriga hea käsitlus, et see sobiks pistikprogrammiga ja et jälgiksite arendusharu, mis meil seni on olnud.