Как сделать PHP ловушку? - PullRequest
       17

Как сделать PHP ловушку?

13 голосов
/ 01 декабря 2011

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

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

Ответы [ 2 ]

30 голосов
/ 01 декабря 2011

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

/**
 * 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);
0 голосов
/ 05 января 2019

Вот еще одно решение:

Создание хука

Запустите его везде, где вы хотите создайте хук :

x_do_action('header_scripts');


Прикрепите функцию к крючку

Затем присоедините функцию к указанному выше, выполнив:

x_add_action('header_scripts','my_function_attach_header_scripts');

function my_function_attach_header_scripts($values) {

   /* add my scripts here */

}

Глобальная переменная для хранениявсе перехватчики / события

Добавьте это в начало вашего основного файла функций PHP или эквивалентного

$x_events = array();
global $x_events;

Базовые функции

function x_do_action($hook, $value = NULL) {
    global $x_events;

    if (isset($x_events[$hook])) {

        foreach($x_events[$hook] as $function) {

            if (function_exists($function)) { call_user_func($function, $value); }

        }
    }

}

function x_add_action($hook, $func, $val = NULL) {
    global $x_events;
    $x_events[$hook][] = $func;

}
...