Хуки событий¶
В предыдущей главе Урок по созданию плагина вы могли заметить, что логика нашего плагина была заключена в двух методах. Каждый из этих методов, onPluginsInitialized и onPageInitialized, соответствует хукам событий, доступным на протяжении всего жизненного цикла Grav.
Чтобы полностью использовать возможности плагинов Grav, нужно знать, какие хуки событий доступны, в каком порядке они вызываются и что доступно во время этих вызовов. Хуки событий напрямую связаны с общим жизненным циклом Grav.
Порядок событий¶
Большинство событий в Grav срабатывают в определённом порядке, и этот порядок важно понимать, если вы создаёте плагины:
- onFatalException (без определённого порядка, может произойти в любое время)
PluginsLoadedEventclass (1.7)PluginsLoadedEventclass (1.7)- onPluginsInitialized
FlexRegisterEventclass (1.7)- onThemeInitialized
- onRequestHandlerInit (1.6)
- onTask (1.6)
- onTask.{task}
- onAction (1.6)
- onAction.{action} (1.6)
- onBackupsInitialized
- onSchedulerInitialized (1.6)
- onAssetsInitialized
- onTwigTemplatePaths
- onTwigLoader
- onTwigInitialized
- onTwigExtensions
- onBuildPagesInitialized (один раз при повторной обработке страниц)
- onPageProcessed (каждая страница, ещё не закэшированная)
- onFormPageHeaderProcessed (1.6) (каждая страница, ещё не закэшированная)
- onFolderProcessed (для каждой найденной папки)
- onPagesInitialized
- onPageInitialized
- onPageContentRaw (каждая страница, ещё не закэшированная)
- onMarkdownInitialized
- onPageContentProcessed (каждая страница, ещё не закэшированная)
- onPageContent (вызывается при первом вызове Page::content(), даже если страница закэширована)
- onPageNotFound
- onPageAction (1.6)
- onPageAction.{action} (1.6)
- onPageTask (1.6)
- onPageTask.{task} (1.6)
- onTwigPageVariables (каждая страница, ещё не закэшированная)
- onHttpPostFilter (1.5.2)
- onTwigSiteVariables
- onCollectionProcessed (при запросе коллекции)
- onOutputGenerated
- onPageHeaders
- onOutputRendered
- onShutdown
Прочие события:
- onBlueprintCreated
- onTwigTemplateVariables
- onTwigStringVariables
- onBeforeDownload
- onPageFallBackUrl
- onMediaLocate
- onGetPageBlueprints
- onGetPageTemplates
- onFlexObjectRender (1.6)
- onFlexCollectionRender (1.6)
- onBeforeCacheClear
- onImageMediumSaved (ImageFile)
- onAfterCacheClear (1.7)
- onHttpPostFilter (1.7)
PermissionsRegisterEventclass (1.7)
Основные хуки событий Grav¶
Во время обработки страницы срабатывают несколько основных хуков событий Grav:
onFatalException¶
Это событие может быть вызвано в любой момент, если PHP выбрасывает фатальное исключение. Сейчас его использует плагин problems, чтобы показать список возможных причин, по которым Grav выбрасывает фатальное исключение.
onPluginsInitialized¶
Это первое доступное событие плагина. На этот момент инициализированы следующие объекты:
- Uri
- Config
- Debugger
- Cache
- Plugins
Совет
Плагин вообще не будет загружен, если для него задана опция enabled: false.
onAssetsInitialized¶
Событие означает, что менеджер ресурсов инициализирован и готов к добавлению и управлению ресурсами.
onPagesInitialized¶
Событие означает, что все страницы в папке user/pages Grav загружены как объекты и доступны в объекте Pages.
onPageNotFound¶
Это событие может быть вызвано, если ожидаемая страница не найдена. Сейчас его использует плагин error, чтобы показать красивую страницу ошибки 404.
onPageInitialized¶
Текущая страница, запрошенная по URL, загружена в объект Page.
onOutputGenerated¶
Вывод обработан шаблонизатором Twig и теперь представляет собой просто строку HTML.
onPageHeaders¶
Позволяет манипулировать объектом заголовков страницы.
onOutputRendered¶
Вывод полностью обработан и отправлен на экран.
onShutdown¶
Новое и очень мощное событие, позволяющее выполнять действия после того, как Grav завершил обработку и соединение с клиентом закрыто. Особенно полезно для действий, не требующих взаимодействия с пользователем и потенциально влияющих на производительность. Возможные применения: отслеживание пользователей и обработка заданий.
onBeforeDownload¶
Это новое событие передаёт объект события, содержащий file. Его можно использовать для логирования или для разрешения/запрета скачивания файла.
onGetPageTemplates¶
Это событие позволяет плагинам предоставлять собственные шаблоны в дополнение к шаблонам из структуры папок темы и ядра. Особенно полезно, если вы хотите, чтобы плагин предоставлял свой шаблон.
Пример
Это позволяет плагину зарегистрировать шаблон (который он может предоставлять), чтобы он появился в выпадающем списке типов шаблонов страниц (например, при редактировании страницы). В примере выше добавляется тип шаблона downloads, поскольку в папке downloads есть файл downloads.html.twig.

