[PHP] Делаем поддержку плагинов

Автор: BlackSilver
05.10.2009 10:51

В паблике лежит большое количество php-скриптов, которые делают почти всё, что нам надо. Это такой закон подлости - всё равно нужно что-то дописать, а вон там что-то поменять - и всё будет хорошо. Такие скрипты, бывает, можно скачать по множестве всяких вариантов. Или можно найти дополнения, инструкция по установке которых выглядит примерно так: "В таком-то файле найдите такую-то строку и вставьте после неё вот это".

Чтобы избежать таких неудобств в свои скрипты стоит добавлять поддержку плагинов. Это просто, вот пример - "Hello world" с поддержкой плагинов. Рассмотрим его поподробнее.

Добавляем плагины

В начале файла plugins.php есть такие строки:

// Массив с обьектами плагинов
$plugins = array();
 
// Подключаем все файлы .php в папке plugins
if ($handle = opendir('plugins')) {
    while (false !== ($file = readdir($handle))) { 
    if ( eregi('\.php$', $file) )
      include_once 'plugins/'.$file;
    }
    closedir($handle); 
}
 

То есть мы лазим по папке plugins и подключаем все .php файлы, которые в ней найдем. Подключением плагинов пусть они сами и занимаются - так проще.

Пишем плагин

Посмотрим на файл с плагином silencer.

class plugin_silencer {
 
  function process_text( $text ) {
    return str_replace( '!', '.', $text );
  }
 
  function show_ender() {
    echo '<p>Плагин silencer копирайт улюлю.';
  }
 
  function show_text_change() {
    return 'Восклицательные знаки заменены на точки.';
  }
 
}
 
// Регистрируем плагин
$plugins[] = new plugin_silencer();</p>

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

Вызываем код плагина

Тепер в скрипте мы ищем места, куда можно было бы подключать плагины. В примере таких мест три: обработка текста перед выводом на экран, список изменений и данные в конце страницы. Каждом таком месте стоило бы:
1. Пройтись циклом по всем плагинам.
2. Посмотреть стоит ли вызывать данный плагин. Тут мы смотрим, есть ли у плагина данный метод.
3. Вызвать искомый метод.

То есть чтобы плагин сработал, он должен иметь метод с именем, указаным сдесь и принимать/отдавать данные так, как от него ожидают и месте вызова плагина.

Такая последовательность операций не так уж и удобна, поэтому в большинстве случаев проще воспользоватся одной из функций, которые я дописал в plugins.php:

  • plugin_call ($name) - вызывает у каждого плагина метод с именем $name.
  • plugin_get_array ($name) - вызывает у каждого плагина метод с именем $name. Результаты записывает в массив, возвращает этот массив. В качестве ключей использует имена классов плагинов.
  • plugin_process ($name, $defval) - Используется для последовательной обработки данных плагинами. В качестве первого аргумента каждому плагину перелает то, что вернул предидущий. Первому передает $defval, результат работы последнего - возвращаемое значение всей функции.

    Теперь нам просто подключать и вызывать плагины.

    Заключение

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

  • Обновлено 07.05.2011 23:44

     

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


    Защитный код
    Обновить