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

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

15

Ми внесли значну кількість змін у шаблон віджетів WordPress. Якщо ви не стежите за цим, я рекомендую почати з початку серії та наздогнати.

Однак якщо ви стежите за цим і також використовуєте деякі інструменти якості коду, які перевіряють стан проекту, то ви помітите декілька помилок у консолі.

Зазвичай це момент, коли я рекомендую звернути увагу на те, що він ділиться, а потім виправити все, що він повідомляє, але ми ще не досягли цього.

Наприклад, деякі помилки, які зараз показують наші інструменти, засновані на тому, що ми маємо невикористані змінні. Звичайно, це так, оскільки ми ще не почали створювати віджет.

Але є ще кілька конкретних класів, які нам потрібно реалізувати.

Шаблон віджета 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);
    }
}

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

Однак перед The ​​Bootstrap

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

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

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

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