Как лучше сделать hook`и?

mendel
На сайте с 06.03.2008
Offline
183
740

Думаю о простом но нормальном принципе хуков в своем движке.

Хуки шаблонизатора тут все просто - в шаблоне хук заменяется на все зарегистрированные хуки или файлы или просто удаляется если хуков нет.

С функциями/модулями сложнее.

Нашел вариант:

function hook($result){

global $hook;
$d_backtrace=debug_backtrace();
$backtrace=is_array($d_backtrace[1])?$d_backtrace[1]:$d_backtrace;
$functions=@$hook[$backtrace['function']];
$args=$backtrace['args'];
if(is_array($functions)){
ksort($functions);
foreach($functions as $function)
if($function&&function_exists($function))
$result=$function($result,$args);
}
return $result;
}

отсюда: http://bolzamo.org.ru/228/

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

из минусов вижу пока только сложность хукать классы.

Шутку любишь над Фомой, так люби и над собой. (с) народ. Бесплатные списки читабельных(!) свободных доменов (http://burzhu.net/showthread.php?t=2976) (5L.com) Сайты, All inclusive. 5* (/ru/forum/962215)
ewg777
На сайте с 04.06.2007
Offline
225
#1
Хуки шаблонизатора тут все просто

Хук и колбэк - не путаете их?

hook — крючок, ловушка
ИМХО это тот же gotoeval
mendel
На сайте с 06.03.2008
Offline
183
#2
ewg777:
Хук и колбэк - не путаете их? ИМХО это тот же goto

Не путаю.

Хук это метод изменения или дополнения функций и не только.

В контексте шаблонизатора обычно под хуками подразумевают "метки" в шаблоне на место которых можно добавлять тот или иной html или контект.

К примеру в шаблоне может быть хук "начало левой колонки" или "конец центральной колонки", и тогда если плагин хочет вывести что-то в этом месте ему не надо править шаблон - достаточно указать что на этот хук есть такая-то информация и вывести ее здесь... аналогчино если другой модуль захочет там же выводить то выведется сначала одна инфа а потом другая...

Что же касается на вьюва а контроллера то по ссылке более менее удачно расписано (вернее там ссылка на первую часть если вы не знаете что такое хук)

что же касается колбека то это как правило реализация основной логики а не расширения...

DeveloperRu
На сайте с 27.02.2009
Offline
72
#3

по-моему, тут архитектурное решение выбрано неверно

информация о том, что выводить в левой колонке, например, должна храниться в одном месте, например, в базе данных

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

имхо, так правильнее

Ответы на вопросы (http://telenok.com)
ewg777
На сайте с 04.06.2007
Offline
225
#4
DeveloperRu:
по-моему, тут архитектурное решение выбрано неверно

информация о том, что выводить в левой колонке, например, должна храниться в одном месте, например, в базе данных

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

имхо, так правильнее

Контроллер никак не связан с базой, если мы говорим о неком MVC. Модель взаимодействует с базой.

mendel, это хук?


($hook = vBulletinHook::fetch_hook('calendar_start')) ? eval($hook) : false;

Он помогает или одно из двух?

Dreammaker
На сайте с 20.04.2006
Offline
570
#5
mendel:
из минусов вижу пока только сложность хукать классы.

посмотрите как в Yii сделаны события beforeSave, afterSave и т.д. для модели.

mendel
На сайте с 06.03.2008
Offline
183
#6
DeveloperRu:
по-моему, тут архитектурное решение выбрано неверно

информация о том, что выводить в левой колонке, например, должна храниться в одном месте, например, в базе данных

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

имхо, так правильнее

так правильнее только если это скрипт "однодневка" т.е. написан одним разработчиком за один день, а на второй день этот же разраб пошел верстать дизайн :)

В случае когда ядро написано мной, движок написан Ивановым, дизайн сверстан Петровым плагин календарика написан Сидоровым а дизайн для плагина верстался Петренко а плагин облака тегов на главной писался и верстался Иваненко, ну а все это ставил у себя Рабинович то такой подход не работает :)

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

ewg777:

mendel, это хук?
Он помогает или одно из двух?

Это хук :) читал я их класс.... мудрено. мне проще надо. вышеприведенный пример получше будет.

Dreammaker:
посмотрите как в Yii сделаны события beforeSave, afterSave и т.д. для модели.

Не знаком с этим фреймворком. При беглом знакомстве я увидел что такой подход ограничивает количество хуков на один метод плюс они не очень универсальны.

JTRTA
На сайте с 06.07.2008
Offline
25
#7
mendel:
Не знаком с этим фреймворком. При беглом знакомстве я увидел что такой подход ограничивает количество хуков на один метод плюс они не очень универсальны.

А зря не знакомы оч даже занятный фреймворк, архитектурные решения мне понравились намного больше чем в ZF и CI.

В Yii подобный механизм называется событиями. Про ограничение количество событий неправда там можно в любом месте вызывать любые события, событий можно сделать столько сколько душе угодно, и каждому событию можно зарегистрировать множество обработчиков, которые выполняются в порядке их регистрации. А поподробней в чем универсальность не устраивает?

Можно поведения тоже посмотреть. Пока все задачи которые встречал решались совместно с проведениями и событиями

Кстати события там сделаны не для модели а для компонента, а модели, экшены, поведения, виджеты и др уже наследуют, что дает единый событийный механизм для всех составных частей системы. А значит один и тот же обработчик собтия может вызваться в любом месте приложения

Дизайн /ru/forum/493415 (/ru/forum/493415) Верстка от 15$ /ru/forum/509339 (/ru/forum/509339) Сайты под ключ aiogino.studio@gmail.com icq: 460146806

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий