/** * @param string|array $field * @param mixed $value * @param callable|null $callback * * @return mixed */ public function validate($field, $value, callable $callback = null) { $key = $field; if (is_array($field)) { $key = key($field); $field = current($field); } if ($callback !== null) { $value = $callback($value); } while (!empty($this->stack)) { $item = array_shift($this->stack); if (false === ($validator = $this->collection->get($item['name']))) { throw new \RuntimeException('Unknown validator `' . $item['name'] . '`'); } $arguments = $validator->getFormattedArgs($item['arguments']); if ($validator->validate($value, $arguments)) { continue; } if (!isset($arguments['field'])) { $arguments['field'] = $field; } if (!isset($arguments['value'])) { $arguments['value'] = is_array($value) ? var_export($value, true) : $value; } $this->stack = array(); $error = isset($item['error']) ? $item['error'] : $validator->getError(); $this->errors[$key] = $this->placeholder->replace($error, $arguments); break; } return $value; }