что такое хуки php
Что такое хуки php
У каждого хука должен быть комментарий с описанием (например, точка входа, или что делает хук), а также с описанием параметров (только для PHP-хуков ).
Основные тезисы по хукам¶
Хуки нужны для расширения функций разработчиками. Поэтому передавайте в хук максимум параметров — лучше перестараться, чем недостараться.
В названии хука обязательно должно содержаться название функции.
Префиксы использовать нельзя. Можно использовать только суффиксы.
Если у вас сложная функция, и в ней много хуков, то именовать хуки можно примерно так:
Для хуков в классах: каждый хук должен содержать название класса, в котором он вызывается.
Для хуков в классах: каждый хук должен первым параметром передавать инстанс класса:
Как и куда добавлять хуки¶
Исходим из того, что в каждой функции должно быть минимум два хука:
Также могут быть дополнительные хуки:
extra hooks, как пример, можно посмотреть на функцию выбора товаров:
Некоторые хуки не соответствуют вышеозначенным стандартам, тогда ставим им комментарий такого вида:
Формат оформления хуков¶
Ниже приведены форматы для комментариев для базы хуков.
PHP-хуки и функции¶
Формат комментариев заимствован у PHPDocumentor. Такой формат комментариев должен применяться повсеместно ко всем функциям.
Для генерации документации используется программа Doxygen (вот руководство).
Основные правила и рекомендации по написанию комментариев:
Комментарий начинается с большой буквы, точка в конце не ставится.
Глагол для описания того, что делает функция, употребляется в 3 лице и единственном числе, т.е. “Получает данные пользователя” — “Gets user data”.
Названия и значения переменных, пути к файлам, названия файлов и прочие имена собственные следует выделять курсивным написанием (при помощи HTML-тега ).
Например: Function foo (in foo/bar/functions) accepts parameter $bar
По возможности старайтесь описать переменную так, чтобы было ясно, зачем она нужна именно этой функции.
Комментарий должен находится непосредственно перед хуком.
Хуки в PHP — расширение функций и контроллеров ядра
Общая информация
Многие функции и методы CS-Cart (Multi-Vendor) имеют специальные хуки.
Хуки позволяют модифицировать и расширять возможности платформы с помощью модуля.
С помощью хука можно:
Хуки расположены в функциях и методах ядра CS-Cart.
Общий принцип использования и работы с хуками:
Доступно очень много хуков:
Как выглядт и как использовать хук?
Хуки в PHP выглядят так:
Чтобы подключиться к хуку, вам необходимо:
Инициализировать подключение к хуку.
В данный файл добавьте функцию:
Если используте несколько хуков, передавайте названия хуков через запятую:
Создайте функцию, которая будет выполняться в хуке.
Функция должна иметь название вида: fn_[id_модуля]_[название_хука]($[параметры_хука_через_запятую])
В функции будут доступны все параметры передаваемые в хук.
Чтобы функция могла влиять на параметры (изменять снаружи), их необходимо передавать как ссылки ( &$param )
Живой пример
Предположим, что нам нужно добавить какую то новую информацию о товаре, если товара нет на складе.
Подключимся к последнему хуку и добавим нужную нам информацию с помощью модуля “Мои изменения”:
Добавим в него код:
Создадим функцию для подключения к хуку.
Создадим файл app/addons/my_changes/func.php
Добавим новую функцию, которая сработает в хуке:
Включим модуль “Мои изменения”.
Как проверить что оно работает?
Используйте функцию fn_print_r($product_data); до хука, после хука или внутри хука. Она распечатает на экран содержимое массива.
Как я могу использовать именно этот пример?
Создайте новую вкладку с SMARTY блоком для карточки товара. В данном SMARTY блоке вы можете использовать информацию из массива <$product_data>, в том числе вашу новую информацию, например, для каких либо условий.
Хуки в PHP — расширение функций и контроллеров ядра¶
Общая информация¶
Многие функции и методы CS-Cart имеют специальные хуки.
Хуки позволяют модифицировать и расширять возможности платформы с помощью модуля.
С помощью хука можно:
Хуки расположены в функциях и методах ядра CS-Cart.
Общий принцип использования и работы с хуками:
Доступно очень много хуков:
Как выглядит и как использовать хук?¶
Хуки в PHP выглядят так:
Чтобы подключиться к хуку, вам необходимо:
Инициализировать подключение к хуку.
В данный файл добавьте функцию:
Если используте несколько хуков, передавайте названия хуков через запятую:
Создайте функцию, которая будет выполняться в хуке.
Функция должна иметь название вида: fn_[id_модуля]_[название_хука]($[параметры_хука_через_запятую])
В функции будут доступны все параметры передаваемые в хук.
Чтобы функция могла влиять на параметры (изменять снаружи), их необходимо передавать как ссылки ( &$param )
Живой пример¶
Предположим, что нам нужно добавить какую то новую информацию о товаре, если товара нет на складе.
Подключимся к последнему хуку и добавим нужную нам информацию с помощью модуля “Мои изменения”:
Добавим в него код:
Создадим функцию для подключения к хуку.
Создадим файл app/addons/my_changes/func.php
Добавим новую функцию, которая сработает в хуке:
Включим модуль “Мои изменения”.
Как проверить что оно работает?
Используйте функцию fn_print_r($product_data); до хука, после хука или внутри хука. Она распечатает на экран содержимое массива.
Как я могу использовать именно этот пример?
Создайте новую вкладку с SMARTY блоком для карточки товара. В данном SMARTY блоке вы можете использовать информацию из массива <$product_data>, в том числе вашу новую информацию, например, для каких либо условий.
Разграничение редакций¶
Хуки, которыми будут расширяться редакции, необходимы, чтобы избежать услвоий по типу:
Нам нужно расширить данную функцию в Multi-Vendor. Таким образом, в файле /app/functions/fn.multivendor.php создаем функцию:
Код для определенной редакции¶
Или же использовать отрицание:
Первая часть кода означает, что этот код появится в перечисленных редакциях, вторая же часть — что код НЕ появится в этих редакциях
Хуки в PHP скриптах¶
Версионные теги так же используют фукнцию fn_allowed_for :
PHP система плагинов на основе хуков (hooks)
Здравствуйте, уважаемые читатели блога LifeExample, сегодня предлагаю затронуть очень редкую тему, информации о которой в интернете, кране не хватает. Говорить мы будем о том, как самостоятельно сделать систему плагинов для своей CMS.
Однажды, я где-то читал мысль, что каждый уважающий себя php программист, обязан, хотя бы попробовать сделать свою CMS. И на самом деле очень много, моих знакомых разрабатывали свои домашние системы управления сайтом. Вот и я не стал исключением, и сделал собственную CMS, которая в последствии вылилась в обособленный проект MOGUTA.CMS.
MOGUTA.CMS теперь имеет все задатки, для того, чтобы попытаться покорить сердца начинающих предпринимателей, дав им возможность комфортно управлять своими интернет-магазинами. Именно поэтому у меня давно уже зрело желание создать систему плагинов для своей CMS, да такую чтобы она была легкой и удобной для работы пользователей и программистов.
Проработав некоторое время с движком WordPress, я не мог не оценить его механизм взаимодействия плагинов и ядра, который основан на системе хуков (Hooks – с англ. крючек, зацепка). Опираясь именно на эту концепцию системы плагинов, я решил разработать ее аналог в своей CMS.
PHP hooks – хуки и их концепция
Система хуков как нельзя лучше подходит для расширения функционала CMS, поскольку позволяет довольно гибко оперировать функциями движка, меняя их логику и поведение. Поскольку мне не довелось встретить толкового и обширного объяснения природы плагинов на основе хуков, я попробую изложить ее смысл, настолько — насколько сам его понимаю.
Предлагаю рассмотреть, что такое php hooks, и как их реализовать на простом примере.
В упрощенном виде, система хуков в PHP может выглядеть таким образом:
В общих чертах система хуков именно так и должна работать, но это далеко не все ее возможности. С помощью хуков в php можно полностью изменить тело функции, в которой был создан хук, а можно лишь повлиять на результат, перед тем как она его вернет, также можно передать в исходную функцию другие параметры. Все это позволяет сделать систему неимоверно гибкой.
Но за такую гибкость приходится платить производительностью системы в целом, поэтому перед реализацией в php системы хуков, советую хорошенько подготовиться теоретически.
Как реализовать Hooks
На самом деле система хуков намного сложнее, чем приведенная ниже, но на первом этапе знакомства будет вполне достаточно рассмотреть в миниатюре механизм взаимодействия плагинов и ядра.
В архиве находится три файла:
Давайте начнем разбираться с файла index.php
//Эмуляция запуска ядра системы
$core = new Core ( ) ;
В данном скрипте происходит:
Следующая строка, создает действие с именем ‘demoHook’
Откроем из архива файл plugin.php
//пользовательская функция выполняющаяся при определенном событии
function myFunction ( ) <
echo »
>>>Действия плагина ;
>
Запустив файлы архива, мы увидим такой результат:
Как устроена система хуков
В выше приведенном примере использовалась библиотека для механизма крючков и зацепок, мы подключали ее строкой:
Давайте откроем этот файл и посмотрим, что же в нем хранится, и как все это работает.
/**
* Библиотека хуков, содержит интерфейсы PluginManager и Hook,
* а также класс PM и EventHook
* Класс PM предназначен для управления плагинами
* Класс Hook создает обработчик событий
*
* Автор: Авдеев Марк
* Ссылка на описание: http://lifeexampl.nichost.ru/php-primeryi-skriptov/php-sistema-plaginov-na-osnove-hukov-hooks.html
*/
// Клас PM (plugin Manager) управляет плагинами,
// регистрирует плагины и устанавливает их взаимодействие с системой.
class PM implements PluginManager <
//Вешает обработчик для заданного хука
class EventHook implements Hook <
Вся логика взаимодействия хуков с обработчиками основана на паттерне observer, также известного как «Издатель и Подписчик». Я не буду сейчас описывать суть данного шаблона проектирования, поскольку делал это ранее.
Смысл заключается в том, что все пользовательские функции регистрируются для соответствующих действий классом PM в качестве обработчиков событий-хуков (EventHook).
В результате, зарегистрированные на этапе подключения плагинов функции, могут влиять на поведения любого из стандартных системных методов, а это полностью удовлетворяет задачу плагинов.
Вывод
Согласитесь, что самостоятельно придумать и спроектировать систему плагинов не простое занятие. Этот материал о системе плагинов и хуков, который я изложил в данной статье, должен лишь натолкнуть вас на правильное решение, но не стоит воспринимать его как законченную систему плагинов.
Ну а если вам все же интересно как можно развить данную заготовку до полноценной системы плагинов, рекомендую ознакомиться с моим движком MOGUTA.CMS, в котором механизм хуков учитывает все атрибуты настоящих плагинов такие как:
Также всех желающих разобраться с тем как устроен движок, и помочь в его дальнейшем развитии приглашаю сюда.
Надеюсь эта реализация системы хуков оказалась для вас настолько же интересной как и для меня.
Cotonti / Open Source PHP Content Management FrameworkContent Management Framework
Что такое Хуки или как управлять потоком исполнения системы
#1. Что такое Хуки?
Хук (от англ. hook) это специальное место в программе, вкотором может быть выполнен какой-либо сторонний скрипт (в данном случае соответствующая часть плагина или модуля), с тем чтобы изменить логику исполнения основной программы. Можно рассматривать этот механизм, как некоторое событие, которое должно быть обработано специальным кодом. В реальности Cotonti подключает соответствующий PHP файл, зарегистрированный как обработчик соответствующего события (хука). Рассмотрим программу в которой есть Хук:
Теперь предположим у нас есть обработчик данного хука, который имеет доступ ко всем переменным в данной областивидимости (в контексте вызова). Этот обработчик может выглядеть например так:
Во время выполнения Cotonti, код будет преобразован в следующую последовательность:
Таким образом, хуки это ваши помощники в деле расширения возможностей текущего кода. В Cotonti их существует достаточно большое количество, что позволяет изменить практически все.
#2. Какой хук выбрать?
Первый вопрос на который стоит ответить прежде чем писать очередную часть своего расширения — это то, какой функционал системы мы хотим изменить. А следовательно какой хут стоит для этого использовать. Конкретный список доступных хуков зависит от многих факторов: того какой модуль вызван, какая его часть при этом сработает, и какие действия будут выполнены в процессе работы скрипта. В зависимости от условий будут обработаны соответствующие хуки и вызваны соответствующие им обработчики.
#2.1. Основные хуки
Некоторые хуки в системе вызываются практически всегда и строго в определенном порядке относительно друг друга:
В зависимости от запрошенной страницы сайта и вызова того или иного обработчика (расширения) могут быть вызваны следующие хуки:
Раз уж зашла речь о системных хуках, то стоит упомянуть и третью группу — хуки расширяющие функционал системных функций. Эти хуки определены внутри некоторых функций и срабатывают при их вызове. Давайте взглянем:
(Note: тег доступен для использования начиная с версии 0.9.6 )
#2.2. Правила именования
Поговорим немного о правилах именования хуков. Большинство имен хуков состоит из нескольких слов разделенных точкой. Например:
Таким образом, по имени хука можно сделать выводы о файле в котором расположен код-обработчик и той части кода из которого он вызывается. Поэтому рекомендуется придерживаться этих правил наименования, при разработке собственных дополнений. Ниже мы поговорим об этом подробнее.
#3. Программируем обработчик
Примерный шаблон файла-обработчика представлен ниже:
Ключ Tags используется для описания дополнительных тегов, назначаемых в процессе обработки. Этот ключ используется в качестве информационного — для отображения в админ-панеле списка дополнительных тегов и имен шаблонов в которых они используются.
Что же мы можем сделать используя обработчики? Да почти все что угодно! Вот несколько простеньких примеров:
Основной совет начинающим разработчикам расширений для Cotonti —начните с изучения кода. Если вы хотите знать как писать плагины — посмотрите на код некоторых из них (среди них есть очень простые и понятные даже для начинающих). Если вы хотите знать как изменить поведение той или иной части — найдите код, который за нее отвечает, посмотрите где определены ближайшие точки вызова хуков и проанализируйте что происходит в этом куске кода. Cotonti написан в простой и понятной форме и код исполняется достаточно линейно, поэтому можно быстро в нем разобраться. Как только вы разберете основной алгоритм выполнения, вы с легкостью сможете менять его. Для написания более сложных плагинов вам потребуется иметь дело с несколькими хуками и обработчиками, но это уже будет не намного сложней чем начать..
В некоторых случаях вам даже не надо поробно изучать код вызова для написания своего обработчика. Как пример, можно привети добавление нескольких новых тегов в шаблон заголовка страницы или вывести какую либо информацию из БД.
#4. Расширяем собственные модули
Под модулем здесь понимается любое расширение для Cotonti. После того, как вы изучили, как работать с хуками и писать для них свой обработчик — самое время позаботится о других разработчиках, которые, возможно, захотят дополнить ваше расширение. И самый просто вариант это добавить выхов хуков в местах наиболее вероятного расширения, точно так же как это делает ядро системы:
Заменяем строку ‘ myext.hook.name ‘ на имя нашего хука (помните описанные выше правила именования? ) и почти готово. Возможно вы заметито, что данный код можно записать в одну строку, но мы рекомендуем использовать именно приведенную (6-ти строчную) форму записиruct для того, чтобы он был выделен среди прочего кода, и стороннему разработчику было проще найти точку расширения.
Несколько более громоздким выглядит код в случае, когда надо вызывать обработчик на каждом шаге цикла:
Суть кода вынести вызов функции cot_getextplugins() из цикла для ускорения выполнения скрипта.
#4.1. Списки вызова хуков
В зависимости от запрошенного на сайте URL обработка данных для вывода страницы может идти несколько разными путяни. Ниже приведен упорядоченный список вызова основных хуков, для хороктерных случаев::
Примечание: элементы списка помеченные знаком «(*)" означают, многократный последовательный взов хука. Хуки помещенные в квадратные скобки «[]" подразумевают возможный вызов, т.к. их список и конкретные имена зависят от верси ядра и набора установленных расширений. Хуки отмеченные жирным шрифтом являются системными и описаны выше.above).