onGetPageBlueprints¶
Это событие, как и onGetPageTemplates, позволяет плагину предоставлять собственные ресурсы в дополнение к ресурсам ядра и темы. В данном случае — схемы.
Пример
В этом примере мы используем оба хука, onGetPageTemplates и onGetPageBlueprints, чтобы сделать эти предоставляемые плагином ресурсы (шаблоны и схемы) доступными Grav для наследования и других целей.
Хуки событий Twig¶
У Twig есть собственный набор хуков событий.
onTwigTemplatePaths¶
Базовые расположения путей к шаблонам заданы в объекте Twig. Если нужно добавить другие места, где Twig будет искать пути к шаблонам, используйте это событие.
Пример
onTwigInitialized¶
На этот момент шаблонизатор Twig инициализирован.
onTwigExtensions¶
Основные расширения Twig загружены, но если нужно добавить собственное расширение Twig, это можно сделать с помощью этого хука.
onTwigPageVariables¶
Когда Twig обрабатывает страницу напрямую, то есть когда в YAML-заголовках страницы задано process: twig: true. Здесь следует добавлять в Twig переменные, которые должны быть доступны Twig во время этой обработки.
onTwigSiteVariables¶
Когда Twig обрабатывает всю иерархию шаблонов сайта. Здесь следует добавлять в Twig переменные, которые должны быть доступны Twig во время этой обработки.
onBuildTwigSandboxPolicy (2.0)¶
Срабатывает, когда Grav строит политику песочницы для контента Twig. Twig, написанный редактором в контенте страницы, выполняется внутри этой песочницы (файлы шаблонов темы и плагинов на диске считаются доверенными и никогда не помещаются в песочницу). Если ваш плагин предоставляет функцию, фильтр, тег, метод или свойство Twig, которые авторы должны вызывать из контента страницы, разрешите их здесь, иначе песочница заблокирует их.
Событие передаёт те же списки разрешений, что используются в security.yaml: плоские списки для tags, filters и functions, а также список строк class/methods для methods и properties. Добавляйте в нужный список способом чтения-изменения-записи (аргументы возвращаются по значению). Оно срабатывает только при построении политики, один раз за запрос, и кэшируется, поэтому затрат на каждый рендер нет.
Разрешайте только те члены, которые безопасно выполнять в отношении контента, созданного любым пользователем с правом редактирования страниц. Регистрация члена здесь — то же решение о доверии, что и его изначальное предоставление.
Пример
Хуки событий коллекций¶
onCollectionProcessed¶
Если нужно манипулировать коллекцией после её обработки, это подходящий момент.
Хуки событий страниц¶
onBuildPagesInitialized¶
Событие срабатывает один раз, когда страницы собираются для повторной обработки. Обычно это происходит, если кэш истёк или требует обновления. Полезное событие для плагинов, которым нужно манипулировать контентом и кэшировать результаты.
onBlueprintCreated¶
Используется для обработки и работы с формами.
onPageContentRaw¶
После того как страница найдена и заголовки обработаны, но контент не обработан. Срабатывает для каждой страницы в системе Grav. Производительность не страдает, потому что событие не выполняется для закэшированной страницы — только при очистке кэша или событии, очищающем кэш.
onPageProcessed¶
После того как страница разобрана и обработана. Срабатывает для каждой страницы в системе Grav. Производительность не страдает, потому что событие не выполняется для закэшированной страницы — только при очистке кэша или событии, очищающем кэш.
onMarkdownInitialized¶
Вызывается после инициализации Markdown. Позволяет переопределить стандартную реализацию обработки Parsedown. См. пример использования в PR, где это было добавлено.
onPageContentProcessed¶
Событие срабатывает после того, как метод страницы content() обработал контент. Особенно полезно, если нужно выполнить действия с постобработанным контентом, но гарантировать кэширование результатов. Производительность не страдает, потому что событие не выполняется для закэшированной страницы — только при очистке кэша или событии, очищающем кэш.
onFolderProcessed¶
После того как папка разобрана и обработана. Срабатывает для каждой папки в системе Grav. Производительность не страдает, потому что событие не выполняется для закэшированной страницы — только при очистке кэша или событии, очищающем кэш.
onPageFallBackUrl¶
Если маршрут не распознан как страница, Grav пытается получить доступ к медиаресурсу страницы. Событие срабатывает сразу в начале процедуры, чтобы плагины могли подключиться и предоставить дополнительную функциональность.
onMediaLocate¶
Добавляет поддержку пользовательских расположений медиафайлов для отрывков.
onTwigLoader¶
Добавляет поддержку использования пространств имён вместе с двумя новыми методами класса Twig: Twig::addPath($path, $namespace) и Twig::prependPath($path, $namespace).