✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Widżety WordPress: Refaktoryzacja, część 4

9

Wprowadziliśmy znaczną ilość zmian w WordPress Widget Boilerplate. Jeśli nie nadążasz, polecam zacząć od początku serii i nadrobić zaległości.

Jeśli jednak śledzisz ten temat i korzystasz również z niektórych narzędzi jakości kodu, które badają stan projektu, zauważysz garść błędów w konsoli.

Zwykle jest to punkt, w którym zalecam zwrócenie uwagi na to, co udostępnia, a następnie naprawienie tego, co zgłasza, ale jeszcze do tego nie doszliśmy.

Na przykład niektóre błędy, które obecnie wyświetlają nasze narzędzia, wynikają z faktu, że mamy nieużywane zmienne. Oczywiście tak jest, ponieważ nie zaczęliśmy budować widżetu.

Ale jest jeszcze kilka konkretnych klas, które musimy zaimplementować.

Szablon WordPress Widget Boilerplate: Refaktoryzacja, część 4

Jednym z problemów, które wciąż istnieją w kodzie w obecnej postaci, jest to, że konstruktor widżetu rejestruje funkcje, a to nie jest dobre.

Zadaniem konstruktora jest ustawienie wartości właściwości klasy, a nie implementacja jakiejkolwiek logiki. Dzieje się tak z kilku powodów:

  • tworzy silne sprzężenie lub zależności między klasami w projekcie, gdy dana klasa jest instancja,
  • wprowadza logikę biznesową do funkcji, która nie ma zawierać tej funkcjonalności,
  • utrudnia to testowanie klasy w izolacji.

Sposób radzenia sobie z tym jest dwojaki:

  1. dodać Rejestr, za pomocą którego będziemy mogli rejestrować klasy w aplikacji (i przekazywać je z jak najmniejszą liczbą zależności, co wyjaśnię później),
  2. tworzyć subskrybentów, którzy mogą obsługiwać logikę biznesową na podstawie konkretnego haka.

W kolejnych trzech postach:

  1. przyjrzymy się tworzeniu rejestru,
  2. jak możemy wprowadzić to do pliku bootstrap,
  3. a następnie spójrz na tworzenie subskrybentów dla każdej z naszych funkcji (co nie powinno być zbyt trudne, biorąc pod uwagę to, co zrobiliśmy w poprzednim poście i co robimy w tym poście).

Utwórz rejestr

Przed napisaniem kodu dla Rejestru ważne jest, aby zwrócić uwagę, jaki jest jego główny cel. Mówiąc najprościej, klasa ma zawierać odniesienie do dowolnej klasy, która jest, hm, zarejestrowana w niej.

Odbywa się to poprzez przekazanie referencji do danego obiektu do funkcji, a także powiązanie go z kluczem, dzięki czemu możemy go później łatwo pobrać.

Rozważania wstępne

Ale jest kilka rzeczy do rozważenia. Na przykład:

jeśli obiekt już istnieje w rejestrze dla danego klucza, to musimy zgłosić wyjątek – jeśli użytkownik próbuje pobrać obiekt z rejestru z danym kluczem, powinien zgłosić wyjątek

Oczywiście nie musi koniecznie rzucać wyjątków. Zamiast tego może również wyświetlać komunikaty o błędach, zwracać wartości null lub puste lub cokolwiek wybierzesz.

Po drugie, rejestr musi być w stanie zwrócić listę wszystkich zawartych w nim subskrybentów, aby można było ich zarejestrować w WordPressie (o czym przekonamy się w następnym poście).

Aby to zrobić, musimy jednak upewnić się, że obsługuje wszystkich subskrybentów i tutaj w grę wchodzi pojęcie AbstractSubscriber z poprzedniego postu . Oznacza to, że dopóki klasa jest klasą potomną tej klasy, wszystko jest w porządku.

Tworzenie rejestru

Powiedziawszy to, zaplanujmy następujące rzeczy:

  • Stworzymy klasę Registry i umieścimy ją w przestrzeni nazw Utilities (a tym samym w katalogu), jeśli jeszcze nie istnieje w Twojej pracy.
  • Rejestr będzie utrzymywał odniesienie do wszystkich swoich obiektów w tablicy asocjacyjnej.
  • Potrzebujemy metod dodawania i pozyskiwania pojedynczego subskrybenta, a następnie jednej do pobrania listy całych subskrybentów.

Kod klasy będzie wyglądał mniej więcej tak:

<?php

class Registry extends AbstractSubscriber
{
    public function __construct()
    {
    }

    public function add($id, $obj)
    {
    }

    public function get($id)
    {
    }

    public function getRegisteredSubscribers()
    {
    }
}

Następnie możemy zdefiniować podstawową właściwość, tablicę i zainicjalizować ją w konstruktorze:

<?php

class Registry
{
    private $registry;

    public function __construct()
    {
        $this->registry = [];
    }

    // ...

}

Następnie możemy stworzyć metodę add. Pamiętaj, że w mojej implementacji decyduję się na zgłoszenie wyjątku, jeśli klucz jest już zdefiniowany, ale nie musisz tego robić.

<?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;
}

Podobnie metoda get zwróci odwołanie do instancji obiektu zidentyfikowanego za pomocą tego klucza. Jeśli klucz nie zostanie ustawiony, zgłosi wyjątek. Jeśli jest ustawiony, ale nie istnieje żaden obiekt, zwrócimy 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;
}

Na koniec potrzebujemy metody, aby zwrócić wszystkich zarejestrowanych subskrybentów. W przyszłym poście użycie tego stanie się znacznie bardziej widoczne, ale na razie zauważ, że utworzymy tablicę dowolnej klasy, która jest instancją klasy AbstractSubscriber, a następnie zwrócimy przefiltrowaną tablicę.

<?php

public function getRegisteredSubscribers()
{
    $subscribers = [];
    foreach ($this->registry as $object) {
        if ($object instanceof AbstractSubscriber) {
            $subscribers[] = $object;
        }
    }

    return array_filter($subscribers);
}

W tym momencie mamy pełną klasę (wraz z dokumentacją):

<?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);
    }
}

Teraz musimy dodać go do programu startowego naszej wtyczki.

Chociaż przed Bootstrapem

Jak wspomniano wcześniej w poście, musimy dodać to do ładowania początkowego wtyczki. Aby to zrobić, musimy jednak zdefiniować własny filtr, dzięki czemu będziemy mogli łatwo ominąć rejestr z resztą wtyczki (gdy nadejdzie na to czas).

Jednak zanim to zrobimy, ważne jest, aby upewnić się, że dobrze radzisz sobie z utworzonym właśnie Rejestrem, że pasuje on do wtyczki i że śledzisz za pomocą gałęzi deweloperskiej, którą mamy do tej pory.

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów