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