Тест хуков

Господа, я накидал простейший механизм хуков. Предлагаю потестить его на производительность на рабочем проекте.

Для теста необходимо:
1. создать файл /classes/modules/hooktest/HookTest.class.php с содержимым

<?
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
class LsHookTest extends Module {	
	private $aHooks = array();
	public function Init() {		
		//for ($i=0;$i<10000;$i++)
			$this->hookInvoke("before_topic_show","HookTest_AddCopyright");			
	}	

	public function addCopyright($aVars){
		$aVars["topic"]->setTitle("");
		$aVars["topic"]->setText($aVars["topic"]->getText()." © 2009");	
	         //$this->Viewer_ClearBlocks('right');
                 //$this->Viewer_AddBlocks('right',array('stream','tags','blogs'));			
	}
	
	public function hookRun($sHookName,$aVars){		
		if (isset($this->aHooks[$sHookName]))
			foreach ($this->aHooks[$sHookName] as $sCallBack){
				call_user_func_array(array(&$this, $sCallBack),array($aVars));
			}						
	}
	
	public function hookInvoke($sHookName,$sCallBack){
		$this->aHooks[$sHookName][] = $sCallBack;
	}	
}
?>

2. Открыть метод EventShowTopicPersonal (/classes/actions/ActionBlog.class.php) и
добавить строчку

      $this->HookTest_HookRun("before_topic_show",array("topic"=>&$oTopic));

перед комментарием


		/**
		 * Загружаем переменные в шаблон
		 */	


3. Повторить пункт 2 с методом метод EventShowTopic (/classes/actions/ActionBlog.class.php)

10 комментариев

avatar
прикольно когда хук сам себя хучит )))
&$this и &$oTopic
знак & в php5 не обязателен
avatar
Попробуем давай!:)
avatar
с механизмом всё более менее понятно
нужно определить список необходимых точек для хуков
avatar
Предлагаю набирать по мере надобности.
Мне для галереи:
init_action (actions/Init.class.php -> InitAction())
topic_show
topic_personal_show (может, объединить)
blog_show_good
blog_show_new
blog_show_bad
topic_add_show (экран создания топика)
profile_whois_show

Первым словом можно указывать название класса: a_blog (ActionBlog) или m_blog (LsBlog), а вторым событие (думаю, может отличаться от метода).
И в конце, если надо, можно добавить before/after
avatar
насчет твоей галереи и actions/Init.class.php — его можно вообще не трогать, а сделать эти действия в Init() твоего модуля и поставить его в автозагрузку через локальный конфиг gallery/config.module.php
avatar
предлагаешь в качестве хука также вызвать метод экшена? чот эт немного не фонтан
предлагаю только методы модулей и методы отдельных хаков

по реализации:
системный модуль Hooks
в каталоге /classes/hooks/ хранить автозагружаемые хуки, которые наследуются от абстрактного, а в нём уже идет обращение к модулю hooks
тогда поставить хук мы сможем двумя способами:
1. создав класс хука
2. установить хук в любом месте через модуль Hooks
так?
avatar
методы отдельных хаков
хуков
avatar
Не, я говорю про название хука. чтобы было понятно где он вызывается напр.
a_blog_topic_show.

По реализации да, отлично!

Можно еще сразу подумать о шаблонах. Там тоже иногда вставки надо делать…
avatar
посмотри 325 коммит, добавил поддержку
avatar
Спасибо!:)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.