← Назад к вопросам

Какие знаешь хуки?

2.0 Middle🔥 131 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Хуки в PHP-экосистеме: от WordPress до современных фреймворков

В контексте PHP под хуками (hooks) обычно понимают механизмы для внедрения пользовательского кода в определенные точки выполнения программы без модификации её исходного кода. Это реализация паттерна "Событийно-ориентированное программирование" (Event-Driven Programming) или "Наблюдатель" (Observer). Конкретная реализация сильно зависит от экосистемы.

Основные типы хуков в PHP-мире

1. WordPress Hooks (Actions & Filters)

Наиболее известная реализация благодаря популярности CMS. WordPress использует две разновидности:

Actions — выполняют код в определенный момент без возврата значения:

add_action('wp_head', 'my_custom_script');
function my_custom_script() {
    echo '<meta name="custom" content="value">';
}

Filters — изменяют передаваемые данные:

add_filter('the_title', 'modify_title');
function modify_title($title) {
    return '📌 ' . $title;
}

Ключевые функции: add_action(), do_action(), add_filter(), apply_filters().

2. Event Dispatchers в Symfony/Laravel

Современные фреймворки реализуют более структурированную систему событий:

Symfony EventDispatcher:

// Создание события
class OrderPlacedEvent extends Event
{
    public function __construct(private Order $order) {}
}

// Подписка через сервисы или атрибуты
#[AsEventListener(event: OrderPlacedEvent::class)]
class SendOrderConfirmationListener
{
    public function __invoke(OrderPlacedEvent $event): void
    {
        // Отправка email
    }
}

// Диспетчеризация
$dispatcher->dispatch(new OrderPlacedEvent($order));

Laravel Events предлагает аналогичный функционал с дополнительными возможностями:

// Генерация события
php artisan make:event OrderShipped

// Слушатель
class SendShipmentNotification
{
    public function handle(OrderShipped $event): void
    {
        $event->order->user->notify(new ShipmentNotification());
    }
}

// Регистрация в EventServiceProvider
protected $listen = [
    OrderShipped::class => [
        SendShipmentNotification::class,
    ],
];

3. Пользовательские реализации паттерна Observer

В кастомных проектах часто создают упрощенные системы:

class HookManager
{
    private array $hooks = [];
    
    public function add(string $hookName, callable $callback, int $priority = 10): void
    {
        $this->hooks[$hookName][$priority][] = $callback;
        ksort($this->hooks[$hookName]);
    }
    
    public function dispatch(string $hookName, mixed $payload = null): mixed
    {
        if (!isset($this->hooks[$hookName])) {
            return $payload;
        }
        
        foreach ($this->hooks[$hookName] as $callbacks) {
            foreach ($callbacks as $callback) {
                $payload = $callback($payload);
            }
        }
        
        return $payload;
    }
}

Ключевые аспекты работы с хуками

Приоритетность — возможность указать порядок выполнения обработчиков (например, add_action('init', 'callback', 5)).

Аргументы — передача контекстных данных в обработчики. В WordPress можно указать количество принимаемых аргументов.

Удаление хуковremove_action(), remove_filter() в WordPress или аналоги в других системах.

Производительность — хуки добавляют overhead, поэтому важны:

  • Кэширование карты хуков (WordPress использует wp-includes/plugin.php)
  • Использование более легковесных систем для высоконагруженных участков
  • Оптимальная архитектура событий (не создавать микро-события для каждого действия)

Практическое применение в Backend-разработке

  1. Расширяемость архитектуры — плагины и модули могут интегрироваться без модификации ядра
  2. AOP-подход — сквозная функциональность (логирование, кэширование, проверка прав) через хуки
  3. Декомпозиция — разделение ответственности между компонентами
  4. Тестируемость — легко подменять обработчики в тестовом окружении

Эволюция подходов

Современный тренд — переход от глобальных систем хуков (как в WordPress) к типизированным событиям на уровне предметной области (DDD-события, Event Sourcing). Например, вместо хука before_save_post создается событие PostWasCreated с четкой структурой данных.

Хуки остаются мощным инструментом, но требуют дисциплины в проектировании: без четкой стратегии система событий может превратиться в "спагетти-код", где отследить цепочку вызовов становится невозможно. В высоконагруженных системах стоит рассматривать альтернативы вроде командной шины (Command Bus) или асинхронных событий через очереди (RabbitMQ, Kafka).

Какие знаешь хуки? | PrepBro