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.


Last updated on 30/10/2026 by Anonymous