Начну издалека.
Давайте рассмотрим несколько модулей, которые вроде бы связаны между собой. Товары, заказы, галерея для товаров. В случае, если мы удаляем товар следует удалить также прикрепленные к нему картинки (как записи из базы так и с файловой системы). Если есть заказы, которые используют этот товар - то их нужно либо тоже удалить, либо перейти к ним, или че-то еще сделать по желанию админа. Это хорошо, когда мы заранее знаем что от чего зависит. Но бывает немного по-другому.
1) В момент, когда модуль А должен проверить зависимости от модуля Б - Б не загружен. И это нормально.
2) В момент, когда модуль А должен проверить зависимости - мы не знаем, какие зависимости у нас определены. Да, бывает и такое. Например модуля галерея может и не быть в системе или он отключен. Зачем удалять картинки, которых нет?
В JS есть отличная вещь - callbacks. В пыхе версии 5.30 тоже появилась. Но они все равно не решат проблему 2. Проблему 1 частично решат они и __autoload.
Идем дальше. Предлагаю добавить немного событий. Я уже пытался обсуждать это на php.ru, там идею зафукали. Сказали, что это вообще нифига не события.
Примерный набросок того, чего я хочу: http://pastebin.mozilla-russia.org/102212
Как использую:
<?
// какой-то дополнительный event
public function event2($page)
{
return str_replace('т', '*', $page);
}
public function run()
{
$page = getContentPageById(2);
// путь к папке, в которой сложены event'ы, которые следует запускать
$eventsPath = 'config/events/modules/user/content/beforeAssign/';
$page['content'] = EventsManager::instance()
// аттачим дополнительный event, кроме тех, что в папке
->attach('content/beforeAssign', array($this, 'event2'))
// вызываем все event'ы
->call('content/beforeAssign', $eventsPath, $page['content']);
}
// файл с основным event'ом, лежит в папке config/events/modules/user/content/beforeAssign
function testFunc($content)
{
return str_replace('а', '_', $content);
}
return 'testFunc';
какие плюшки мы получаем:
мы можем добавить какой-то модуль, который будет вызываться другими модулями и не нужно будет править код этих других модулей. Такая независимая зависимость. Например я пишу плагин, который будет заменять все вхождения слова "селедка" в теле комментариев, контента, новостей на слово "скумбрия". При установке этого плагина копируются его главные файлы, он копирует файлы-event'ы в папки. Модуля комментариев даже может и не быть на сайте. Ничего страшного, мы создадим папку, скопируем туда файл. При удалении плагина - просто удалим эти файлы с event'ами
какие минусы:
- используется много папок и файлов.
- при каждом вызове event'а мы сканируем папку на файлы
- у event'ов нет сортировки/приоритетов. Мы можем сначала удалить все картинки товара, а потом вдруг сказать пользователю: "бааа! да у нас же тут некоторые заказы его используют". В принципе можно именовать файлы по приоритетам 1_checkOrders.php, 4_removeImages.php. Тогда в checkOrders будем бросать исключение и removeImages уже не выполнится.
Еще можно хранить эти event'ы в базе, но я не хочу в базе хранить php-код. И может быть я буду event'ить подключение с базой (для какого-нить системного лога).
В общем высказывайтесь. Может посоветуете че-нить, как удобно их хранить.