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

Использование шаблона реестра в WordPress

40

У меня было несколько разговоров с разными друзьями и другими пользователями Twitter о понятии глобальных переменных в языках программирования. Для тех, кто новичок в программировании или кто не уверен, чем они плохи:

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

Это не значит, что они бесполезны, но если вы заинтересованы в объектно-ориентированном программировании (особенно в среде WordPress, где вы собираетесь использовать PHP), важно понимать некоторые лучшие альтернативы. чем глобальные переменные.

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

Шаблон реестра в WordPress

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

Но зачем использовать это?

Использование шаблона реестра в WordPress

Фото Сэмюэля Зеллера на Unsplash

Короче говоря, он обеспечивает объектно-ориентированный способ передачи информации по вашему приложению без необходимости использования глобальных переменных. Такие вещи, как контейнеры для внедрения зависимостей, также хороши для этого, но они выходят за рамки этого поста. Я также утверждаю, что бывают случаи, когда они могут быть излишними в контексте небольших плагинов.

Реализация шаблона

С учетом сказанного, как мы можем реализовать шаблон реестра в WordPress, а затем использовать его в нашей работе? Давайте сначала рассмотрим базовую структуру шаблона :

<?php

/**
 * Serves as a registry for all objects that need to be accessed globally throughout the
 * plugin.
 */
class Registry
{

  /**
   * @var array The array used to the the various objects that will be used in the plugin.
   */
  private $storage;

  /**
   * Initializes the plugin by creating an instance of an empty array.
   */
  public function __construct()
  {
      $this->storage = [];
  }

  /**
   * Adds an instance of a class to the registry's storage array using the given key
   *
   * @param string $id    The ID of the object to be used to retrieve it later in the plugin.
   * @param mixed  $class An instance of the class that will be associated with the specified key.
   */
  public function add($id, $class)
  {
      $this->storage[$id] = $class;
  }

  /**
   * @param string $id    The ID of the object to retrieve from the repository.
   * @return mixed $class An instance of the class associated with the specified key (or null if it doesn't exist).
   */
  public function get($id)
  {
      return array_key_exists($id, $this->storage)? $this->storage[$id]: null;
  }
}

Обратите внимание, что его реализация довольно проста:

  1. Класс содержит один массив как частное свойство.
  2. Данные добавляются в массив с определенным идентификатором.
  3. Данные могут быть извлечены из шаблона с идентификатором.

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

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

Настройка реестра

Из-за характера системы крючков WordPress существует особый способ настройки реестра, а затем регистрация в WordPress.

Допустим, вы работаете с плагином. В загрузочном файле плагина сделайте что-то вроде этого:

<?php

/**
 * Creates a Registry using the Registry Design Pattern to store objects
 * that can be used throughout the plugin.
 *
 */
$registry = new Registry();
add_filter('acmeRegistry', function() use ($registry) {
  return $registry;
});

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

Использование реестра

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

<?php

/**
 * Get an reference to the repository and add an instance of a 
 * PostManager to it. The PostManager is a class that allows us
 * to manipulate posts.
 */
$this->registry = apply_filters('acmeRegistry', null);
$this->registry->add('postManager', new PostManager());

Оттуда вы можете получить объекты, которые вы сохранили в реестре:

<?php

/**
 * Get an reference to the repository, get a reference to the PostManager
 * then you can begin working with it.
 */
$this->registry = apply_filters('acmeRegistry', null);
$this->registry->add('postManager', new PostManager());

// An example call that you can make to set the title of the post.
$postManager->updateTitle('This Is the New Title');

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

Несколько слов о тестируемости

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

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

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

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