Расширенный OOP для WordPress Часть 9: Расширяемые плагины с помощью API плагинов

В этой серии по применению передовых объектно-ориентированных принципов программирования (OOP) к коду PHP, который мы используем в плагинах WordPress, мы создаем плагин, который изменяет работу маршрутов REST API для улучшения своих возможностей поиска. Одна из больших вещей о WordPress является его расширяемость.

В этой должности, я собираюсь пройти через использование улучшений, внесенных в последней статье. В этой серии, чтобы сделать плагин расширяемым, Тоня Морк из Know The Code пишет статьи обзора кода в этой серии. Последняя статья, я написала все о том, чтобы поисковая система swappable. Изменения, которые я делаю здесь также построить от изменений, которые она внесла в плагин как часть одной из ее статей обзора кода. Этот пост действительно идет в глубину о том, что мы подразумеваем под «swappable».

Этот пост, воспользовавшись тем, как swappable по умолчанию реализации в этом плагине сейчас, делает его расширяемым. Под расширяемым, я имею в виду другие плагины смогут изменить егоbehaviorr без изменения его кода. Как? С WordPress Plugins API — крючки. Это WordPress образом, и он работает, и мы можем сделать его проверяемым с помощью макетов,так что это то, что мы собираемся использовать.

Создание маршрутизатора

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

Просмотр кода на Gist.

Это то, что мы должны сделать это расширяемым. Если вы посмотрите на getPosts(), он уже имеет абстракцию для настройки, хранения и получения объекта WP-REST-Запрос, который он захватывает от aPI плагинов. Этот объект может содержать сигнал — параметр запроса «режим», чтобы переключить, какой метод поиска или «режим» мы используем.

«Режим» переключатель потребует изменения класса, который создает результаты, которые должны реализовать ContentGetterContract. В моем последнем посте, я объяснил, как FilterWP’ery получил getter и сеттер для этого объекта.

Что getPosts () в настоящее время не хватает является способ запустить этот метод сеттера прямо перед содержанием Getter используется. Для этого и нон, для чего мы должны себя делать. Так что мой первый шаг был инициировать действия прямо перед retriving содержание getter, так что мы можем назвать сеттер на этом мероприятии:

Просмотр кода на Gist.

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

Следующим шагом было введение класса для управления режимом поиска. Что я назвала «Моды». Он берет на себя ответственность за получение правильного генератора содержимого в FilterWP’ery на основе аргумента запроса «режим», указанного в текущем WP -Rest-Запрос.

Просмотр кода на Gist.

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

Просмотр кода на Gist.

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

Во втором тесте я использую Mockery для создания макета WP-Rest-Request. Это необходимо, так как модульные тесты для этого плагина не загружают WordPress. Я узнал, как это сделать из статьи Тоня на насмешки. Это инструмент для меня, что я собираюсь использовать гораздо больше. Не имея простой способ сделать макеты, почему я часто просто использовать WordPress ‘тестовый набор, с WordPress окружающей среды вместо модульных тестов для моих тестов. Держать их отдельно по мере того как этот плагин примера делает больш, но создавать макет для каждого типа WordPress не масштабирует.

Добавление фильтра

Теперь, когда у нас есть этот класс на месте, давайте на самом деле сделать его расширяемым. Это цель здесь. Давайте пройдем через это.

Для моего следующего коммит Я добавил фильтр, который, если он является недействительным, использует этот внутренний маршрутизатор. Если это допустимый объект, он возвращается. Я доказал это с интеграционным тестом. Ядро WordPress использует этот шаблон «фильтров раннего возврата». Этот шаблон использует фильтр для опционально предотвращения поведения по умолчанию. Если ничего не меняет возврат формы фильтра в нулевые, чтобы привести к действительному результату, поведение ядра по умолчанию выполняется, если его действительный вывод, поведение ядра по умолчанию обходится.

В своей первой статье в этой серии я написала о том, как post’pre-query действует как фильтр раннего возврата для фактического запроса базы данных WP-Query. Мы используем этот фильтр для предоставления собственных результатов для WP-Кви.

Вот рефакторинг класса режима с новым фильтром:

Просмотр кода на Gist.

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

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

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

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

Просмотр кода на Gist.

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

Кроме того, обратите внимание, что, хотя WordPress загружается в наборе интеграционных тестов, я все еще использую макет WP-Rest-Запрос. Почему? Потому что я хочу контролировать внешние эффекты как можно больше. Этот тест не тестирует взаимодействие с WP-REST-Запрос, так что макет абстрагирует свою роль.

Можете ли вы сделать расширение?

Теперь плагин расширяется. Вы можете увидеть код, который я добавил к этому плагину, чтобы сделать его выдыхаемым в этом запросе. Если вы читали вместе, вы знаете, как этот плагин работает. Вы знаете, какие детали, которые могут поменять, и как работает фабрика. Эта статья показала вам, как плагин расширяется.

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

Источник: torquemag.io

Добавить комментарий

%d такие блоггеры, как: