Використання шаблону реєстру в WordPress
Я мав кілька бесід з різними друзями та іншими в Twitter про поняття глобальних змінних у мовах програмування. Для тих, хто новачок у програмуванні або хто не впевнений, чому вони погані:
Використання глобальних змінних ускладнює читання та розуміння програмного забезпечення. Оскільки будь-який код будь-де в програмі може змінити значення змінної в будь-який час, розуміння використання змінної може призвести до розуміння значної частини програми.
Це не означає, що вони не застосовуються, але якщо ви зацікавлені в об’єктно-орієнтованому програмуванні (особливо в налаштуваннях WordPress, де ви збираєтеся використовувати PHP), то важливо зрозуміти деякі кращі альтернативи ніж глобальні змінні.
Тобто існують способи роботи з передачею даних навколо вашої програми без необхідності використання глобальних змінних. І одним із таких способів є шаблон реєстру.
Шаблон реєстру в 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;
}
}
Зауважте, що його реалізація досить проста:
- Клас містить єдиний масив як приватну властивість.
- Дані додаються до масиву з певним ідентифікатором.
- Дані можна отримати з шаблону з ідентифікатором.
Ви навіть можете підняти цей конкретний шаблон на наступний рівень, якщо він приймає лише клас певного типу (наприклад, 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;
});
Це створює реєстр, а потім створює відповідний фільтр, який ми можемо використовувати пізніше в плагіні для отримання реєстру та інших об’єктів, які він підтримує.
Використання реєстру
Щоб додати об’єкт до реєстру, викличте функцію add і передайте унікальний ідентифікатор та екземпляр об’єкта. Зауважте, що наша поточна реалізація викидає будь-які попередні екземпляри об’єкта, який має той самий ключ, і замінює його тим, що ми йому передаємо.
<?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, таким чином відокремлюючи логіку домену від основної програми та роблячи їх більш репрезентативними для даних, які вони повинні підтримувати.
