✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Роз’єднання логіки домену в WordPress

25

Пам’ятайте, що WordPress використовує шаблон проектування, керований подіями, і хоча ми часто посилаємося на дії та фільтри, концепція зводиться до хуків. Потік керування через програму виглядає приблизно так:

  1. Виконати програму,
  2. Щоразу, коли програма натрапляє на хук (у WordPress ми побачимо do_actionабо apply_filters), повторюйте всі зареєстровані хуки,
  3. Повернути управління програмі,
  4. Виконати до кінця.

Це не зовсім відрізняється від шаблону «Видавець/Підписник» (або PubSub, скорочено), але є ключова відмінність: шаблон, керований подіями, просто сигналізує про те, що щось сталося, і якщо є гачки, вони спрацюють. Патерн PubSub скаже зареєстрованому підписнику щось зробити.

У будь-якому випадку, повернемося до хуків у WordPress. Зберегти дві концепції хуків, які ми маємо, можна найпростіше зробити, подумавши про них так:

  • Дії для того, щоб щось робити,
  • Фільтри призначені для обробки даних.

Якщо ви хочете підійти до розробки WordPress в об’єктно-орієнтований спосіб, тісно пов’язувати свій код із ядром WordPress, реєструючи свої класи через підключення до основної програми, не є гарною ідеєю.

Іншими словами, не реєструйте свою бізнес-логіку в WordPress. Тримайте їх окремо. Ось лакмусовий папірець для того, щоб перевірити, чи ваша робота тісно пов’язана з WordPress: якщо ви не можете запустити модульний тест свого класу, не завантажуючи WordPress, це тісно пов’язано.

Так яке рішення? Делегування.

Логіка домену в WordPress

На мій погляд, логіка домену та бізнес-логіка взаємозамінні, тож якщо ви читали про це попередні публікації, і я говорив про них різними способами, ви знаєте чому.

Роз’єднання логіки домену в WordPress

Кредит

Далі, ідея делегування логіки від WordPress до класу для доменної логіки в WordPress виконується класом-посередником, який відповідає за наступне:

  1. Підписавшись на хук,
  2. Передача роботи класу.

Я знаю, що класи повинні робити «одну справу добре», але що, якщо це одне — делегування?

передавати (повноваження, функції тощо) іншому як агенту

словник

І щоб належним чином передати функції іншому агенту або, у нашому випадку, класу, ви повинні мати можливість знати, що ви делегуєте. Іноді, щоб зробити одну справу, потрібно знати кілька частин інформації.

Отже, як це виглядає на практиці? Уявіть, що у вас є функція [AbstractSubscriber](https://github.com/tommcfarlin/remove-empty-shortcodes/blob/master/src/Subscriber/AbstractSubscriber.php)to, яка візьме назву хука в свій конструктор:

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

А потім, як тільки це буде зроблено, loadфункція надішле роботу до класу, відповідального за фактичну обробку.

Візьмемо, наприклад, цей код із 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);
    }
}

Клас підписується на певну подію, наприклад [the_content](https://developer.wordpress.org/reference/functions/the_content/), а потім делегує роботу класу постобробки вмісту.

Це буквально дозволяє файлу завантаження плагіна створювати екземпляр делегату. Потім делегат підключається до WordPress, і коли WordPress переходить до належної точки виконання, делегат передає відповідальність класу, відповідальному за його обробку.

Вся ця архітектура не тільки повністю придатна для повторного використання (див. використання абстрактного класу вище), але й дозволяє нам відокремити логіку домену від WordPress і протестувати її окремо.

Більше про розділення інтересів

Я написав кілька інших дописів про розділення проблем:

Джерело запису: tommcfarlin.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі