Module Description
Read the blog post: A modern alternative to Hooks

Hux is a project specifically designed for developers, allowing hook implementations without needing to define a .module file or any kind of proxy class/service features.

There are a few projects out there that try to introduce an event subscriber driven way of working. Hux is an in between solution, allowing the full benefits of dependency injection and class driven logic without going fully in with events.

Hooks are implemented with classes, wherein methods tagged with attributes are used for discovery. Methods have the same parameter/return signature as original hook implementations. Discovery is automatic, requiring a cache clear for each new class added.

You can also define multiple of the same hook per module!

Requires Drupal 9.4 or later, and PHP 8.0 or later. (Drupal 9.3 users may use a patch in #2616814: Delegate all hook invocations to ModuleHandler)

Usage Examples (See README.md for more) declare(strict_types=1); namespace Drupal\my_module; use Drupal\hux\Attribute\Alter; use Drupal\hux\Attribute\Hook; use Drupal\hux\Attribute\ReplaceOriginalHook; /** * Usage examples. */ final class MyModuleHooks { #[Hook('entity_access')] public function myEntityAccess(EntityInterface $entity, string $operation, AccountInterface $account): AccessResultInterface { // A barebones implementation. return AccessResult::neutral(); } #[Hook('entity_access', priority: 100)] public function myEntityAccess2(EntityInterface $entity, string $operation, AccountInterface $account): AccessResultInterface { // You can set priority if you have multiple of the same hook! return AccessResult::neutral(); } #[Hook('entity_access', moduleName: 'a_different_module', priority: 200)] public function myEntityAccess3(EntityInterface $entity, string $operation, AccountInterface $account): AccessResultInterface { // You can masquerade as a different module! return AccessResult::neutral(); } #[ReplaceOriginalHook(hook: 'entity_access', moduleName: 'media')] public function myEntityAccess4(EntityInterface $entity, string $operation, AccountInterface $account): AccessResultInterface { // You can override hooks for other modules! E.g \media_entity_access() return AccessResult::neutral(); } #[ReplaceOriginalHook(hook: 'entity_access', moduleName: 'media')] public function myEntityAccess5(EntityInterface $entity, string $operation, AccountInterface $account, #[OriginalInvoker] callable $originalInvoker): AccessResultInterface { // If you override a hook for another module, you can have the original // implementation passed to you as a callable! $originalResult = $originalInvoker($entity, $operation, $account); // Do something... return AccessResult::neutral(); } #[Alter('user_format_name')] public function myCustomAlter(string &$name, AccountInterface $account): void { $name .= ' altered!'; } #[ Hook('entity_insert'), Hook('entity_delete'), ] public function myEntityAccess(EntityInterface $entity): void { // Associate with multiple! // Also works with Alters and Replacements. return AccessResult::neutral(); } } Github mirror project: https://github.com/dpi/hux

Tests use the new Drupal.org Gitlab Pipelines so test runs are not currently visible on the project page or in issues. Because of this, only Merge Requests are accepted. Patches are not accepted.

Similar projects


* Entity Events
* Hooks
* Hook Event Dispatcher

Versions


* 1.1.x is compatible with Drupal 9 and 10.
* 1.2.x is compatible with Drupal 10 only

Project Usage
129
Creation Date
Changed Date
Security Covered
Covered By Security Advisory
Version Available
Production
Module Summary
Hux aims to provide a modern alternative to Hooks in Drupal, allowing developers to implement hooks with classes and attributes, enabling automatic discovery and multiple hook definitions per module.
Data Name
hux

OPENAI CHATBOT

OPENAI CHATBOT

14:36:25
Generic Chatbot
Hi, I'm a Drupal module expert powered by OpenAI, answering your questions about the Drupal module ecosystem. How can I be helpful today? Please note that we will log your question.