@muhasa

Как упростить добавление новых правил для Valitron?

Здравствуйте.
Есть такой симпатичный валидатор - Valitron, добавление новых правил в нем реализуется вот как:
Valitron\Validator::addRule('alwaysFail', function($field, $value, array $params, array $fields) {
        return false;
    }, 'Everything you do is wrong. You fail.');

Я не хочу засорять структуру приложения вот такими обрывками кода и хочу написать механизм, который будет перебирать набор правил из определенной папки и добавлять правила, как-то так:

class UniqueRule {
public $name;
public $message;

public function __construct($name, $message) {
$this->name = $name;
$this->message = $message;
}

public function handler(function($field, $value, array $params, array $fields) {
        return false;
    }
}


И в цикле цеплять эти файлики, брать нейм в качества имени правила, мессейдж как сообщение об ошибке и саму функцию брать из handler.
Но, конкретно как я написал - это с точки зрения ООП че-то не то. Тут явно надо как-то передавать функцию как замыкание, а здесь передача пойдет как вызов. Мне явно не хватает знаний об ООП, чтобы осилить правильную реализацию. Сообщество - помоги! :)
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
@renaay
Решени может выглядеть так:
$rules = [
    new EmailRule(),
    new UsernameRule(),
    new UniqueRule(),
    ...
];

interface RuleInterface {
    public function getKey(): string;
    public function handle(): bool;
}

/** @var RuleInterface */
foreach ($rules as $rule) {
    Valitron\Validator::addRule($rule->getKey(), function($field, $value, array $params, array $fields) use ($rule) {
        return $rule->handle($field, $value, array $params, array $fields);
    }, 'Everything you do is wrong. You fail.');
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы