beforeFilter(function (string $value, string $field): string { * // Transform before any filtering * return trim($value); * }) * ->afterFilter(function (string $value, string $field): string { * // Transform after all filtering is complete * return $value; * }) * ->transformField('username', function (string $value): string { * // Field-specific transformation * return strtolower($value); * }); * ``` * * Hook execution order: * 1. Before hooks (global, then field-specific) * 2. Standard filtering pipeline (normalize, strip, HTML, preset, filters, length) * 3. After hooks (global, then field-specific) */ class Sanitiser { /** * Default safe HTML tags for rich text fields. * These tags are considered safe for user-generated content. */ public const SAFE_HTML_TAGS = '