✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Виджеты WordPress: рефакторинг, часть 4

22

Мы внесли значительное количество изменений в шаблон WordPress Widget Boilerplate. Если вы не следили за развитием событий, я рекомендую начать с начала серии и наверстать упущенное.

Однако если вы следовали этому примеру и также используете некоторые инструменты контроля качества кода, которые проверяют состояние проекта, то вы заметите несколько ошибок в консоли.

Обычно это момент, когда я рекомендую обратить внимание на то, чем он делится, а затем исправить все, что он сообщает, но мы еще не достигли этого.

Например, некоторые ошибки, которые сейчас показывают наши инструменты, связаны с тем, что у нас есть неиспользуемые переменные. Конечно, это так, потому что мы еще не начали создавать виджет.

Но есть еще несколько конкретных классов, которые нам нужно реализовать.

Шаблон виджета WordPress: рефакторинг, часть 4

Одна из проблем, которые все еще существуют в коде в его нынешнем виде, заключается в том, что конструктор виджета регистрирует функции, и это нехорошо.

Цель конструктора — установить значения свойств класса, а не реализовать какую-либо логику. Это по нескольким причинам:

  • он создает сильную связь или зависимость между классами в проекте всякий раз, когда создается экземпляр данного класса,
  • он вводит бизнес-логику в функцию, которая не предназначена для указанной функциональности,
  • это затрудняет тестирование класса изолированно.

Способ справиться с этим двоякий:

  1. добавить реестр, который мы можем использовать для регистрации классов в приложении (и передавать их с минимальным количеством зависимостей, которые я объясню позже),
  2. создавать подписчиков, которые могут обрабатывать бизнес-логику на основе конкретных ловушек.

В следующих трех постах:

  1. мы рассмотрим создание реестра,
  2. как мы можем ввести его в файл начальной загрузки,
  3. а затем посмотрите на создание подписчиков для каждой из наших функций (что не должно быть слишком сложно, учитывая то, что мы делали в предыдущем посте и что мы делаем в этом посте).

Создать реестр

Прежде чем писать код для реестра, важно отметить, какова его основная цель. Проще говоря, класс должен содержать ссылку на любой класс, который, гм, зарегистрирован в нем.

Это делается путем передачи ссылки на данный объект в функцию, а также привязки его к ключу, чтобы мы могли легко получить его позже.

Начальные соображения

Но есть некоторые вещи, которые следует учитывать. Например:

если объект уже существует в реестре для данного ключа, то нам нужно генерировать исключение — если пользователь пытается получить объект из реестра с данным ключом, он должен генерировать исключение

Конечно, это не обязательно должно генерировать исключения. Вместо этого он также может отображать сообщения об ошибках, возвращать нулевые или пустые значения или все, что вы выберете.

Во-вторых, реестр должен иметь возможность возвращать список всех подписчиков, содержащихся в нем, чтобы их можно было зарегистрировать в WordPress (это то, что мы увидим в следующем посте).

Однако для этого нам нужно убедиться, что он поддерживает всех подписчиков, и именно здесь вступает в игру понятие AbstractSubscriber из предыдущего поста . То есть, пока класс является дочерним классом этого класса, все в порядке.

Создание реестра

С учетом сказанного, давайте спланируем следующее:

  • Мы создадим класс Registry и поместим его в пространство имен Utilities (и, следовательно, в каталог), если он еще не существует в вашей работе.
  • Мы заставим реестр поддерживать ссылку на все свои объекты в ассоциативном массиве.
  • Нам нужны методы для добавления и получения отдельного подписчика, а затем один для получения списка всех подписчиков.

Заглушка для класса будет выглядеть примерно так:

<?php

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

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

    public function get($id)
    {
    }

    public function getRegisteredSubscribers()
    {
    }
}

Далее мы можем определить базовое свойство, массив, и инициализировать его в конструкторе:

<?php

class Registry
{
    private $registry;

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

    // ...

}

После этого мы можем создать метод add. Помните, что в моей реализации я выбрасываю исключение, если ключ уже определен, но вам не обязательно этого делать.

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

Точно так же метод get вернет ссылку на экземпляр объекта, идентифицированного этим ключом. Если ключ не установлен, будет выдано исключение. Если он установлен, но объект не существует, мы вернем 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;
}

Наконец, нам нужен метод для возврата всех зарегистрированных подписчиков. В следующем посте использование этого станет более очевидным, но пока обратите внимание, что мы создадим массив любого класса, являющегося экземпляром класса AbstractSubscriber, а затем вернем отфильтрованный массив.

<?php

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

    return array_filter($subscribers);
}

На данный момент у нас есть полный класс (с документацией):

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

Теперь нам нужно добавить его в загрузчик нашего плагина.

До Bootstrap, хотя

Как упоминалось ранее в посте, нам нужно добавить это в начальную загрузку плагина. Однако для этого нам нужно определить наш собственный фильтр, чтобы мы могли легко передать реестр остальной части плагина (когда придет время сделать это).

Прежде чем мы это сделаем, важно убедиться, что вы хорошо разбираетесь в реестре, который мы только что создали, что он подходит для плагина и что вы отслеживаете его с помощью ветки разработки, которая у нас есть.

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее