Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Организация хуков
Форумы портала PHP.SU » » Вопросы новичков » Организация хуков

Страниц (1): [1]
 

1. iflight - 08 Августа, 2011 - 03:42:59 - перейти к сообщению
На самописном движке хочу реализовать хуки, для удобств расширения функционала с помощью модулей. Надумал пока вот что:

Каждый модуль оформляется в виде php файла с классом, методы этого класса - реализация хуков вида :
PHP:
скопировать код в буфер обмена
  1. modulename_hookname($var){
  2.  //тут необходимые операции
  3. }

Запуск хука происходит так ($this->modules - сисок всех установленных модулей):
PHP:
скопировать код в буфер обмена
  1. function after_new_material_save($material){
  2.                 foreach($this->modules as $mod_name){
  3.                         $mod_path = '/modules/'.$mod_name.'/'.$mod_name.'.php';
  4.                         if(is_file($mod_path)){
  5.                                 include_once($mod_path);
  6.                                 $mod = new $mod_name;
  7.                                 $method = $mod_name."_after_new_material_save";
  8.                                 if(method_exists($mod,$method)){
  9.                                         $mod->$method($material);
  10.                                 }
  11.                         }
  12.                 }
  13.         }

а в "ядре" движка функции hookname() запускаются в нужных местах. (например after_new_material_save($material) сразу после сохранения материала).

Но с таким подходом в итоге можно получить огромное количество инклудов, что не есть хорошо. Как более рационально можно подобное организовать? мб подкинте ссылок, хотя бы на английском, ничего толкового найти не могу.
2. DeepVarvar - 08 Августа, 2011 - 07:54:03 - перейти к сообщению
http://habrahabr[dot]ru/blogs/php/31270/
3. iflight - 08 Августа, 2011 - 11:32:57 - перейти к сообщению
DeepVarvar не то. В том примере "модули" не могут влиять на работу ядра при определенных действиях.
4. DeepVarvar - 08 Августа, 2011 - 12:24:49 - перейти к сообщению
iflight пишет:
include_once
iflight пишет:
огромное количество инклудов
Сами себе противоречите.
Ну даже если подгрузим на странице одного модуля парочку других модулей, это сильно не повлияет.
А если модуль был подключен ранее, с *_once пых на диск даже не полезет.
Ссылку я вам дал чтобы вы посмотрели в сторону __autoload чтобы не делать ваш ненужный цикл в строке 2 последнего примера.
Далее если вы читали очем там пишут,
за счет контроллера можно обратиться к любому из модулей, который автоматически подгрузится если не был загружен ранее.
5. iflight - 08 Августа, 2011 - 12:34:54 - перейти к сообщению
дело в том что я использую приведенный вами пример))
По поводу автолоад - уже используется в главном файле, я так понимаю больше его переопределять нельзя?
Насчет *_once я как то не подумал, каюсьНедовольство, огорчение
Склонили меня к тому что не так уж все и плохоУлыбка
6. DeepVarvar - 08 Августа, 2011 - 12:37:14 - перейти к сообщению
iflight пишет:
больше его переопределять нельзя?
Незачем - все "хуки" и "пуки" уже доступны изначально Закатив глазки
7. iflight - 08 Августа, 2011 - 12:44:44 - перейти к сообщению
Ну если делать автолоад как на хабре то нет, но можно его дописать) Так и поступлюУлыбка

 

Powered by ExBB FM 1.0 RC1