Как сделать систему PHP-хуков?


Как вы внедряете систему подключений в PHP-приложение, чтобы изменить код до или после его выполнения. Как бы выглядела базовая архитектура класса hookloader для PHP CMS (или даже простого приложения). Как тогда это может быть расширено до полного загрузчика плагинов/модулей?

(Кроме того, есть ли какие-либо книги или учебные пособия по системе CMS hook?)

Author: alecwhardy, 2011-12-01

1 answers

Вы можете построить систему событий как простую или сложную, как вы хотите.

/**
 * Attach (or remove) multiple callbacks to an event and trigger those callbacks when that event is called.
 *
 * @param string $event name
 * @param mixed $value the optional value to pass to each callback
 * @param mixed $callback the method or function to call - FALSE to remove all callbacks for event
 */
function event($event, $value = NULL, $callback = NULL)
{
    static $events;

    // Adding or removing a callback?
    if($callback !== NULL)
    {
        if($callback)
        {
            $events[$event][] = $callback;
        }
        else
        {
            unset($events[$event]);
        }
    }
    elseif(isset($events[$event])) // Fire a callback
    {
        foreach($events[$event] as $function)
        {
            $value = call_user_func($function, $value);
        }
        return $value;
    }
}

Добавить событие

event('filter_text', NULL, function($text) { return htmlspecialchars($text); });
// add more as needed
event('filter_text', NULL, function($text) { return nl2br($text); });
// OR like this
//event('filter_text', NULL, 'nl2br');

Тогда назовите это так

$text = event('filter_text', $_POST['text']);

Или удалите все обратные вызовы для этого события, как это

event('filter_text', null, false);
 28
Author: Xeoncross, 2012-12-04 20:21:40