
# 钩子

Rudel 会在沙盒生命周期事件前后触发 WordPress 操作和过滤器。下方目录是 `Rudel::hooks()` 返回的内容：28 个操作和 5 个过滤器。

## 示例

```php
add_action(
    'rudel_after_environment_create',
    function ( \Rudel\Environment $environment, array $context ): void {
        error_log( 'Created Rudel environment ' . $environment->id );
    },
    10,
    2
);
```

大多数 `before` 和 `failed` 操作都会接收一个 `$context` 数组。对于沙盒生命周期钩子，该数组包含 `environment`（创建时则包含 `name`、`options` 和 `environments_dir`）；`failed` 操作还会将捕获的 `Throwable` 作为 `$error` 接收。

## 沙盒生命周期操作

| 操作 | 参数 |
|--------|-----------|
| `rudel_before_environment_create` | `$context` |
| `rudel_after_environment_create` | `$environment`, `$context` |
| `rudel_environment_create_failed` | `$context`, `$error` |
| `rudel_before_environment_update` | `$context` |
| `rudel_after_environment_update` | `$environment`, `$context` |
| `rudel_environment_update_failed` | `$context`, `$error` |
| `rudel_before_environment_destroy` | `$context` |
| `rudel_after_environment_destroy` | `$context` |
| `rudel_environment_destroy_failed` | `$context`, `$error` |
| `rudel_before_environment_replace_state` | `$context` |
| `rudel_after_environment_replace_state` | `$result`, `$context` |
| `rudel_environment_replace_state_failed` | `$context`, `$error` |

这三个 `replace_state` 操作属于 `EnvironmentManager::replace_environment_state()`，没有任何 Rudel 命令会调用它们。

## 快照操作

| 操作 | 参数 |
|--------|-----------|
| `rudel_before_recovery_point_create` | `$context` |
| `rudel_after_recovery_point_create` | `$context`, `$meta` |
| `rudel_before_recovery_point_restore` | `$context` |
| `rudel_after_recovery_point_restore` | `$context` |
| `rudel_before_recovery_point_delete` | `$context` |
| `rudel_after_recovery_point_delete` | `$context` |

`$context`包含`environment`、`kind`（`snapshot`）、`name`和`path`。这些操作也会在`snapshot`别名下触发，例如`rudel_after_snapshot_create`；失败时会触发`rudel_failed_recovery_point_{create|restore|delete}`和`rudel_failed_snapshot_{create|restore|delete}`，并附带`$context`和错误信息。这些别名不在目录中。

## 清理操作

| 操作 | 参数 |
|--------|-----------|
| `rudel_before_environment_cleanup` | `$options` |
| `rudel_after_environment_cleanup` | `$result`, `$options` |
| `rudel_before_environment_cleanup_merged` | `$options` |
| `rudel_after_environment_cleanup_merged` | `$result`, `$options` |

`$result`包含`removed`、`skipped`、`errors`和`reasons`。

## Git推送操作

| 操作 | 参数 |
|--------|-----------|
| `rudel_before_environment_push` | `$context` |
| `rudel_after_environment_push` | `$sha`, `$context` |
| `rudel_environment_push_failed` | `$context`, `$error` |

这些操作会为`Rudel::push()`触发。`$context`包含`environment`、`remote`、`message`和`subdir`。`wp rudel push`命令会直接推送，不会触发这些操作。

## 自动化操作

| 操作 | 参数 |
|--------|-----------|
| `rudel_before_automation_cleanup` | `$config` |
| `rudel_after_automation_cleanup` | `$result`, `$config` |
| `rudel_after_automation_expiring_environments` | `$result`, `$config` |

`$config`是完整的`rudel_config`数组。请参阅[自动化](https://rudel.inline0.dev/zh/docs/features/automation)。

## 过滤器

| 过滤器 | 参数 |
|--------|-----------|
| `rudel_environment_create_options` | `$options`, `$name`, `$manager` |
| `rudel_environment_clone_source` | `$clone_source`, `$host_url`, `$db_cloned`, `$themes_cloned`, `$plugins_cloned`, `$uploads_cloned`, `$extra` |
| `rudel_environment_cleanup_options` | `$options`, `$repository` |
| `rudel_environment_cleanup_merged_options` | `$options`, `$repository` |
| `rudel_environment_db_dropin_contents` | `$contents`, `$context` |

`rudel_environment_create_options`可以在Rudel执行前更改任何创建调用的选项。`rudel_environment_clone_source`会过滤从主机创建的沙盒中存储的克隆元数据。`rudel_environment_db_dropin_contents`仅适用于多站点子站点环境使用的`db.php`替换文件；当前版本只会创建覆盖层沙盒，它们不会生成此文件。

过滤器用于调整策略，而不是替换Rudel的存储模型。运行时身份、表前缀和工作树元数据仍是由数据库支持的Rudel状态。
