BZCoding/bz-contact-php

View on GitHub
app/lib/BZContact/Form/Validator.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php

namespace BZContact\Form;

use Valitron\Validator as V;

/**
 * Validator class
 *
 * A wrapper for the validator module of choice, currently Valitron
 * @see https://github.com/vlucas/valitron
 */
class Validator
{
    private $v = null;
    private $rules = [];
    private $labels = [];

    /**
     * Validates provided data
     *
     * @param array $data Array of data to validate
     * @return boolean
     */
    public function validate(array $data)
    {
        $this->v = new V($data);
        $this->buildRules();
        return $this->v->validate();
    }

    private function buildRules()
    {
        foreach ($this->rules as $ruleName => $ruleData) {
            foreach ($ruleData as $ruleDataItem) {
                $params = (!empty($ruleDataItem['params'])) ? $ruleDataItem['params'] : null;
                $r = $this->v->rule($ruleName, $ruleDataItem['field'], $params);
                if (!empty($ruleDataItem['message'])) {
                    $r->message($ruleDataItem['message']);
                }
            }
        }
        $this->v->labels($this->labels);
    }

    /**
     * Set a single validator rule
     *
     * @param string $rule Validation rule name
     * @param mixed  $fields String or array with field names
     * @return void
     */
    public function rule($rule, $fields)
    {
        if (isset($this->v)) {
            return $this->v->rule($rule, $fields);
        }
    }

    /**
     * Set batch validator rules
     *
     * @param array $rules Array of rules to use for validation
     * @return void
     */
    public function rules(array $rules)
    {
        $this->rules = $rules;
    }

    /**
     * Set validator labels for error messages
     *
     * @param array $rules Array of rules to use for validation
     * @return void
     */
    public function labels(array $labels)
    {
        $this->labels = $labels;
    }

    /**
     * Return validation error messages
     *
     * [field1 => ['Error on rule A', 'Error on rule B'], field2 => [...]]
     *
     * @return array
     */
    public function errors()
    {
        if (isset($this->v)) {
            return $this->v->errors();
        }
        return [];
    }
}