make($ruleConfig, false); } // Extract the name and parameters from the rule string $ruleInfo = self::parseRuleConfig($ruleConfig); $ruleClass = static::resolveClass(ucfirst($ruleInfo['className'])); return new $ruleClass($ruleInfo['params']); } /** * Resolve the fully qualified class name for a rule. Override this method * to resolve rules from another namespace first. * @throws \InvalidArgumentException when the rule class does not exist */ protected static function resolveClass(string $className): string { $ruleClass = self::RULES_NAMESPACE . $className; if (!class_exists($ruleClass)) { throw new \InvalidArgumentException('Validation rule "' . esc_html($ruleClass) . '" not found'); } return $ruleClass; } /** * Parse a rule string into an array with the class name and parameters * Example: "in:param1,param2" * Becomes: ['className' => 'inRule', 'params' => ['param1', 'param2']] */ protected static function parseRuleConfig(string $rule): array { $parts = explode(':', $rule, 2); return [ 'className' => $parts[0] . 'Rule', 'params' => (count($parts) > 1) ? explode(',', $parts[1]) : [], ]; } }