key = $key; $this->action = $action; $this->paramBag = $paramBag; $this->messages = $messages; } public function validate() { $param = $this->getParamValue(); if (is_callable($this->action)) { $fn = $this->action; $message = $fn($param, $this->paramBag); if ($message !== null) { $this->addError($message); return false; } } else if (is_string($this->action)) { $repo = new ValidatorRuleCollection(); $ref = new ReflectionClass($repo); $method = $this->action; if (strpos($this->action, '|') != false) { $exp = explode('|', $this->action); $method = $exp[0]; } try { $refMethod = $ref->getMethod($method); $result = $refMethod->invokeArgs(new ValidatorRuleCollection(), [$this->key, $this->action, $param, $this->paramBag]); if (!is_null($result)) { $this->addError($result); return false; } return true; } catch (\ReflectionException $e) { return false; } } else { // defensive action return false; } return true; } public function parseMessage($messageKey) { if (array_key_exists($messageKey, $this->messages)) { return $this->messages[$messageKey]; } return $messageKey; } public function addError($message = null) { $this->errorBag = [ 'key' => $this->key, 'message' => is_null($message) ? "{$this->key} cant be empty" : $this->parseMessage($message) ]; } public function getParamValue() { if (array_key_exists($this->key, $this->paramBag)) { return $this->paramBag[$this->key]; } return null; } }