1: <?php
2:
3: /**
4: * Jyxo PHP Library
5: *
6: * LICENSE
7: *
8: * This source file is subject to the new BSD license that is bundled
9: * with this package in the file license.txt.
10: * It is also available through the world-wide-web at this URL:
11: * https://github.com/jyxo/php/blob/master/license.txt
12: */
13:
14: /**
15: * Validates a value using a custom callback or anonymous function.
16: *
17: * @category Jyxo
18: * @package Jyxo_Input
19: * @subpackage Validator
20: * @copyright Copyright (c) 2005-2011 Jyxo, s.r.o.
21: * @license https://github.com/jyxo/php/blob/master/license.txt
22: * @author Ondřej Nešpor
23: */
24: class Jyxo_Input_Validator_Callback extends Jyxo_Input_Validator_AbstractValidator
25: {
26:
27: /**
28: * Validation callback.
29: *
30: * @var string|array|Closure
31: */
32: private $callback;
33:
34: /**
35: * Additional callback parameters.
36: *
37: * @var array
38: */
39: private $additionalParams = array();
40:
41: /**
42: * Constructor.
43: *
44: * Optinally accepts additional parameters that will be used as additional callback parameters.
45: * The validated value will allways be used as the callback's first parameter.
46: *
47: * @param string|array|Closure $callback Validation callback
48: */
49: public function __construct($callback)
50: {
51: $this->setCallback($callback);
52: $this->setAdditionalParams(array_slice(func_get_args(), 1));
53: }
54:
55: /**
56: * Sets the validation callback.
57: *
58: * @param string|array|Closure $callback Validation callback
59: * @return Jyxo_Input_Validator_Callback
60: * @throws Jyxo_Input_Validator_Exception On invalid callback definition
61: */
62: public function setCallback($callback)
63: {
64: if (is_string($callback) || is_array($callback)) {
65: if (!is_callable($callback)) {
66: throw new Jyxo_Input_Validator_Exception('Invalid callback definition');
67: }
68: } elseif (!is_object($callback) || !$callback instanceof Closure) {
69: throw new Jyxo_Input_Validator_Exception('Invalid callback type; only string, array and Closure instance are allowed');
70: }
71:
72: $this->callback = $callback;
73:
74: return $this;
75: }
76:
77: /**
78: * Returns the validation callback.
79: *
80: * @return string|array|Closure
81: */
82: public function getCallback()
83: {
84: return $this->callback;
85: }
86:
87: /**
88: * Sets additional validation callback parameters.
89: *
90: * @param array $params Parameters array
91: * @return Jyxo_Input_Validator_Callback
92: */
93: public function setAdditionalParams(array $params = array())
94: {
95: $this->additionalParams = $params;
96:
97: return $this;
98: }
99:
100: /**
101: * Returns additional validation callback parameters.
102: *
103: * @return array
104: */
105: public function getAdditionalParams()
106: {
107: return $this->additionalParams;
108: }
109:
110: /**
111: * Validates a value.
112: *
113: * @param mixed $value Input value
114: * @return boolean
115: */
116: public function isValid($value)
117: {
118: $params = $this->additionalParams;
119: array_unshift($params, $value);
120: return call_user_func_array($this->callback, $params);
121: }
122:
123: }
124: