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

Odłączanie logiki domeny w WordPress

30

Pamiętaj, że WordPress używa wzorca projektowego opartego na zdarzeniach i chociaż często odwołujemy się do działań i filtrów, koncepcja sprowadza się do hooków. Przepływ kontroli przez program wygląda mniej więcej tak:

  1. Wykonaj program,
  2. Za każdym razem, gdy program natrafi na hak (w WordPressie zobaczymy do_actionlub apply_filters), przeprowadź iterację wszystkich zarejestrowanych haków,
  3. Przywróć sterowanie z powrotem do programu,
  4. Wykonać do końca.

Nie różni się to całkowicie od wzorca wydawcy/subskrybenta (lub w skrócie PubSub ), ale jest kluczowa różnica: wzorzec oparty na zdarzeniach po prostu sygnalizuje, że coś się wydarzyło, a jeśli są zaczepy, zostaną uruchomione. Wzorzec PubSub poinformuje zarejestrowanego subskrybenta, aby coś zrobił.

W każdym razie wróć do hooków w WordPressie. Zachowanie dwóch koncepcji haków, które mamy, można najłatwiej zrobić, myśląc o nich w ten sposób:

  • Akcje służą do robienia czegoś,
  • Filtry służą do przetwarzania danych.

Jeśli chcesz podejść do programowania WordPress w sposób zorientowany obiektowo, ścisłe łączenie kodu z rdzeniem WordPressa poprzez rejestrowanie klas za pomocą zaczepów do aplikacji rdzenia nie jest dobrym pomysłem.

Innymi słowy, nie rejestruj swojej logiki biznesowej w WordPressie. Trzymaj je osobno. Oto papierek lakmusowy sprawdzający, czy Twoja praca jest ściśle powiązana z WordPress: Jeśli nie możesz przeprowadzić testu jednostkowego na swojej klasie bez załadowania WordPressa, jest to ściśle powiązane.

Więc jakie jest rozwiązanie? Delegacja.

Logika domeny w WordPress

Logika domeny i logika biznesowa są dla mnie wymienne, więc jeśli czytałeś poprzednie posty na ten temat i mówiłem o nich na różne sposoby, wiesz dlaczego.

Odłączanie logiki domeny w WordPress

Kredyt

Następnie pomysł delegowania logiki z WordPressa do klasy logiki domeny w WordPressie jest realizowany przez klasę pośredniczącą, która jest odpowiedzialna za:

  1. Zapisując się na hak,
  2. Delegowanie pracy do klasy.

Wiem, że zajęcia mają robić „jedną rzecz dobrze", ale co, jeśli tą jedną rzeczą jest delegowanie?

zobowiązać się (uprawnienia, funkcje itp.) do innego jako agenta

słownik

Aby właściwie przekazać funkcjonalność innemu agentowi lub, w naszym przypadku, klasie, musisz wiedzieć, co delegujesz. Czasami, aby zrobić jedną rzecz, musisz znać kilka informacji.

Więc jak to wygląda w praktyce? Wyobraź sobie, że masz [AbstractSubscriber](https://github.com/tommcfarlin/remove-empty-shortcodes/blob/master/src/Subscriber/AbstractSubscriber.php)do przejmie nazwę haka do swojego konstruktora:

<?php

/*
 * This file is part of Remove Empty Shortcodes.
 *
 * (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 TomMcFarlinRESCSubscriber;

use TomMcFarlinUtilitiesRegistry;

/**
 * An abstract implementation of a subscriber that requires a hook and the ability to
 * start the class.
 */
abstract class AbstractSubscriber
{
    /**
     * @var string a reference to the hook to which the subscriber should be registered
     */
    protected $hook;

    /**
     * @var Registry a reference to the simple container used to maintain plugin objects
     */
    protected $registry;

    /**
     * @param string $hook the hook to which the subscriber is registered
     */
    public function __construct(string $hook)
    {
        $this->hook = $hook;
        $this->registry = apply_filters('rescRegistry', null);
    }

    /**
     * @return string the hook to which the subscriber is registered
     */
    public function getHook(): string
    {
        return $this->hook;
    }

    abstract public function load();
}

A gdy to się stanie, loadfunkcja prześle pracę do klasy odpowiedzialnej za faktyczne przetwarzanie.

Weźmy na przykład ten kod z Remove Empty Shortcodes :

<?php

/*
 * This file is part of Remove Empty Shortcodes.
 *
 * (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 TomMcFarlinRESCWordPress;

/**
 * Processes the post content by looking to see if any orphaned shortcode
 * exists and then removes it from displaying it from the user.
 */
class PostContentProcessor
{
    /**
     * A reference to the Shortcode Manager for processing orphaned shortcodes.
     */
    private $shortcodeManager;

    /**
     * Initializes the class by setting up a reference to the Registry and the
     * Shortcode Manager.
     */
    public function __construct()
    {
        $registry = apply_filters('rescRegistry', null);
        $this->shortcodeManager = $registry->get('shortcodeManager');
    }

    /**
     * @param string $content the filtered post content
     *
     * @return string $content the filtered post content without the shortcode
     */
    public function run(string $content): string
    {
        return $this->shortcodeManager->processShortcodes($content);
    }
}

Klasa subskrybuje określone zdarzenie, takie jak [the_content](https://developer.wordpress.org/reference/functions/the_content/), a następnie deleguje pracę do klasy przetwarzania treści postu.

To całkiem dosłownie pozwala plikowi startowemu wtyczki na utworzenie instancji delegata. Następnie delegat łączy się z WordPressem i kiedy WordPress dociera do właściwego punktu wykonania, delegat wysyła odpowiedzialność do klasy odpowiedzialnej za jej przetwarzanie.

Cała ta architektura jest nie tylko całkowicie wielokrotnego użytku (patrz użycie klasy abstrakcyjnej powyżej), ale pozwala nam oddzielić logikę domeny od WordPressa i przetestować ją w izolacji.

Więcej o separacji obaw

Napisałem kilka innych postów na temat oddzielania obaw:

Ź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