Как реализовать механизм крюка в PHP

PHP

Так называемый механизм ловушек — это технология, ставшая популярной благодаря программированию для Windows. Основная идея заключается в том, чтобы заранее закопать (предустановить) хук, куда может быть добавлена ​​функция. Этот хук не имеет практического значения. Когда нам нужно перемодифицировать или увеличить логику этого места, монтировать расширенный класс или метод. эта точка.

Когда автор изучает механизм ловушек, он обращается к механизму тегов и ловушек TP3.2.3 и использует разработанную им структуру MVC, стиль каталогов которой имитирует TP3.2.3, что вызывает смех у больших парней.

В качестве простого примера мы собираемся написать функцию регистрации пользователя, как показано ниже:

/App/Home/Controller/IndexController.class.php


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


Клиент очень доволен, но другой коллега ваш нужен ваш код, и вы говорите ему, что вы тянете из Git. Клиент делает еще один запрос для отправки электронного письма пользователю после пользовательских регистров (удерживайте (╬▔ блюдо▔)), то вы сделаете это:


Если у вас много подобных модификаций в проекте, что делать? Затем модифицируется? Проект будет только больше раздуваться, и тем вреднее. Дорогие клиенты? Не создавай проблем, ㄟ (▔, ▔) ㄏ. Подать в отставку? Думаю об ипотеке, хочу думать о жене и детях, я терпения (. ·`Ω`·). PS: Где жена и дети у программистов... (∀ ∀ ∀)

Ближе к дому лучшим решением будет использование крюкового механизма.

Сначала взгляните на класс Hook, который мы написали:

/CutePHP/Lib/Cute/Hook.class.php


Это простой класс Hook, который я написал, имитирующий Hook TP, который содержит статическое частное свойство Hooks для записи всех зарегистрированных ловушек.

Метод add передает имя и метод хука, и хук может быть сохранен в массиве. Listen используется для мониторинга хука. Пока есть хук, для выполнения хука будет вызываться метод exec. .

Давайте проверим это, сначала закопаем хук в /App/Home/Controller.class.php:


Затем создайте одну и ту же папку, что и крючок / каталог App / App / Home / Plugin / App / Home / Plugin / Регистрация и создайте файл register.php с тем же именем, что и крюк, и напишите простой класс, называемый регистр. Ниже Есть два метода, которые называются раньше, и он называется после:


Затем зарегистрируйте два крючка в публичной конфигурации проекта:

/App/Conf/Hook.php


Затем, когда мы получим доступ к методу Register контроллера Index в разделе Home, он будет отображаться:


Так как же работает конкретный принцип? Прежде всего, давайте кратко рассмотрим мой фреймворк: в базовом классе Cute есть метод Start, который используется для загрузки фреймворка запуска роутинга, и загрузки файла /App/Conf/Hook.php перед загрузкой контроллера. , Заходи:


Итак, в этом файле наш код выглядит так:


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

PS: Многие коды и функции в тексте не существуют и используются только для описания логического процесса.

PPS: В статье используется простой MVC-фреймворк, написанный мной, имитирующий TP3.2.3, я только им пользуюсь, он слишком прост и смешит всех больших парней.

PPPS: Просить о сборе, просить о пересылке. Нелегко быть оригинальным, поэтому, пожалуйста, укажите обработку.