Мне интересно, что лучший способ обработки перехватов в приложении PHP
– поэтому я могу вставить пользовательскую или «подключаемую» функциональность без изменения основного кода.
Я знаю, что WordPress имеет что-то вроде этого. Действительно ли это можно сделать следующим образом:
if (file_exists('file_before'){ include('file_before'); } print 'hello'; if (file_exists('file_after'){ include('file_after'); }
Как я обычно делаю вещи, когда дело доходит до крючков, создается класс HookLoader, в котором будут храниться два типа крючков, PRE и POST. поскольку PHP – это простой поточный интерпретатор, не было бы такой вещи, как DURING.
Возьмем следующий пример:
$Hooks = new HookLoader(); $Hook->Run("PRE","database_connect"); $Database->Connect(); $Hook->Run("POST","database_connect");
каждый крюк в каталоге hook должен иметь имя так:
name_pre_database_connect.hook.php
Файлы Hook будут отформатированы так:
{name}_{type}_{event}.hook.php
Это позволит вам создавать неограниченное количество крючков.
желательно, чтобы я сделал класс крюка абстрактным и статическим, вы можете просто запускать вызовы крюка внутри реального объекта, поэтому добавление новых библиотек будет интегрировано, если они имеют Hook::run("type","event");
Почему бы не использовать « Pattern наблюдателя » для этого? Вы можете добавить объект в свое тело и активировать действия, связанные с прикрепленным классом. Если вы хотите его доработать, вы можете создать конкретный метод внутри каждого объекта Observer, который определяет этап выполнения. Сначала это, скорее всего, будет больше программирования, но даст очень чистый интерфейс для прикрепления к вашим классам большей функциональности.
Для конкретного примера эта статья IBM dev (кстати, ее ценность для чтения в целом) должна дать вам хорошее впечатление об этом шаблоне.
MediaWiki имеет свой собственный механизм определения перехватов в своих методах и способы регистрации функций, которые должны выполняться для данной точки выполнения …
http://www.mediawiki.org/wiki/Hooks (возможно, это хорошее место для начала)