Arbit - project tracking

PHPillow - PHP CouchDB connector

Browse source code

File: / src/ classes/ validator/ object.php

Type
text/plain text/plain
Last Author
jakob
Version
170
Line Rev. Author Source
1 170 jakob <?php
2 jakob /**
3 jakob * phpillow CouchDB backend
4 jakob *
5 jakob * This file is part of phpillow.
6 jakob *
7 jakob * phpillow is free software; you can redistribute it and/or modify it under
8 jakob * the terms of the GNU Lesser General Public License as published by the Free
9 jakob * Software Foundation; version 3 of the License.
10 jakob *
11 jakob * phpillow is distributed in the hope that it will be useful, but WITHOUT ANY
12 jakob * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 jakob * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
14 jakob * more details.
15 jakob *
16 jakob * You should have received a copy of the GNU Lesser General Public License
17 jakob * along with phpillow; if not, write to the Free Software Foundation, Inc., 51
18 jakob * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 jakob *
20 jakob * @package Core
21 jakob * @version $Revision: 170 $
22 jakob * @license http://www.gnu.org/licenses/lgpl-3.0.txt LGPL
23 jakob */
24 jakob
25 jakob /**
26 jakob * Validate object inputs
27 jakob *
28 jakob * @package Core
29 jakob * @version $Revision: 170 $
30 jakob * @license http://www.gnu.org/licenses/lgpl-3.0.txt LGPL
31 jakob */
32 jakob class phpillowObjectValidator extends phpillowValidator
33 jakob {
34 jakob /**
35 jakob * Required fields of the object.
36 jakob *
37 jakob * @var array
38 jakob */
39 jakob protected $requiredFields = null;
40 jakob
41 jakob /**
42 jakob * Optional fields for the object
43 jakob *
44 jakob * @var array
45 jakob */
46 jakob protected $optionalFields = null;
47 jakob
48 jakob /**
49 jakob * Validator constructor
50 jakob *
51 jakob * Validator constructor to specify the required as well as optional fields
52 jakob * of the object, which provide validators on their own.
53 jakob *
54 jakob * Both arguments are required to be an array of field => validator
55 jakob * mappings or null to indicate there are no fields of the given type:
56 jakob *
57 jakob * <code>
58 jakob * array(
59 jakob * 'fieldname' => new phpillowNoValidator(),
60 jakob * 'another-fieldname' => new phpillowStringValidator(),
61 jakob * 'third-fieldname' => new phpillowObjectValidator( … ),
62 jakob * …
63 jakob * )
64 jakob * </code>
65 jakob *
66 jakob * ObjectValidators may contain fields with ObjectValidators themselves.
67 jakob *
68 jakob * @param array|null $requiredFields
69 jakob * @param array|null $optionalFields
70 jakob * @return void
71 jakob */
72 jakob public function __construct( array $requiredFields = null, array $optionalFields = null )
73 jakob {
74 jakob $this->requiredFields = $requiredFields === null
75 jakob ? array()
76 jakob : $requiredFields;
77 jakob
78 jakob $this->optionalFields = $optionalFields === null
79 jakob ? array()
80 jakob : $optionalFields;
81 jakob }
82 jakob
83 jakob /**
84 jakob * Validate input as object
85 jakob *
86 jakob * @param stdclass $input
87 jakob * @return StdClass
88 jakob */
89 jakob public function validate( $input )
90 jakob {
91 jakob if ( !is_object( $input ) || !( $input instanceof StdClass ) )
92 jakob {
93 jakob throw new phpillowValidationException(
94 jakob 'No object provided, where object is required.',
95 jakob array()
96 jakob );
97 jakob }
98 jakob
99 jakob /*
100 jakob * Remember which of the required fields have been seen already.
101 jakob * Initially no field has been seen
102 jakob */
103 jakob $seenFields = array_map(
104 jakob function( $validator )
105 jakob {
106 jakob return false;
107 jakob },
108 jakob $this->requiredFields
109 jakob );
110 jakob
111 jakob $fieldValidators = array_merge(
112 jakob $this->requiredFields,
113 jakob $this->optionalFields
114 jakob );
115 jakob
116 jakob foreach( $input as $field => $value )
117 jakob {
118 jakob $seenFields[$field] = true;
119 jakob
120 jakob if ( !isset( $fieldValidators[$field] ) )
121 jakob {
122 jakob throw new phpillowValidationException(
123 jakob "The field '%field' is neither required nor optional and therefore forbidden",
124 jakob array( 'field' => $field )
125 jakob );
126 jakob }
127 jakob
128 jakob // Recursively validate object fields
129 jakob $input->$field = $fieldValidators[$field]->validate( $value );
130 jakob }
131 jakob
132 jakob // Ensure all required fields have been seen
133 jakob $allSeen = array_reduce(
134 jakob $seenFields,
135 jakob function( $accumulator, $value )
136 jakob {
137 jakob return $accumulator && $value;
138 jakob },
139 jakob true
140 jakob );
141 jakob
142 jakob if ( $allSeen !== true )
143 jakob {
144 jakob throw new phpillowValidationException(
145 jakob "Not all required fields have been provided.",
146 jakob array()
147 jakob );
148 jakob }
149 jakob
150 jakob // Everything seems fine just return the provided input object
151 jakob return $input;
152 jakob }
153 jakob }