Creating a Custom Rule Registrar
A registrar groups rule registrations. It can add caster, transformer, sanitizer and validator rules, including application-specific names for existing rule classes. For example:
namespace App\DataProcessor;
use Derafu\DataProcessor\Contract\RuleRegistrarInterface;
use Derafu\DataProcessor\Contract\RuleRegistryInterface;
use Derafu\DataProcessor\Rule\Transformer\String\UppercaseRule;
use Derafu\DataProcessor\Rule\Validator\String\MinLengthRule;
final class CustomRuleRegistrar implements RuleRegistrarInterface
{
public function register(RuleRegistryInterface $registry): void
{
$registry->addTransformerRule('capital_letters', UppercaseRule::class);
$registry->addValidatorRule('display_name', MinLengthRule::class);
}
}
Dependency Injection
Import the package configuration and tag the registrar. Each member of the
collection has its own service ID; the composite remains registered under
RuleRegistrarInterface.
imports:
- { resource: '../vendor/derafu/data-processor/resources/config/data-processor-services.yaml' }
services:
App\DataProcessor\CustomRuleRegistrar:
tags: ['derafu_data_processor.rule_registrar']
The processor injected through ProcessorInterface can use both default and
additional rules:
$result = $processor->process('alice', [
'transform' => ['capital_letters'],
'validate' => ['required', 'display_name:3'],
]);
// 'ALICE'
DefaultRuleRegistrar has tag priority 1000; additional registrars use priority
0 unless configured otherwise. Higher priorities run first. A later registration
of the same name in the same category replaces the earlier rule. This lets a tagged
registrar override a default without discarding unrelated defaults.
Explicit Construction
Without a container, initialize a registry with the registrars you choose:
use App\DataProcessor\CustomRuleRegistrar;
use Derafu\DataProcessor\Processor;
use Derafu\DataProcessor\Registrar\CompositeRuleRegistrar;
use Derafu\DataProcessor\Registrar\DefaultRuleRegistrar;
use Derafu\DataProcessor\RuleParser;
use Derafu\DataProcessor\RuleRegistry;
use Derafu\DataProcessor\RuleResolver;
$registry = new RuleRegistry();
(new CompositeRuleRegistrar([
new DefaultRuleRegistrar(),
new CustomRuleRegistrar(),
]))->register($registry);
$processor = new Processor(new RuleResolver($registry), new RuleParser());
To use only custom rules, omit DefaultRuleRegistrar from that explicit list.
The package YAML includes defaults automatically.