'override.defaulted']; } // prefix override only — keeps method name as suffix #[Websocket(prefix: 'custom-prefix')] public function prefixed(): array { return ['endpoint' => 'custom-prefix.prefixed']; } // suffix override only — keeps derived prefix #[Websocket(suffix: 'custom-suffix')] public function suffixed(): array { return ['endpoint' => 'override.custom-suffix']; } // both overrides combined #[Websocket(prefix: 'pre', suffix: 'post')] public function bothOverridden(): array { return ['endpoint' => 'pre.post']; } // full event string — wins over both prefix and suffix #[Websocket(event: 'totally.custom', prefix: 'ignored', suffix: 'ignored')] public function fullOverride(): array { return ['endpoint' => 'totally.custom']; } }